如何确定注册表键是否被WOW64重定向?

4

有没有可能确定给定的注册表键是否被重定向?

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

我确实找到了一些与此相关的文档, 但看起来唯一的方法是检查hive并在key上进行一堆字符串比较。 我想到的另一个可能性是尝试在每个子键上打开Wow6432Node; 如果存在,则必须重定向该键。 即,如果我正在尝试打开HKCU \ Software \ Microsoft \ Windows,则会尝试打开以下键: HKCU \ Wow6432Node,HKCU \ Software \ Wow6432Node,HKCU \ Software \ Microsoft \ Wow6432Node和HKCU \ Software \ Microsoft \ Windows \ Wow6432Node。 不幸的是,文档似乎暗示重定向键的子项不一定被重定向,因此该路线也存在问题。

那么,我的选择是什么?

2个回答

2
你的目标不够清晰。为什么你需要以通用的方式在32位应用程序中枚举32位和64位注册表视图中的注册表键?你想在应用程序中使用64位值做什么?如果x64和x86键有不同的值,你会怎么做?这感觉很奇怪或者说是错误的想法。
重定向键有重要的原因:为了不破坏x86应用程序的行为。例如:CLSID被COM用于查找给定接口的正确实现。除其他外,“正确”意味着它可以由调用方代码运行,即应该与平台相同。这就是为什么应该有不同的x64和x86条目集的原因。其他重定向键的原因类似。一般来说,这些重定向键对于x86和x64应用程序必须是不同的。
正如雷蒙德·陈所写的:“在64位Windows上,32位程序在仿真层中运行,如果您不喜欢这个,请不要使用仿真器”,我完全同意他的建议。所以,如果您需要类似的功能,我的最佳建议是从x64应用程序中进行操作。但首先请重新考虑您是否真的需要它。
编辑:RegOpenKeyExsamDesired参数可能会对您有用。还可以查看MSDN文章"Accessing an Alternate Registry View"

理想情况下,我们希望将整个系统重建为x64,但这对我们来说仍然有一段路要走。与此同时,这是一种权宜之计。该应用程序基本上是一个系统信息/扫描器组件。例如,检查注册表以查看各种运行键中的内容。我知道这些特定的键被重定向了,但我希望有一种通用的方法来确定这一点,这样我就不必事先知道。 - Luke
正如我所说,我认为正确的方法是使应用程序 x64,但你也可以采用其他方式。请查看我的编辑。 - SergGr
我已经知道如何访问不同的视图;问题在于没有办法确定给定的键是否有备用视图。尝试在没有备用视图的键上打开备用视图将会给你共享视图。 - Luke
我们决定采用不同的方法。在64位机器上运行时,我们将始终使用64位注册表视图进行操作。由于我们事先知道哪些键被重定向,因此我们将这些特定的键硬编码到应用程序中。这比尝试动态地解决问题要简单得多,也更直接。 - Luke
@Luke,感谢您的跟进。这似乎是我所知道的唯一解决方案。至少我不知道有更好的解决方案。 - SergGr

2

你将会遇到相当多的痛苦,这取决于操作系统版本。完整清单在这里


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接