NT注册表句柄行为

时间:2011-03-11 09:57:19

标签: c windows registry driver virtualization

我正在做一个应用程序虚拟化项目。所以我挂钩应用程序在NT级别,并将注册表调用指向我的虚拟注册表。在运行任何应用程序时,如果我转到文件 - >打开..我的注册表调用很少,如下所示:

  1. ZwOpenKey(registry key path) - >它产生句柄ex:(0x04e8)
  2. ZwQueryKey(0x4ea,...)
  3. Process Monitor表示打开和查询都在同一个密钥上执行。我自己测试并证实了同样的关键。

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

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

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

    有谁可以说这个句柄有何变化?

1 个答案:

答案 0 :(得分:3)

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

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

Raymond Chen做a series讨论这些位的可能用途:

  

内核句柄总是四的倍数;最后两位可供应用程序使用。但是为什么应用程序还需要那些位呢?