代码之家  ›  专栏  ›  技术社区  ›  Luke

如何确定WOW64是否重定向了注册表项?

  •  2
  • Luke  · 技术社区  · 16 年前

    是否可以确定给定注册表项是否被重定向?

    我的问题是,我想从32位应用程序中以通用方式枚举32位和64位注册表视图中的注册表项。我可以简单地打开每一个键两次,首先使用键wow64,然后使用键wow64,然后使用键32key。但是,如果密钥没有被重定向,这将给您提供完全相同的密钥,并且您将枚举完全相同的内容两次;这是我试图避免的。

    我确实找到了一些 documentation 但是看起来唯一的方法是检查蜂箱并对键进行一系列字符串比较。我想到的另一种可能性是尝试在每个子键上打开wow6432node;如果它存在,则必须重定向该键。即,如果我试图打开hkcu\software\microsoft\windows,我将尝试打开以下密钥: hkcu\wow6432node、hkcu\software\wow6432node、hkcu\software\microsoft\wow6432node和hkcu\software\microsoft\windows\wow6432node。不幸的是,文档似乎暗示了重定向密钥的子项不一定被重定向,因此该路由也有问题。

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

    2 回复  |  直到 16 年前
        1
  •  2
  •   SergGr    16 年前

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

    密钥被重定向的重要原因是:不破坏x86应用程序的行为。例如: CLSID 由COM用于为给定接口找到正确的实现。除此之外,“正确”意味着它可能由调用方代码运行,即应该是同一平台的代码。这就是为什么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 “我完全同意他的建议。所以,如果你需要这样的东西,我最好的建议是从x64应用程序开始。但首先要重新考虑你是否真的需要它。

    编辑:有 samDesired 参数 RegOpenKeyEx 你可能会觉得有用。也看看 "Accessing an Alternate Registry View" MSDN文章。

        2
  •  2
  •   Hans Passant    16 年前

    你要承受相当大的痛苦,这取决于操作系统的版本。完整的名单是 available here .