ZwCreateKey 函数既可以创建注册表项,也可以打开注册表项。为了简化打开注册表项,DDK提供了内核函数 ZwOpenKey, 以简化打开操作。如果 ZwOpenKey 指定的项不存在,不会创建这个项目,而是返回一个错误状态。该函数的声明如下:
NTSTATUS ZwOpenKey(
OUT PHANDLE KeyHandle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes
);
// KeyHandle: 返回被打开的句柄
// DesiredAccess: 打开的权限,一般设为KEY_ALL_ACCESS。
// ObjectAttributes: OBJECT_ATTRIBUTES 数据结构,指示打开的状态。
// 返回值: 返回是否打开成功
ZwOpenKey 的参数比 ZwCreateKey 的参数简化,程序员使用该函数会很方便。下面的代码演示了如何使用ZwOpenKey打开注册表项。
UNICODE_STRING RegUnicodeStr;
HANDLE hRegister;
// 初始化 UNICODE_STRING 字符串
RtlInitUnicodeString(&RegUnicodeStr,
MY_REG_SOFTWARE_KEY_NAME);
OBJECT_ATTRIBUTES objectAttributes;
// 初始化objectAttributes
InitializeObjectAttributes(&objectAttributes,
&RegUnicodeStr,
OBJ_CASE_INSENSITIVE,
NULL,
NULL
);
// 打开注册表项
NTSTATUS Status = ZwOpenKey(&hRegister,
KEY_ALL_ACCESS,
&objectAttributes);
// 判断操作是否成功
if (NT_SUCCESS(Status))
{
KdPrint(("Open register successfully. \n"));
}
// 关闭句柄
ZwClose(hRegister);