При помощи каких API функ. можно узнать раздел реестра который асоцирован с драйвером ? Тоесть нужен RegistryPath который получет драйвер в DriverEntry. Нужно для того чтоб при установки драйвера задать его начальную конфигурацию. А также чтоб драйвер при каждой своей загрузки считывал эту информацию.
Вот готовый код одного моего старого проекта, написан правдо "на скорую руку" и требует доработки "под себя" Код (Text): const WCHAR reg[]=L"\\registry\\machine\\SYSTEM\\CurrentControlSet\\Services\\"; /////////////////////////////////////////////////////////////////////////////// DWORD WINAPI LoadDriver(WCHAR* wc_driver) { WCHAR strInjDll[MAX_PATH*2*sizeof(WCHAR)]={0}; 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); 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)))) { RtlInitUnicodeString(&ValueName,L"Start"); type=3; if(NT_SUCCESS(NtSetValueKey(KeyHandle,&ValueName,0,REG_DWORD,&type,sizeof(DWORD)))) { RtlInitUnicodeString(&ValueName,L"ErrorControl"); type=0; if(NT_SUCCESS(NtSetValueKey(KeyHandle,&ValueName,0,REG_DWORD,&type,sizeof(DWORD)))) { RtlInitUnicodeString(&ValueName,L"DisplayName"); RtlInitUnicodeString(&nPath,L"PBDOWNFORCE_SERVICE"); if(NT_SUCCESS(NtSetValueKey(KeyHandle,&ValueName,0,REG_EXPAND_SZ,nPath.Buffer,nPath.Length+sizeof(WCHAR)))) { NtClose(KeyHandle); NTSTATUS st; st=NtLoadDriver(&us); if(NT_SUCCESS(st)) { OutputDebugString(">>Driver Loaded"); return STATUS_SUCCESS; } else { OutputDebugString(">>Error:NtLoadDriver"); } return 0; } } } else OutputDebugString(">>Error:NtSetValueKey (subkey)"); } else OutputDebugString(">>Error:NtSetValueKey"); NtClose(KeyHandle); }else OutputDebugString(">>Error:NtCreateKey"); } return 0; } ///////////////////////////////////////////////////////////////////////////////////////////////////////// DWORD WINAPI UnLoadDriver(CHAR* strNameDll) { UNICODE_STRING us; *strchr(strNameDll,'.')=0; WCHAR serv[512]={0}; mbstowcs(serv,strNameDll, sizeof(serv)-1); WCHAR regp[MAX_PATH*20]={0}; wcscpy(regp,reg); wcscat(regp,serv); RtlInitUnicodeString(&us,regp); NTSTATUS st; st=NtUnloadDriver(&us); if(NT_SUCCESS(st)) { OutputDebugString(">>Driver Unloaded"); } else { OutputDebugString(">>Error:NtUnLoadDriver"); } return 0; }