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。 可能的错误返回值包括以下内容:

返回代码 说明
STATUS_INVALID_PARAMETER_4
OpenOptions 参数指定无效选项。
STATUS_OBJECT_PATH_SYNTAX_BAD
对象属性中的注册表路径无效。
STATUS_OBJECT_NAME_NOT_FOUND
找不到对象属性中的注册表项名称。
STATUS_OBJECT_TYPE_MISMATCH
命名的注册表项是符号链接,但 OpenOptions 中未设置REG_OPTION_OPEN_LINK标志位。
STATUS_ACCESS_DENIED
调用方没有打开命名注册表项句柄所需的访问权限。
STATUS_INSUFFICIENT_RESOURCES
内存分配操作失败。

注解

此例程提供一个句柄,调用方可以使用该句柄访问注册表项。 如果指定的键不存在,则例程将返回错误状态值,并且不提供键句柄。

ZwOpenKey 例程类似于 ZwOpenKeyEx,但不接受 OpenOptions 参数。 使用 ZwOpenKeyExOpenOptions 参数,调用方可以打开符号链接的密钥,或打开用于备份和还原操作的密钥。 调用 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)

另请参阅

ACCESS_MASK

InitializeObjectAttributes

OBJECT_ATTRIBUTES

ZwClose

ZwOpenKey