works:programmer:cpp:kernel-mode-registry-access

Доступ к реестру из уровня драйвера

Пример сильно топорный, но очень даже рабочий, вполне можно реализовать чтение из DDK

ULONG reg_query_value (PWSTR registry_path, PWSTR value_name, ULONG type, PVOID data, ULONG length)
{
	UNICODE_STRING valname;
	UNICODE_STRING keyname;
	OBJECT_ATTRIBUTES attribs;
	PKEY_VALUE_PARTIAL_INFORMATION pinfo;
	HANDLE handle;
	NTSTATUS rc;
	ULONG len, reslen;
 
	RtlInitUnicodeString (&keyname, registry_path);
	RtlInitUnicodeString (&valname, value_name);
 
	InitializeObjectAttributes (&attribs, &keyname, OBJ_CASE_INSENSITIVE, NULL, NULL);
	rc = ZwOpenKey (&handle, KEY_QUERY_VALUE, &attribs);
	if (!NT_SUCCESS (rc)) return 0;
 
	len = sizeof (KEY_VALUE_PARTIAL_INFORMATION) + length;
	pinfo = ExAllocatePool (NonPagedPool, len);
	rc = ZwQueryValueKey (handle, &valname, KeyValuePartialInformation, pinfo, len, &reslen);
	if ((NT_SUCCESS (rc) || rc == STATUS_BUFFER_OVERFLOW) && reslen >= (sizeof (KEY_VALUE_PARTIAL_INFORMATION) - 1) && (!type || pinfo->Type == type)) {
		reslen = pinfo->DataLength;
		memcpy (data, pinfo->Data, min (length, reslen));
	}
	else
		reslen = 0;
	ExFreePool (pinfo);
	ZwClose (handle);
	return reslen;
}
works/programmer/cpp/kernel-mode-registry-access.txt · Last modified: 2022/06/21 14:00 by Chugreev Eugene