注册表重定向程序

注册表重定向程序通过在 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 世界”,并重新编译为 32 位 ARM 应用程序。
  • 当 32 位 x86 应用程序在 64 位 Windows 上运行时,它将显示“Hello 32 位 x86 world”。 当 64 位应用程序运行时,它将显示“Hello 64 位世界”。 在 ARM 上Windows 10:在 64 位 ARM64 Windows 上运行 32 位 ARM 应用程序时,会显示“Hello 32 位 ARM 世界”。 所有应用程序调用具有相同预定义句柄和相同键名称的相同注册表函数;不同之处在于,每个应用程序在其注册表的逻辑视图上运行,并且每个视图都映射到注册表的单独物理位置,从而保持字符串的所有版本保持不变。

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

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

为了帮助将包含 %ProgramFiles% 或 %commonprogramfiles% 的数据 REG_SZ 写入注册表或 REG_EXPAND_SZ 数据的 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。 字符串必须以指向 %windir%\system32 下的路径开头。 字符串比较不区分大小写。 环境变量在匹配路径之前进行扩展,因此将替换以下所有路径:%windir%\system32、%SystemRoot%\system32 和 C:\windows\system32。 此修补程序仅适用于 Windows 7 之前反映的密钥。

有关详情,请参阅以下主题: