ZwOpenKeyEx 函数 (wdm.h)
ZwOpenKeyEx 例程会打开现有的注册表项。
语法
NTSYSAPI NTSTATUS ZwOpenKeyEx(
[out] PHANDLE KeyHandle,
[in] ACCESS_MASK DesiredAccess,
[in] POBJECT_ATTRIBUTES ObjectAttributes,
[in] ULONG OpenOptions
);
参数
[out] KeyHandle
指向 HANDLE 变量的指针,例程在其中将句柄写入键。
[in] DesiredAccess
指定调用方请求的密钥的访问类型。 此参数是一个 ACCESS_MASK 值。 有关详细信息,请参阅 ZwCreateKey 例程的 DesiredAccess 参数的说明。
[in] ObjectAttributes
指向正在打开的键的对象属性的指针。 此参数指向之前必须由 InitializeObjectAttributes 例程初始化的OBJECT_ATTRIBUTES结构。 调用方必须在调用 InitializeObjectAttributes 时将注册表项的名称指定为 ObjectName 参数。 如果调用方未在系统线程上下文中运行,则必须在调用 InitializeObjectAttributes 时设置 OBJ_KERNEL_HANDLE 属性。
[in] OpenOptions
指定要在打开密钥时应用的选项。 将此参数设置为零或设置为以下一个或多个REG_OPTION_XXX 标志位的按位 OR:
OpenOptions 标志 | 说明 |
---|---|
REG_OPTION_OPEN_LINK | 键是符号链接。 设备和中间驱动程序不使用此标志。 |
REG_OPTION_BACKUP_RESTORE | 应使用允许备份和还原操作的特殊权限打开密钥。 设备和中间驱动程序不使用此标志。 |
返回值
如果调用成功打开密钥,ZwOpenKeyEx 将返回STATUS_SUCCESS。 可能的错误返回值包括以下内容:
返回代码 | 说明 |
---|---|
|
OpenOptions 参数指定无效选项。 |
|
对象属性中的注册表路径无效。 |
|
找不到对象属性中的注册表项名称。 |
|
命名的注册表项是符号链接,但 OpenOptions 中未设置REG_OPTION_OPEN_LINK标志位。 |
|
调用方没有打开命名注册表项句柄所需的访问权限。 |
|
内存分配操作失败。 |
注解
此例程提供一个句柄,调用方可以使用该句柄访问注册表项。 如果指定的键不存在,则例程将返回错误状态值,并且不提供键句柄。
ZwOpenKey 例程类似于 ZwOpenKeyEx,但不接受 OpenOptions 参数。 使用 ZwOpenKeyEx 的 OpenOptions 参数,调用方可以打开符号链接的密钥,或打开用于备份和还原操作的密钥。 调用 OpenOptions = 0 的 ZwOpenKeyEx 等效于对 ZwOpenKey 的调用。
不再使用 KeyHandle 指向的句柄后,驱动程序必须调用 ZwClose 来关闭它。
ZwOpenKeyEx 忽略 ObjectAttributes 参数指向的结构中的安全信息。
如果内核模式调用方未在系统线程上下文中运行,它必须确保它创建的任何句柄都是内核句柄。 否则,运行驱动程序的上下文的进程可以访问句柄。 有关详细信息,请参阅 对象句柄。
有关在内核模式下使用注册表项的详细信息,请参阅 在驱动程序中使用注册表。
要求
要求 | 值 |
---|---|
最低受支持的客户端 | 在 Windows 7 和更高版本的 Windows 中可用。 |
目标平台 | 通用 |
标头 | wdm.h(包括 Wdm.h、Ntddk.h、Ntifs.h) |
Library | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | PASSIVE_LEVEL |
DDI 符合性规则 | HwStorPortProhibitedDDI (storport) 、 PowerIrpDDis (wdm) |