您的位置:首页 > 其它

Windows内核:读注册表键的值

2017-04-20 16:54 52 查看
今天 , 调试了一下读注册表键的值,有一个很有意思的发现实际需要长度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));

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: