我正在做一个应用程序虚拟化项目。所以我在 NT 级别挂接应用程序并将注册表调用定向到我的虚拟注册表。在运行任何应用程序时,如果我转到"file"->“打开”。我几乎没有像下面这样的注册表调用:
ZwOpenKey(registry key path)
-> 它生成句柄 ex:(0x04e8)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/