今天 , 调试了一下读注册表键的值,有一个很有意思的发现实际需要长度aclength 和 输入长度DataLength可以是不一样的(虽然无法解释 ,但不影响使用)
打印键值直接采用
RtlInitUnicodeString(&value, ac_key_infor->Data);
KdPrintEx((DPFLTR_DEFAULT_ID, DPFLTR_ERROR_LEVEL, "%wZ", &value));
Data确实是可变长度的数组啊 !! 因为数据结构里,他起先只是一个长度的数组 UCHAR DATA[1].
#include <ntddk.h>
#include <Ntstrsafe.h>
#include "set.h"
NTSTATUS DriverEntry(PDRIVER_OBJECT driver, PUNICODE_STRING reg_path){
HANDLE my_key;
NTSTATUS status;
driver->DriverUnload = DU;
UNICODE_STRING my_key_path = RTL_CONSTANT_STRING(L"\\Registry\\Machine\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion");
OBJECT_ATTRIBUTES my_obj_attr = { 0 };
InitializeObjectAttributes(&my_obj_attr, &my_key_path, OBJ_CASE_INSENSITIVE, NULL, NULL);
status = ZwOpenKey(&my_key, KEY_READ, &my_obj_attr);
if (!NT_SUCCESS(status)){
}
UNICODE_STRING my_key_name = RTL_CONSTANT_STRING(L"SystemRoot");
KEY_VALUE_PARTIAL_INFORMATION key_infor;
PKEY_VALUE_PARTIAL_INFORMATION ac_key_infor = &key_infor;
ULONG aclength = 0;
UNICODE_STRING value;
status = ZwQueryValueKey(my_key ,&my_key_name , KeyValuePartialInformation,&key_infor ,
sizeof(KEY_VALUE_PARTIAL_INFORMATION) ,&aclength);
ULONG temp = sizeof(KEY_VALUE_PARTIAL_INFORMATION);
//失败
//如果没有失败则分配足够的空间再次读取
ac_key_infor = ExAllocatePoolWithTag(NonPagedPool, aclength, MEM_TAG);
status = ZwQueryValueKey(my_key, &my_key_name, KeyValuePartialInformation, ac_key_infor,
aclength, &aclength);
RtlInitUnicodeString(&value, ac_key_infor->Data);
KdPrintEx((DPFLTR_DEFAULT_ID, DPFLTR_ERROR_LEVEL, "%wZ", &value));
}
本文介绍了一种读取Windows注册表键值的方法,并通过实验发现实际需要长度与输入长度可能不同。文中提供了具体的代码实现过程,包括初始化、读取及打印注册表键值等步骤。

3473

被折叠的 条评论
为什么被折叠?



