Проблема с загрузкой драйвера

Тема в разделе "WASM.BEGINNERS", создана пользователем HH9, 17 мар 2009.

  1. HH9

    HH9 New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2007
    Сообщения:
    72
    Загружаю, вернее пытаюсь загрузить драйвер через ZwLoadDriver, ничего не получается.
    При отладке видно, что ZwLoadDriver возвращает STATUS_OBJECT_NAME_INVALID.
    В чем проблема? Через SMC драйвер успешно пускается. Система WinXP SP2.

    Код (Text):
    1. #include <windows.h>
    2.  
    3. typedef struct _UNICODE_STRING {
    4.   USHORT  Length;
    5.   USHORT  MaximumLength;
    6.   PWSTR  Buffer;
    7. } UNICODE_STRING, *PUNICODE_STRING;
    8.  
    9.  
    10. int main(int argc, char *argv[]) {
    11.  
    12.     DWORD (*ZwLoadDriver)(PUNICODE_STRING);
    13.     VOID (*RtlInitUnicodeString)(PUNICODE_STRING, char*);
    14.  
    15.     FARPROC proc;
    16.  
    17.     UNICODE_STRING ustr;
    18.     char str[]={
    19. '\\','\0','R','\0','e','\0','g','\0','i','\0','s','\0','t','\0','r','\0','y','\0',
    20. '\\','\0','M','\0','a','\0','c','\0','h','\0','i','\0','n','\0','e','\0',
    21. '\\','\0','S','\0','y','\0','s','\0','t','\0','e','\0','m','\0',
    22. '\\','\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',
    23. '\\','\0','S','\0','e','\0','r','\0','v','\0','i','\0','c','\0','e','\0','s','\0',
    24. '\\','\0','d','\0','r','\0','v','\0','\0','\0'
    25. };
    26.  
    27.     char image[MAX_PATH];
    28.  
    29.     HMODULE ntdll=GetModuleHandle("ntdll.dll");
    30.  
    31.     proc=GetProcAddress(ntdll, "ZwLoadDriver");
    32.  
    33.     ZwLoadDriver=(DWORD(*)(PUNICODE_STRING))proc;
    34.  
    35.     proc=GetProcAddress(ntdll, "RtlInitUnicodeString");
    36.  
    37.     RtlInitUnicodeString=(VOID(*)(PUNICODE_STRING, char*))proc;
    38.  
    39.     lstrcpy(image, "\\??\\");
    40.  
    41.     GetFullPathName("drv.sys", sizeof(image), image+4, NULL);
    42.  
    43.     HKEY key, subkey;
    44.     DWORD type=1;
    45.  
    46.     RegOpenKey(HKEY_LOCAL_MACHINE, "System\\CurrentControlSet\\Services", &key);
    47.     RegCreateKey(key, "drv", &subkey);
    48.     RegSetValueEx(subkey, "ImagePath", 0, REG_SZ, (LPBYTE)image, strlen(image));
    49.     RegSetValueEx(subkey, "Type", 0, REG_DWORD, (LPBYTE)&type, sizeof(type));
    50.     RegCloseKey(subkey);
    51.     RegCloseKey(key);
    52.  
    53.     RtlInitUnicodeString(&ustr, str);
    54.  
    55.     ZwLoadDriver(&ustr);
    56.    
    57.     return 0;
    58. }
     
  2. z0mailbox

    z0mailbox z0

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    635
    Адрес:
    Russia СПБ
    а GetFullPathName отрабатывает? что в результате в реестре в ImagePath?
     
  3. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    Код (Text):
    1. char str[]={
    2. '\\','\0','R','\0','e','\0','g','\0','i','\0','s','\0','t','\0','r','\0','y','\0',
    3. '\\','\0','M','\0','a','\0','c','\0','h','\0','i','\0','n','\0','e','\0',
    4. '\\','\0','S','\0','y','\0','s','\0','t','\0','e','\0','m','\0',
    5. '\\','\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',
    6. '\\','\0','S','\0','e','\0','r','\0','v','\0','i','\0','c','\0','e','\0','s','\0',
    7. '\\','\0','d','\0','r','\0','v','\0','\0','\0'
    8. };
    Видимо, это не по дзенски. Надо так:
    Код (Text):
    1. char str[]={5C,5C,5C,30,52,5C,30,65,5C,30,67,5C,30,69,5C,30,
    2. 73,5C,30,74,5C,30,72,5C,30,79,5C,30,0D,0A,5C,5C,
    3. 5C,30,4D,5C,30,61,5C,30,63,5C,30,68,5C,30,69,5C,
    4. 30,6E,5C,30,65,5C,30,0D,0A,5C,5C,5C,30,53,5C,30,
    5. 79,5C,30,73,5C,30,74,5C,30,65,5C,30,6D,5C,30,0D,
    6. 0A,5C,5C,5C,30,43,5C,30,75,5C,30,72,5C,30,72,5C,
    7. 30,65,5C,30,6E,5C,30,74,5C,30,43,5C,30,6F,5C,30,
    8. 6E,5C,30,74,5C,30,72,5C,30,6F,5C,30,6C,5C,30,53,
    9. 5C,30,65,5C,30,74,5C,30,0D,0A,5C,5C,5C,30,53,5C,
    10. 30,65,5C,30,72,5C,30,76,5C,30,69,5C,30,63,5C,30,
    11. 65,5C,30,73,5C,30,0D,0A,5C,5C,5C,30,64,5C,30,72,
    12. 5C,30,76,5C,30,5C,30,5C,30}
     
  4. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    ксором его, ксором.
     
  5. HH9

    HH9 New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2007
    Сообщения:
    72
    Отрабатывает.
    В реестре значение правильное.
     
  6. HH9

    HH9 New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2007
    Сообщения:
    72
    Aspire
    Юзал старый компилятор, там с юникодом проблема.
    В отладчике смотрел, строка получилась правильная.
     
  7. BlackParrot

    BlackParrot New Member

    Публикаций:
    0
    Регистрация:
    19 фев 2009
    Сообщения:
    163
    Код (Text):
    1. void ansi_to_unicode(unsigned short* to, char* from)
    2. {
    3.  
    4.     MultiByteToWideChar(CP_ACP,0,from,-1,to,MAX_PATH * 2);
    5.    
    6. }
    7.  
    8. void get_file_name(char* file_name, char* path)
    9. {
    10.  
    11.     lstrcpyn(file_name,StrRChrI(path,NULL,'\\') + 1,StrRChrI(path,NULL,'.') - StrRChrI(path,NULL,'\\'));
    12.  
    13. }
    14.  
    15. unsigned long install_driver(char* driver_path)
    16. {
    17.  
    18.     HKEY            hKey = 0, hKey2 = 0;
    19.     unsigned long   load_flag = 0, load_driver_result, Type;
    20.     BOOLEAN     bWasEnabled;
    21.     UNICODE_STRING  driver_path_unicode;
    22.     char            driver_path2          [MAX_PATH];  
    23.     char            registry_driver_path_new[MAX_PATH];
    24.     unsigned short  unicode_buff              [MAX_PATH];
    25.     char            driver_name       [MAX_PATH];
    26.  
    27.     get_file_name((char*)driver_name,driver_path);
    28.  
    29.     do
    30.     {
    31.  
    32.         if (RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SOFTWARE",0,KEY_ALL_ACCESS,&hKey)) break;
    33.  
    34.         SHDeleteKey(hKey,driver_name);
    35.  
    36.         if (RegCreateKeyEx(hKey,driver_name,0,0,0,KEY_ALL_ACCESS,0,&hKey2,0)) break;
    37.  
    38.         RtlAdjustPrivilege = (ULONG (NTAPI*)(IN ULONG,IN BOOLEAN,IN BOOLEAN,OUT PBOOLEAN))GetProcAddress(GetModuleHandle("ntdll.dll"),"RtlAdjustPrivilege");
    39.         if (!RtlAdjustPrivilege) break;
    40.  
    41.         if (RtlAdjustPrivilege(SE_DEBUG_PRIVILEGE,TRUE,FALSE,&bWasEnabled)) break;
    42.  
    43.         lstrcpy(driver_path2,"\\??\\");
    44.         lstrcat(driver_path2,driver_path);
    45.  
    46.         if (RegSetValueEx(hKey2,"ImagePath",0,REG_SZ,(const unsigned char*)driver_path2,lstrlen(driver_path2))) break;
    47.  
    48.         Type = 1;
    49.  
    50.         if (RegSetValueEx(hKey2,"Type",0,REG_DWORD,(const unsigned char*)&Type,4)) break;
    51.  
    52.         CloseHandle(hKey);
    53.         CloseHandle(hKey2);
    54.         hKey2 = hKey = 0;
    55.  
    56.         lstrcpy(registry_driver_path_new,"\\REGISTRY\\MACHINE\\SOFTWARE\\");
    57.         lstrcat(registry_driver_path_new,driver_name);
    58.  
    59.         ansi_to_unicode(unicode_buffer,registry_driver_path_new);
    60.  
    61.         driver_path_unicode.Buffer          = unicode_buffer;
    62.         driver_path_unicode.MaximumLength   = MAX_PATH * 2;
    63.         driver_path_unicode.Length          = lstrlenW(unicode_buffer) * 2;
    64.  
    65.         ZwLoadDriver = (ULONG (NTAPI*)(IN PUNICODE_STRING))GetProcAddress(GetModuleHandle("ntdll.dll"),"ZwLoadDriver");
    66.         if (!ZwLoadDriver) break;
    67.  
    68.         load_driver_result = ZwLoadDriver(&driver_path_unicode);
    69.        
    70.         SHDeleteKey(hKey,driver_name);
    71.  
    72.         if (
    73.             !load_driver_result ||
    74.                 load_driver_result == 0xC0000182
    75.             )
    76.         load_flag = 1;
    77.  
    78.     } while(0);
    79.  
    80.     if (hKey)  CloseHandle(hKey);
    81.     if (hKey2) CloseHandle(hKey2);
    82.  
    83.     return load_flag;
    84.    
    85. }