Программирование драйверов Windows




Работа с Системным Реестром через вызовы ZwXxx - часть 2


Для случая драйвера Example.sys этот подраздел называется HKLM\SYSTEM\ControlSet001\Services\Example, а собственно строка RegistryPath хранит значение:

L"\\REGISTRY\\MACHINE\\SYSTEM\\ControlSet001\\Services\\Example"

Вся работа с Системным Реестром вынесена в отдельную функцию GetRegValueDword.

// Сначала объявляем прототип GetRegValueDword: int GetRegValueDword(PCWSTR RegPath,PCWSTR ValueName,PULONG pValue); extern "C" NTSTATUS DriverEntry( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath ) { . . .

if(!GetRegValueDword( RegistryPath-&#62Buffer, L"ErrorControl", &ulValue)) { #if DBG DbgPrint("Error in GetRegValueDword."); #endif } else { #if DBG DbgPrint("RegistryPath\\ErrorControl = %x.", ulValue); #endif }

int GetRegValueDword(PCWSTR RegPath, PCWSTR ValueName, PULONG pValue) { int ReturnValue = 0; NTSTATUS status; OBJECT_ATTRIBUTES ObjectAttributes; HANDLE KeyHandle; KEY_VALUE_PARTIAL_INFORMATION *pInformation; ULONG uInformationSize; UNICODE_STRING UnicodeRegPath; UNICODE_STRING UnicodeValueName; // Инициализация UNICODE_STRING полученными // не-счетными строками двухбайтных символов RtlInitUnicodeString(&UnicodeRegPath, RegPath); RtlInitUnicodeString(&UnicodeValueName, ValueName);

// Описание атрибутов, в частности, полного имени подраздела InitializeObjectAttributes(&ObjectAttributes, &UnicodeRegPath, 0, // Flags NULL, // Root directory NULL); // Security descriptor

status = ZwOpenKey( &KeyHandle, KEY_QUERY_VALUE, &ObjectAttributes );

if( !NT_SUCCESS(status) ) // Если не получен доступ к подразделу: { #if DBG DbgPrint("=Example= Can not open reg path %ws .", UnicodeRegPath.Buffer); DbgPrint("=Example= Status = %x.",status); if (Status==STATUS_INVALID_HANDLE) DbgPrint("=Example= STATUS_INVALID_HANDLE."); if(Status==STATUS_ACCESS_DENIED) DbgPrint ("=Example= STATUS_ACCESS_DENIED."); #endif return 0; }

// Вычисляем размер буфера для получения информации о параметре: uInformationSize = sizeof(KEY_VALUE_PARTIAL_INFORMATION) + sizeof(ULONG);




Содержание  Назад  Вперед