2010-04-22 43 views
2

是否可以确定给定的注册表项是否被重定向?如何确定注册表项是否被WOW64重定向?

我的问题是,我想从32位应用程序以通用方式枚举32位和64位注册表视图中的注册表项。我可以简单地打开每个键两次,首先使用KEY_WOW64_64KEY,然后使用KEY_WOW64_32KEY。但是,如果密钥没有重定向,则会给出完全相同的密钥,并最终枚举两次完全相同的内容;这是我想要避免的。

我的确发现了一些documentation,但它看起来像唯一的方法是检查配置单元并对密钥进行一堆字符串比较。我想到的另一种可能性是尝试在每个子项上打开Wow6432Node;如果它存在,则密钥必须重定向。即如果我试图打开HKCU \ Software \ Microsoft \ Windows,我会尝试打开以下键: HKCU \ Wow6432Node,HKCU \ Software \ Wow6432Node,HKCU \ Software \ Microsoft \ Wow6432Node和HKCU \ Software \ Microsoft \ Windows \ Wow6432Node。不幸的是,文档似乎暗示重定向的关键字的孩子不一定被重定向,因此路由也有问题。

那么,我在这里有什么选择?

回答

2

你的目标不明确。为什么需要以32位应用程序的通用方式枚举32位和64位注册表视图中的注册表项?你想在你的应用程序中使用64位值做什么?如果x64和x86密钥有一些不同的值,你会怎么做?这感觉像是奇怪或错误的想法。

键重定向的重要原因是:不打破x86应用程序的行为。例如:COM使用CLSID来查找给定接口的正确实现。除此之外,“正确”意味着它可以由调用者代码运行,即应该是相同的平台。这就是为什么x64和x86应该有不同的条目集合。其他重定向键的原因是相似的。一般来说,对于x86和x64应用程序,重定向键必须是不同的

正如雷蒙德陈写的,“On 64-bit Windows, 32-bit programs run in an emulation layer, and if you don't like that, then don't use the emulator”,我完全同意他的建议。所以我最好的建议,如果你需要这样的东西,是从64位应用程序。但首先重新考虑你是否真的需要它。

编辑:有samDesired参数的RegOpenKeyEx,你可能会发现有用的。另请看看"Accessing an Alternate Registry View" MSDN文章。

+0

理想情况下,我们希望将整件事重建为x64,但这仍然是我们前进的道路。与此同时,这是一种权宜之计。该应用程序基本上是一个系统信息/扫描仪组件。例如,检查注册表以查看各种运行键中的内容。我知道这些特定的键恰好被重定向,但我想要一个通用的方法来确定这个,所以我不必事先知道。 – Luke 2010-04-22 17:57:44

+0

正如我所说,我相信正确的方法是使应用程序x64,但你可以用其他方式。查看我的编辑 – SergGr 2010-04-23 15:14:47

+0

我已经知道如何访问不同的视图;问题在于无法确定给定密钥是否具有备用视图。尝试在没有密钥的密钥上打开备用视图会为您提供共享视图。 – Luke 2010-04-23 18:16:21

1

你需要付出相当大的痛苦,这取决于操作系统版本。完整列表是available here