注册表重定向程序

注册表重定向程序通过在 WOW64 上提供注册表的某些部分的单独逻辑视图来隔离 32 位和 64 位应用程序。 注册表重定向程序截获对其各自的逻辑注册表视图的 32 位和 64 位注册表调用,并将其映射到相应的物理注册表位置。 重定向过程对应用程序是透明的。 因此,即使数据存储在 64 位 Windows 上的其他位置,32 位应用程序也可以访问注册表数据,就好像它在 32 位 Windows 上运行一样。

ARM 上的 Windows 10: 除了 x86 应用程序的 32 位逻辑视图外,ARM 上的 Windows 10 还包括 32 位 ARM 应用程序的单独逻辑视图。

共享重定向注册表路径下的密钥子集。 不会重定向对共享密钥的 32 位注册表调用。 而是将密钥的一个物理副本映射到注册表的每个逻辑视图中。 有关重定向密钥和共享密钥的列表,请参阅 受 WOW64影响的注册表项。

Windows Server 2008、Windows Vista、Windows Server 2003 和 Windows XP: 若要通过 COM 和其他机制实现应用程序互作性,还 反映的重定向注册表项子集。 注册表反射过程复制两个注册表视图之间的注册表项和值,以使它们保持同步。 从 Windows 7 和 Windows Server 2008 R2 开始,删除了注册表反射。 有关详细信息,请参阅 注册表反射

以下方案说明了如何使用这些逻辑视图:

  • 32 位 x86 应用程序检查是否存在以下注册表项:HKEY_LOCAL_MACHINE\Software\Hello。 如果密钥不存在,则应用程序会创建默认值为“Hello 32 位 x86 world”;否则,它会读取并显示值。
  • 修改相同的应用程序以编写“Hello 64 位世界”而不是“Hello 32 位 x86 world”,并重新编译为 64 位 x64 或 ARM64 应用程序。
  • ARM 上的 Windows 10: 修改同一应用程序以编写“Hello 32 位 ARM world”,并重新编译为 32 位 ARM 应用程序。
  • 当 32 位 x86 应用程序在 64 位 Windows 上运行时,它将显示“Hello 32 位 x86 world”。 运行 64 位应用程序时,会显示“Hello 64 位世界”。 ARM 上的 Windows 10: 当 32 位 ARM 应用程序在 64 位 ARM64 Windows 上运行时,它将显示“Hello 32 位 ARM world”。 所有应用程序调用具有相同预定义句柄和相同键名称的相同注册表函数;区别在于,每个应用程序对其逻辑注册表视图进行作,并且每个视图都映射到注册表的单独物理位置,从而保留字符串的所有版本。

重定向的密钥映射到 Wow6432Node下的物理位置。 例如,HKEY_LOCAL_MACHINE\Software 重定向到 HKEY_LOCAL_MACHINE\Software\Wow6432Node。 但是,系统应考虑重定向密钥的物理位置。 应用程序不应直接访问密钥的物理位置,因为此位置可能会更改。 有关详细信息,请参阅 访问备用注册表视图

ARM 上的 Windows 10: 重定向的 32 位 ARM 密钥映射到 WowAA32Node 下的物理位置。

为了帮助向注册表写入 REG_SZREG_EXPAND_SZ 包含 %ProgramFiles% 或 %commonprogramfiles% 数据的 32 位应用程序,WOW64 会截获这些写入作,并将其替换为“%ProgramFiles(x86)%”和“%commonprogramfiles(x86)%”。 例如,如果 Program Files 目录位于 C 驱动器上,则“%ProgramFiles(x86)%”将展开为“C:\Program Files (x86)”。 仅当满足以下条件时,才会发生替换:

  • 字符串必须以 %ProgramFiles% 或 %commonprogramfiles%开头。 如果字符串以空格或除 %以外的任何字符开头,则不会替换它。
  • %ProgramFiles% 或 %commonprogramfiles% 大小写必须完全如上所示,因为字符串比较区分大小写。 例如,如果字符串以 %CommonProgramFiles% 而不是 %commonprogramfiles%开头,则不会替换它。
  • 字符串不能超过 MAX_PATH*2+15 个字符。 如果超过此长度,则不会替换它。
  • 无法使用KEY_WOW64_64KEY打开密钥。 此标志指定应在 64 位注册表视图中对密钥执行的作,因此不会替换它。 有关详细信息,请参阅 访问备用注册表视图

Windows Server 2008、Windows Vista、Windows Server 2003 和 Windows XP: KEY_WOW_64_64KEY标志不会影响密钥是否已替换。 此标志影响从 Windows 7 和 Windows Server 2008 R2 开始的替换。

此外,包含 system32 的REG_SZ或REG_EXPAND_SZ密钥替换为 syswow64。 该字符串必须以指向 \system32 或 %windir%以下的路径开头。 字符串比较不区分大小写。 环境变量在匹配路径之前进行扩展,因此将替换以下所有路径:%windir%\system32、%SystemRoot%\system32 和 C:\windows\system32。 此修补程序仅适用于 Windows 7 之前反映的密钥。

有关详细信息,请参阅以下主题: