Очередная проблема с ZwLoadDriver

Тема в разделе "WASM.NT.KERNEL", создана пользователем Namelles_One, 23 янв 2010.

  1. Namelles_One

    Namelles_One New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2007
    Сообщения:
    39
    Вот мой код - http://www.everfall.com/paste/id.php?tjzx37aotyww

    Ошибка - STATUS_OBJECT_NAME_NOT_FOUND (0xC0000034)

    Файл существует, сомнению не подлежит.

    Такая проблема на Васме уже поднималась, но решения не воспоследовало - http://www.wasm.ru/forum/viewtopic.php?id=35356

    Может быть мне повезет с коллективным разумом?
     
  2. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    В приведённом коде функция GetFullPathNameW() может некорректно отработать из-за второго параметра, значение которого по факту случайно. Для исправления ошибки следует заменить lstrlenW(acDriverPath) на sizeof(acDriverPath)/sizeof(WCHAR).
     
  3. Namelles_One

    Namelles_One New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2007
    Сообщения:
    39
    Если выполнить данную замену - ошибка меняется на STATUS_OBJECT_NAME_INVALID (0xC0000033)

    Что, собссно, не вносит никакой ясности в происходящее.
     
  4. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Так какой в итоге путь-то в acRegistryPath записывается?
     
  5. Namelles_One

    Namelles_One New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2007
    Сообщения:
    39
    в моем случае - \??\C:\bla.sys с нулевым WCHAR на конце.
    в твоем - \??\C:\bla.sys с нулевыми WCHAR в большом количестве (полагаю - их столько, чтобы заполнить весь массив).

    Вот, соббсно, ошибки и разнятся.
     
  6. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Для функции lstrlenW(), которую ты используешь при записи пути в реестр, нет никакой разницы, один там ноль на конце или много, потому что длина считается до первого же встречного нуля, остальные роли не играют. Кстати, а система какая? Windows XP?
     
  7. Namelles_One

    Namelles_One New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2007
    Сообщения:
    39
    тестил на XP и на 7 - результат одинаковый, к сожалению.
     
  8. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Хорошо, скинь мне бинарники (.exe и .sys) на почту и напиши краткую инструкцию, какие файлы куда положить. Запускать .exe, я так понимаю? Гляну на досуге, отпишусь если что. Честно говоря, самому интересно, я вообще этот способ запуска драйверов не использую, но вижу, что проблема возникает регулярно. Посмотрим, может даже в блоге отпишу.
     
  9. RET

    RET Well-Known Member

    Публикаций:
    17
    Регистрация:
    5 янв 2008
    Сообщения:
    789
    Адрес:
    Jabber: darksys@sj.ms
    У меня в нативе отлично работает так примерно:
    Код (Text):
    1. const WCHAR reg[]=L"\\registry\\machine\\SYSTEM\\CurrentControlSet\\Services\\";
    2. ///////////////////////////////////ОТКРЫТИЕ ФАЙЛА ДРАЙВЕРА и загрузка////////////////////////////////////////////
    3. DWORD WINAPI LoadDriver(LPVOID)
    4. {
    5.     WCHAR strInjDll[MAX_PATH*2*sizeof(WCHAR)]={0};
    6.     static OPENFILENAMEW of;
    7.     of.lStructSize=OPENFILENAME_SIZE_VERSION_400A;
    8.     of.hwndOwner=HWMain;
    9.     of.hInstance=hcm;
    10.     of.lpstrCustomFilter=NULL;
    11.     of.lpstrFilter=L"Driver files (*.sys)\0*.sys\0";
    12.     of.nMaxCustFilter=0;
    13.     of.nFilterIndex=1;
    14.     of.nMaxFile=MAX_PATH*2;
    15.     of.lpstrFile=strInjDll;
    16.     of.Flags=OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST|OFN_HIDEREADONLY;
    17.     of.lpstrInitialDir=NULL;
    18.     of.lpstrFileTitle=NULL;
    19.     of.nMaxFileTitle=0;
    20.     of.lpstrTitle =L"Select Driver for Load. Copyright©2009 HiEndSoft (hiendsoft@mail.ru)";
    21.     if(GetOpenFileNameW(&of))
    22.     {
    23.         UNICODE_STRING us;
    24.         WCHAR* drivn=wcsrchr(strInjDll,'\\')+1;
    25.         WCHAR* dot=wcsrchr(strInjDll,'.');
    26.         WCHAR serv[MAX_PATH];
    27.         wcscpy(serv,drivn);
    28.         serv[dot-drivn]=0;
    29.         WCHAR regp[MAX_PATH*20]={0};
    30.         wcscpy(regp,reg);
    31.         wcscat(regp,serv);
    32.         RtlInitUnicodeString(&us,regp);
    33.         OBJECT_ATTRIBUTES OA;
    34.         UNICODE_STRING ValueName,nPath;
    35.         ULONG Disposition;
    36.         HANDLE KeyHandle;
    37.         RtlInitUnicodeString(&ValueName,regp);
    38.         InitializeObjectAttributes(&OA, &ValueName,OBJ_CASE_INSENSITIVE,NULL,NULL);
    39.         if(NT_SUCCESS(NtCreateKey(&KeyHandle,KEY_ALL_ACCESS,&OA,0,NULL,REG_OPTION_NON_VOLATILE,&Disposition )))
    40.         {
    41.             RtlInitUnicodeString(&ValueName,L"ImagePath");
    42.             RtlDosPathNameToNtPathName_U(strInjDll,&nPath,NULL,NULL);
    43.             //MessageBoxW(NULL,nPath.Buffer,strInjDll,0);
    44.             if(NT_SUCCESS(NtSetValueKey(KeyHandle,&ValueName,0,REG_EXPAND_SZ,nPath.Buffer,nPath.Length+sizeof(WCHAR))))
    45.             {
    46.                 RtlInitUnicodeString(&ValueName,L"Type");
    47.                 DWORD type=1;
    48.                 if(NT_SUCCESS(NtSetValueKey(KeyHandle,&ValueName,0,REG_DWORD,&type,sizeof(DWORD))))
    49.                 {
    50.                     NtClose(KeyHandle);
    51.                     NTSTATUS st;
    52.                     st=NtLoadDriver(&us);
    53.                     if(NT_SUCCESS(st))
    54.                     {
    55.                         Beep(2500,20);
    56.                     }
    57.                     else
    58.                     {
    59.                         ResetError(st,"Error:NtLoadDriver");
    60.                     }
    61.                     return 0;
    62.                 } else ResetError(0,"Error:NtSetValueKey (subkey)");
    63.             } else ResetError(0,"Error:NtSetValueKey");
    64.             NtClose(KeyHandle);
    65.         } else ResetError(0,"Error:NtCreateKey");
    66.     }
    67. return 0;
    68. }
     
  10. Namelles_One

    Namelles_One New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2007
    Сообщения:
    39
    Таки вот, проблема путем долгих поисков решена.

    Вот - окончательно работающий код - http://www.everfall.com/paste/id.php?tjzx37aotyww

    Была неочевидная и, как выяснилось, офигенно трудно локализуемая ошибка в вызове GetFullPathNameW.

    Всем спасибо за внимание.
     
  11. n0name

    n0name New Member

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

    Namelles_One New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2007
    Сообщения:
    39
    n0name
    Факт, тем не менее, конкретно этой ошибкой дело не ограничивалось, да и вариант, предложенный во втором посте не принес желаемого удовлетворения.

    Таки тему можно прикрыть, пускай остается в назидании будущим поколениям (этот вопрос, как показывает поиск, поднимался на форуме много раз, но первый раз - доведен до решения).