Здравствуйте уважаемые программисты. Хочу научиться программировать драйвера. Вот учусь
Возникли вопросы, с которыми мне одному не разобраться. Необходимо прочитать параметр из реестра. Вот мои наработки:
#include <ntddk.h>
VOID ReadUserinit()
{
UNICODE_STRING key;
UNICODE_STRING param;
OBJECT_ATTRIBUTES ObjAtr;
HANDLE hKey;
NTSTATUS opn, rd;
PKEY_VALUE_PARTIAL_INFORMATION info;
LONG size;
DbgPrint("Start");
RtlInitUnicodeString(&key, L"\\Registry\\Machine\\Software\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon");
RtlInitUnicodeString(¶m, L"Userinit");
InitializeObjectAttributes(&ObjAtr, &key, OBJ_CASE_INSENSITIVE, NULL, NULL);
opn = ZwOpenKey(&hKey, KEY_QUERY_VALUE, &ObjAtr);
if(opn == STATUS_SUCCESS)
{
DbgPrint("ZwOpenKey()...YES");
rd = ZwQueryValueKey(hKey, ¶m, KeyValuePartialInformation, NULL, 0, &size);
if(rd == STATUS_SUCCESS)
{
DbgPrint("ZwQueryValueKey(1)...YES");
info = (PKEY_VALUE_PARTIAL_INFORMATION)ExAllocatePool(PagedPool, size);
rd = ZwQueryValueKey(hKey, ¶m, KeyValuePartialInformation, info, sizeof(KEY_VALUE_PARTIAL_INFORMATION), &size);
if(rd = STATUS_SUCCESS)
{
DbgPrint("ZwQueryValueKey(2)...YES");
DbgPrint("Parametr: %s", info);
}
else
{
DbgPrint("ZwQueryValueKey(2)...NO");
}
ExFreePool(info);
}
else
{
DbgPrint("ZwQueryValueKey(1)...NO");
}
ZwClose(hKey);
}
else
{
DbgPrint("ZwOpenKey()...NO");
}
}
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath)
{
DbgPrint("Loaded");
ReadUserinit();
return STATUS_DEVICE_CONFIGURATION_ERROR;
}
При запуске драйвера и отладке программой DbgView, выполнение драйвера прекращается при первом вызове функции ZwQueryValueKey() т. е. DbgView выводит "ZwQueryValueKey(1)...NO" и далее, разумеется, ничего не работает. Прошу объяснить мне, где я не прав.