Windows内核:读注册表键的值

本文介绍了一种读取Windows注册表键值的方法,并通过实验发现实际需要长度与输入长度可能不同。文中提供了具体的代码实现过程,包括初始化、读取及打印注册表键值等步骤。

今天 , 调试了一下读注册表键的值,有一个很有意思的发现实际需要长度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));
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值