若要打开注册表项对象的句柄,请执行以下两个步骤:
创建 OBJECT_ATTRIBUTES 结构,并通过调用 InitializeObjectAttributes 对其进行初始化。 指定要操作的键的名称作为 InitializeObjectAttributes 的 ObjectName 参数。
如果将 NULL 作为 RootDirectory 参数传递给 InitializeObjectAttributes, 则 ObjectName 必须是注册表项的完整路径,从 \Registry 开始。 否则, RootDirectory 必须是键的打开句柄,而 ObjectName 是相对于该键的路径。
通过调用 ZwCreateKey 或 ZwOpenKey 打开密钥对象的句柄,并将 OBJECT_ATTRIBUTES 结构传递给该对象。 如果该键尚不存在, ZwCreateKey 将创建密钥,而 ZwOpenKey 将返回STATUS_OBJECT_NAME_NOT_FOUND。
将 DesiredAccess 参数传递给包含所请求的访问权限的 ZwCreateKey 或 ZwOpenKey 。 必须指定允许驱动程序执行的操作的访问权限。 下表列出了可以执行的操作以及要请求的相应访问权限。
| Operation | 所需的访问权限 | 
|---|---|
获取注册表项值。  | 
KEY_QUERY_VALUE或KEY_READ  | 
设置注册表项值。  | 
KEY_SET_VALUE或KEY_WRITE  | 
循环访问键的所有子项。  | 
KEY_ENUMERATE_SUB_KEYS或KEY_READ  | 
创建子项。  | 
KEY_CREATE_SUB_KEY或KEY_WRITE  | 
删除密钥。  | 
DELETE  | 
有关 DesiredAccess 参数的可用值的详细信息,请参阅 ZwCreateKey。
还可以调用 IoOpenDeviceRegistryKey 和 IoOpenDeviceInterfaceRegistryKey ,分别打开特定于设备的注册表项和设备接口特定的句柄。 有关详细信息,请参阅 即插即用 注册表例程。
注意 对于 对 ZwCreateKey、 ZwOpenKey、 IoOpenDeviceRegistryKey 和 IoOpenDeviceInterfaceRegistryKey 的调用,泛型访问权限GENERIC_READ和GENERIC_WRITE在含义上等效于键特定的访问权限,分别KEY_READ和KEY_WRITE,并且可用作这些特定于密钥的访问权限的替代项。