ZwQueryValueKey()查询键值使用

直接上代码

.h文件

#pragma once
#include

#define TAG  0x44434241			// 动态内存的标志

#ifdef __cplusplus
extern "C" {
#endif // __cplusplus

	NTSTATUS DriverEntry(PDRIVER_OBJECT pDriver, PUNICODE_STRING pRegPath);			// 入口

#ifdef __cplusplus
}
#endif // __cplusplus


void driverUnload(PDRIVER_OBJECT pDriver);				// 驱动卸载回调

void keyDemo(PUNICODE_STRING pRegPath);				// 注册表键值查询操作演示

.cpp文件

#include "driver.h"

NTSTATUS DriverEntry(PDRIVER_OBJECT pDriver, PUNICODE_STRING pRegPath)
{

	pDriver->DriverUnload = driverUnload;		// 绑定卸载回调

	DbgPrint("path = %wZ", pRegPath);		// 打印所在注册表路径

	keyDemo(pRegPath);						// 注册表键值演示

	return STATUS_SUCCESS;
}

// 驱动对象卸载回调
void driverUnload(PDRIVER_OBJECT pDriver)
{
	DbgPrint("++++驱动卸载++++");
}

// 键值查询演示
void keyDemo(PUNICODE_STRING pRegPath)
{
	HANDLE rHandle = NULL;			// 定义一个句柄

	OBJECT_ATTRIBUTES oAttributes;		// 定义一个用于对象结构

	// 初始化该对象的宏
	InitializeObjectAttributes(&oAttributes, pRegPath, OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, NULL, NULL);

	auto isOpen = ZwOpenKey(&rHandle, KEY_ALL_ACCESS, &oAttributes);		// 打开键值

	if (!NT_SUCCESS(isOpen))
	{
		DbgPrint("打开键值失败");
		return;
	}
	else
	{
		DbgPrint("打开键值成功");
	}

	UNICODE_STRING  valueName;			// 定义宽字节字符串结构

	RtlInitUnicodeString(&valueName, L"ImagePath");			// 初始化宽字节字符串。这是要打开的键值

	ULONG length;			// 接受长度的变量

	ZwQueryValueKey(rHandle, &valueName, KeyValuePartialInformation, nullptr, 0, &length);		// 首先查询实际只是要求出实际需要的字节数

	PKEY_VALUE_PARTIAL_INFORMATION keyInfo =			// 分配动态内存
		reinterpret_cast<PKEY_VALUE_PARTIAL_INFORMATION>(ExAllocatePoolWithTag(PagedPool, length, TAG));


	if (keyInfo == nullptr)	
	{
		DbgPrint("动态内存分配失败");
		ZwClose(rHandle);
		return;
	}

	// 再次查询获取信息
	auto isQuery = ZwQueryValueKey(rHandle, &valueName, KeyValuePartialInformation, keyInfo, length, &length);

	if (!NT_SUCCESS(isQuery))
	{
		DbgPrint("查询键值失败");
	}
	else
	{
		DbgPrint("%ls", reinterpret_cast<wchar_t*>(keyInfo->Data));			// 将获取到的键值打印控制台
	}

	ExFreePoolWithTag(keyInfo, TAG);		// 释放动态内存

	ZwClose(rHandle);			// 关闭句柄
}

你可能感兴趣的:(驱动程序)