Вот мой код - http://www.everfall.com/paste/id.php?tjzx37aotyww Ошибка - STATUS_OBJECT_NAME_NOT_FOUND (0xC0000034) Файл существует, сомнению не подлежит. Такая проблема на Васме уже поднималась, но решения не воспоследовало - http://www.wasm.ru/forum/viewtopic.php?id=35356 Может быть мне повезет с коллективным разумом?
В приведённом коде функция GetFullPathNameW() может некорректно отработать из-за второго параметра, значение которого по факту случайно. Для исправления ошибки следует заменить lstrlenW(acDriverPath) на sizeof(acDriverPath)/sizeof(WCHAR).
Если выполнить данную замену - ошибка меняется на STATUS_OBJECT_NAME_INVALID (0xC0000033) Что, собссно, не вносит никакой ясности в происходящее.
в моем случае - \??\C:\bla.sys с нулевым WCHAR на конце. в твоем - \??\C:\bla.sys с нулевыми WCHAR в большом количестве (полагаю - их столько, чтобы заполнить весь массив). Вот, соббсно, ошибки и разнятся.
Для функции lstrlenW(), которую ты используешь при записи пути в реестр, нет никакой разницы, один там ноль на конце или много, потому что длина считается до первого же встречного нуля, остальные роли не играют. Кстати, а система какая? Windows XP?
Хорошо, скинь мне бинарники (.exe и .sys) на почту и напиши краткую инструкцию, какие файлы куда положить. Запускать .exe, я так понимаю? Гляну на досуге, отпишусь если что. Честно говоря, самому интересно, я вообще этот способ запуска драйверов не использую, но вижу, что проблема возникает регулярно. Посмотрим, может даже в блоге отпишу.
У меня в нативе отлично работает так примерно: Код (Text): const WCHAR reg[]=L"\\registry\\machine\\SYSTEM\\CurrentControlSet\\Services\\"; ///////////////////////////////////ОТКРЫТИЕ ФАЙЛА ДРАЙВЕРА и загрузка//////////////////////////////////////////// DWORD WINAPI LoadDriver(LPVOID) { WCHAR strInjDll[MAX_PATH*2*sizeof(WCHAR)]={0}; static OPENFILENAMEW of; of.lStructSize=OPENFILENAME_SIZE_VERSION_400A; of.hwndOwner=HWMain; of.hInstance=hcm; of.lpstrCustomFilter=NULL; of.lpstrFilter=L"Driver files (*.sys)\0*.sys\0"; of.nMaxCustFilter=0; of.nFilterIndex=1; of.nMaxFile=MAX_PATH*2; of.lpstrFile=strInjDll; of.Flags=OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST|OFN_HIDEREADONLY; of.lpstrInitialDir=NULL; of.lpstrFileTitle=NULL; of.nMaxFileTitle=0; of.lpstrTitle =L"Select Driver for Load. Copyright©2009 HiEndSoft (hiendsoft@mail.ru)"; if(GetOpenFileNameW(&of)) { UNICODE_STRING us; WCHAR* drivn=wcsrchr(strInjDll,'\\')+1; WCHAR* dot=wcsrchr(strInjDll,'.'); WCHAR serv[MAX_PATH]; wcscpy(serv,drivn); serv[dot-drivn]=0; WCHAR regp[MAX_PATH*20]={0}; wcscpy(regp,reg); wcscat(regp,serv); RtlInitUnicodeString(&us,regp); OBJECT_ATTRIBUTES OA; UNICODE_STRING ValueName,nPath; ULONG Disposition; HANDLE KeyHandle; RtlInitUnicodeString(&ValueName,regp); InitializeObjectAttributes(&OA, &ValueName,OBJ_CASE_INSENSITIVE,NULL,NULL); if(NT_SUCCESS(NtCreateKey(&KeyHandle,KEY_ALL_ACCESS,&OA,0,NULL,REG_OPTION_NON_VOLATILE,&Disposition ))) { RtlInitUnicodeString(&ValueName,L"ImagePath"); RtlDosPathNameToNtPathName_U(strInjDll,&nPath,NULL,NULL); //MessageBoxW(NULL,nPath.Buffer,strInjDll,0); if(NT_SUCCESS(NtSetValueKey(KeyHandle,&ValueName,0,REG_EXPAND_SZ,nPath.Buffer,nPath.Length+sizeof(WCHAR)))) { RtlInitUnicodeString(&ValueName,L"Type"); DWORD type=1; if(NT_SUCCESS(NtSetValueKey(KeyHandle,&ValueName,0,REG_DWORD,&type,sizeof(DWORD)))) { NtClose(KeyHandle); NTSTATUS st; st=NtLoadDriver(&us); if(NT_SUCCESS(st)) { Beep(2500,20); } else { ResetError(st,"Error:NtLoadDriver"); } return 0; } else ResetError(0,"Error:NtSetValueKey (subkey)"); } else ResetError(0,"Error:NtSetValueKey"); NtClose(KeyHandle); } else ResetError(0,"Error:NtCreateKey"); } return 0; }
Таки вот, проблема путем долгих поисков решена. Вот - окончательно работающий код - http://www.everfall.com/paste/id.php?tjzx37aotyww Была неочевидная и, как выяснилось, офигенно трудно локализуемая ошибка в вызове GetFullPathNameW. Всем спасибо за внимание.
n0name Факт, тем не менее, конкретно этой ошибкой дело не ограничивалось, да и вариант, предложенный во втором посте не принес желаемого удовлетворения. Таки тему можно прикрыть, пускай остается в назидании будущим поколениям (этот вопрос, как показывает поиск, поднимался на форуме много раз, но первый раз - доведен до решения).