Родные приложения Николай «gorl» Андреев Хакер, номер #082, стр. 082-114-6 Другой вариант – это написать небольшой код специально для регистрации нашего приложения. У меня на это нехитрое дело ушло 5 минут. BOOL RegistryAdd(PSTR szAppName) { char szRegEntry[1024]; DWORD dwBytes = 1024; BOOL ret = FALSE; HKEY hk; char szKeyPath = "SYSTEM\\CurrentControlSet\\Control\\Session Manager"; // открываем ключик if (RegCreateKey(HKEY_LOCAL_MACHINE, szKeyPath, &hk) != ERROR_SUCCESS) return 0; // скидываем все данные в буфер if(RegQueryValueEx(hk, "BootExecute", 0,0, (LPBYTE)szRegEntry, &dwBytes)) szRegEntry[0] = 0; // добавляем к буферу свою строчку lstrcat(&szRegEntry[dwBytes-1], szAppName); if (RegSetValueEx(hk, "BootExecute", 0, REG_MULTI_SZ, (LPBYTE) szRegEntry, dwBytes + lstrlen(szAppName) + 1)) goto finally; ret = TRUE; finally: { // закрываем ключик if (hk) RegCloseKey(hk); } return ret; } [оригинальный helloworld] /* Немного измененный мной код Марка Руссиновича, копирующий параметры запуска в кучу и выводящий их на экран. Может быть полезен для улучшения понимания работы с кучей и строками с помощью native API. */ #pragma comment(linker, "/SUBSYSTEM:NATIVE") #pragma comment(linker, "/ENTRY:native_main") #pragma comment(lib, "ntdll.lib") #pragma comment(linker,"/BASE:0x00010000") #define _X86_ #include #include #include "nt.h" typedef struct { ULONG Unknown[21]; UNICODE_STRING CommandLine; UNICODE_STRING ImageFile; } ENVIRONMENT_INFORMATION, *PENVIRONMENT_INFORMATION; typedef struct { ULONG Unknown[3]; PENVIRONMENT_INFORMATION Environment; } STARTUP_ARGUMENT, *PSTARTUP_ARGUMENT; typedef struct { ULONG Length; ULONG Unknown[11]; } RTL_HEAP_DEFINITION, *PRTL_HEAP_DEFINITION; void native_main(PSTARTUP_ARGUMENT Argument) { PUNICODE_STRING commandLine; PWCHAR stringBuffer, argPtr; UNICODE_STRING helloWorld; RTL_HEAP_DEFINITION heapParams; memset(&heapParams, 0, sizeof(RTL_HEAP_DEFINITION)); heapParams.Length = sizeof( RTL_HEAP_DEFINITION); Heap = RtlCreateHeap(2, 0, 0x100000, 0x1000, 0, &heapParams); commandLine = &Argument->gt;Environment->gt;CommandLine; argPtr = commandLine->gt;Buffer; while( *argPtr != L' ' ) argPtr++; argPtr++; stringBuffer = RtlAllocateHeap( Heap, 0, 256 ); swprintf(stringBuffer, L"\n%s", argPtr); helloWorld.Buffer = stringBuffer; helloWorld.Length = wcslen(stringBuffer) * sizeof(WCHAR); helloWorld.MaximumLength = helloWorld.Length + sizeof(WCHAR); NtDisplayString(&helloWorld); RtlFreeHeap(Heap, 0, stringBuffer); NtTerminateProcess(NtCurrentProcess(), 0); } WWW На английском языке о разработке native-приложений ты можешь прочесть на www.sysinternals.com в статье «Inside Native Applications», датированной аж 98ым годом. INFO Чтобы реализовать ввод данных с клавиатуры в нашем приложении придется уже поизвращаться: открыть NtCreateFile’ом драйвер клавиатуры (\\Device\\KeyboardClass), привязать к нему NtCreateEvent’ом событие и т.д. и т.п. – механизм всего этого дела тебе придется изучать самому, уродуя дизассемблером autochk.exe. |