Загружаю, вернее пытаюсь загрузить драйвер через ZwLoadDriver, ничего не получается. При отладке видно, что ZwLoadDriver возвращает STATUS_OBJECT_NAME_INVALID. В чем проблема? Через SMC драйвер успешно пускается. Система WinXP SP2. Код (Text): #include <windows.h> typedef struct _UNICODE_STRING { USHORT Length; USHORT MaximumLength; PWSTR Buffer; } UNICODE_STRING, *PUNICODE_STRING; int main(int argc, char *argv[]) { DWORD (*ZwLoadDriver)(PUNICODE_STRING); VOID (*RtlInitUnicodeString)(PUNICODE_STRING, char*); FARPROC proc; UNICODE_STRING ustr; char str[]={ '\\','\0','R','\0','e','\0','g','\0','i','\0','s','\0','t','\0','r','\0','y','\0', '\\','\0','M','\0','a','\0','c','\0','h','\0','i','\0','n','\0','e','\0', '\\','\0','S','\0','y','\0','s','\0','t','\0','e','\0','m','\0', '\\','\0','C','\0','u','\0','r','\0','r','\0','e','\0','n','\0','t','\0','C','\0','o','\0','n','\0','t','\0','r','\0','o','\0','l','\0','S','\0','e','\0','t','\0', '\\','\0','S','\0','e','\0','r','\0','v','\0','i','\0','c','\0','e','\0','s','\0', '\\','\0','d','\0','r','\0','v','\0','\0','\0' }; char image[MAX_PATH]; HMODULE ntdll=GetModuleHandle("ntdll.dll"); proc=GetProcAddress(ntdll, "ZwLoadDriver"); ZwLoadDriver=(DWORD(*)(PUNICODE_STRING))proc; proc=GetProcAddress(ntdll, "RtlInitUnicodeString"); RtlInitUnicodeString=(VOID(*)(PUNICODE_STRING, char*))proc; lstrcpy(image, "\\??\\"); GetFullPathName("drv.sys", sizeof(image), image+4, NULL); HKEY key, subkey; DWORD type=1; RegOpenKey(HKEY_LOCAL_MACHINE, "System\\CurrentControlSet\\Services", &key); RegCreateKey(key, "drv", &subkey); RegSetValueEx(subkey, "ImagePath", 0, REG_SZ, (LPBYTE)image, strlen(image)); RegSetValueEx(subkey, "Type", 0, REG_DWORD, (LPBYTE)&type, sizeof(type)); RegCloseKey(subkey); RegCloseKey(key); RtlInitUnicodeString(&ustr, str); ZwLoadDriver(&ustr); return 0; }
Код (Text): char str[]={ '\\','\0','R','\0','e','\0','g','\0','i','\0','s','\0','t','\0','r','\0','y','\0', '\\','\0','M','\0','a','\0','c','\0','h','\0','i','\0','n','\0','e','\0', '\\','\0','S','\0','y','\0','s','\0','t','\0','e','\0','m','\0', '\\','\0','C','\0','u','\0','r','\0','r','\0','e','\0','n','\0','t','\0','C','\0','o','\0','n','\0','t','\0','r','\0','o','\0','l','\0','S','\0','e','\0','t','\0', '\\','\0','S','\0','e','\0','r','\0','v','\0','i','\0','c','\0','e','\0','s','\0', '\\','\0','d','\0','r','\0','v','\0','\0','\0' }; Видимо, это не по дзенски. Надо так: Код (Text): char str[]={5C,5C,5C,30,52,5C,30,65,5C,30,67,5C,30,69,5C,30, 73,5C,30,74,5C,30,72,5C,30,79,5C,30,0D,0A,5C,5C, 5C,30,4D,5C,30,61,5C,30,63,5C,30,68,5C,30,69,5C, 30,6E,5C,30,65,5C,30,0D,0A,5C,5C,5C,30,53,5C,30, 79,5C,30,73,5C,30,74,5C,30,65,5C,30,6D,5C,30,0D, 0A,5C,5C,5C,30,43,5C,30,75,5C,30,72,5C,30,72,5C, 30,65,5C,30,6E,5C,30,74,5C,30,43,5C,30,6F,5C,30, 6E,5C,30,74,5C,30,72,5C,30,6F,5C,30,6C,5C,30,53, 5C,30,65,5C,30,74,5C,30,0D,0A,5C,5C,5C,30,53,5C, 30,65,5C,30,72,5C,30,76,5C,30,69,5C,30,63,5C,30, 65,5C,30,73,5C,30,0D,0A,5C,5C,5C,30,64,5C,30,72, 5C,30,76,5C,30,5C,30,5C,30}
Aspire Юзал старый компилятор, там с юникодом проблема. В отладчике смотрел, строка получилась правильная.
Код (Text): void ansi_to_unicode(unsigned short* to, char* from) { MultiByteToWideChar(CP_ACP,0,from,-1,to,MAX_PATH * 2); } void get_file_name(char* file_name, char* path) { lstrcpyn(file_name,StrRChrI(path,NULL,'\\') + 1,StrRChrI(path,NULL,'.') - StrRChrI(path,NULL,'\\')); } unsigned long install_driver(char* driver_path) { HKEY hKey = 0, hKey2 = 0; unsigned long load_flag = 0, load_driver_result, Type; BOOLEAN bWasEnabled; UNICODE_STRING driver_path_unicode; char driver_path2 [MAX_PATH]; char registry_driver_path_new[MAX_PATH]; unsigned short unicode_buff [MAX_PATH]; char driver_name [MAX_PATH]; get_file_name((char*)driver_name,driver_path); do { if (RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SOFTWARE",0,KEY_ALL_ACCESS,&hKey)) break; SHDeleteKey(hKey,driver_name); if (RegCreateKeyEx(hKey,driver_name,0,0,0,KEY_ALL_ACCESS,0,&hKey2,0)) break; RtlAdjustPrivilege = (ULONG (NTAPI*)(IN ULONG,IN BOOLEAN,IN BOOLEAN,OUT PBOOLEAN))GetProcAddress(GetModuleHandle("ntdll.dll"),"RtlAdjustPrivilege"); if (!RtlAdjustPrivilege) break; if (RtlAdjustPrivilege(SE_DEBUG_PRIVILEGE,TRUE,FALSE,&bWasEnabled)) break; lstrcpy(driver_path2,"\\??\\"); lstrcat(driver_path2,driver_path); if (RegSetValueEx(hKey2,"ImagePath",0,REG_SZ,(const unsigned char*)driver_path2,lstrlen(driver_path2))) break; Type = 1; if (RegSetValueEx(hKey2,"Type",0,REG_DWORD,(const unsigned char*)&Type,4)) break; CloseHandle(hKey); CloseHandle(hKey2); hKey2 = hKey = 0; lstrcpy(registry_driver_path_new,"\\REGISTRY\\MACHINE\\SOFTWARE\\"); lstrcat(registry_driver_path_new,driver_name); ansi_to_unicode(unicode_buffer,registry_driver_path_new); driver_path_unicode.Buffer = unicode_buffer; driver_path_unicode.MaximumLength = MAX_PATH * 2; driver_path_unicode.Length = lstrlenW(unicode_buffer) * 2; ZwLoadDriver = (ULONG (NTAPI*)(IN PUNICODE_STRING))GetProcAddress(GetModuleHandle("ntdll.dll"),"ZwLoadDriver"); if (!ZwLoadDriver) break; load_driver_result = ZwLoadDriver(&driver_path_unicode); SHDeleteKey(hKey,driver_name); if ( !load_driver_result || load_driver_result == 0xC0000182 ) load_flag = 1; } while(0); if (hKey) CloseHandle(hKey); if (hKey2) CloseHandle(hKey2); return load_flag; }