c - NT 注册表句柄行为

标签 c windows registry driver virtualization

我正在做一个应用程序虚拟化项目。所以我在 NT 级别挂接应用程序并将注册表调用定向到我的虚拟注册表。在运行任何应用程序时,如果我转到"file"->“打开”。我几乎没有像下面这样的注册表调用:

  1. ZwOpenKey(registry key path) -> 它生成句柄 ex:(0x04e8)
  2. ZwQueryKey(0x4ea,...)

Process Monitor 说打开和查询都是在同一个键上执行的。我自己测试确认是同一个key。

查询键也为查询键 api 生成了正确的结果。 这 2 个字节的差异并不适用于所有打开和查询键的情况。

应用程序如何以及为何在调用 querykey 之前将句柄从 0x4e8 更改为 0x4ea

我还测试了在 open 和 querykey 之间调用 ZWDuplicateObject,但是没有调用 duplicateobject api。

谁能说说这个句柄是如何变化的?

最佳答案

内核不使用句柄的最低两位,因此应用程序可以自由地将它们设置为其他值和/或某些 API 将它们用作附加标志,而不是使用额外参数

0x4ea & 0xffc == 0x4e8 & 0xffc

陈峰做了a series讨论这些位的可能用途:

Kernel handles are always a multiple of four; the bottom two bits are available for applications to use. But why would an application need those bits anyway?

关于c - NT 注册表句柄行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5271428/

相关文章:

c - Valgrind 关于 asprintf : address is 0 bytes inside a block of size <size> alloc'd

C 套接字将数据附加到缓冲区被损坏

windows - UWA 和 UWP 应用有什么区别

c# - Windows编程: setting different icons for the different file types handled by your application

c# - 通过 C# 和 WMI 的 RegistryTreeChangeEvent

c - 如何以编程方式获取X509证书中的电子邮件地址?

c - 用于控制firewalld的D-Bus API或C库

windows - 使用mfc42.dll 作为免注册COM?

c# - 打开自定义文件,args 始终为空

caching - 将redis用于树数据结构