注册表反射

[本主题中的信息适用于 Windows Server 2008、Windows Vista、Windows Server 2003 和 Windows XP。 从 Windows 7 和 Windows Server 2008 R2 开始,WOW64 不再使用注册表反射,而是共享以前反射的密钥。 有关详细信息,请参阅 受 WOW64 影响的注册表项。]

注册表重定向程序通过在 WOW64 上提供注册表某些部分的单独逻辑视图来隔离 32 位和 64 位应用程序。 但是,在 32 位和 64 位视图中,某些注册表项的值必须相同。

注册表反射过程在两个注册表视图之间复制注册表项和值,使它们保持同步。 每个视图都有每个反映的注册表项的单独物理副本,一个用于 32 位注册表视图,另一个用于 64 位注册表视图。

通过调用 RegCloseKey 关闭密钥时,会复制反射的密钥。 请注意,这导致了可能的争用条件:如果多个进程更改了反射的键,则最后一次 RegCloseKey 调用将确定密钥的最终值。

反射器在视图之间复制本地服务器的 COM 激活数据,但它不会复制进程内数据,因为 64 位 Windows 上不允许 32/64 进程内数据混合。

未为共享注册表项或未重定向的注册表项启用反射。 例如,不为 HKEY_LOCAL_MACHINE\System 键启用反射。 有关重定向、共享或反映的注册表项的列表,请参阅 受 WOW64 影响的注册表项

注册表反射使用“最后一个编写器获胜”策略,如以下示例所示:

  • 全新安装 64 位 Windows 后,将注册 64 位Wordpad.exe来处理.doc文件。 反射器将.doc注册从 64 位注册表视图复制到 32 位注册表视图中。
  • 管理员安装 32 位 Office,该 Office 注册 32 位Winword.exe以处理 32 位注册表视图中的.doc文件。 注册表反射器将此信息复制到 64 位注册表视图中,因此 32 位和 64 位应用程序都针对.doc文件启动 32 位版本的 Winword.exe。
  • 管理员安装 64 位 Office,该 Office 注册 64 位Winword.exe来处理 64 位注册表视图中的.doc文件。 注册表反射器将此信息复制到 32 位注册表中,因此 32 位和 64 位应用程序都针对.doc文件启动 64 位版本的 Winword.exe。

因此,将保留最近安装的应用程序的文件关联信息。

对于 32 位和 64 位应用程序,共享通常写入单独注册表视图的特定注册表项值可能很有用。 例如,可为来自 32 位和 64 位客户端的请求提供服务的 32 位 OLE 服务器可以将其 32 位注册表数据提供给系统注册表的 64 位视图。

当组件在系统注册表中写入数据时,WOW64 会分析信息,并在适当时在注册表的备用视图中创建数据副本。 通常,此过程在注册表中的两个视图中保留同一注册表项的两个单独的物理副本,称为注册表反射或注册表镜像。

类根下的大部分键都属于此类别。 更新完成且密钥的句柄关闭时,会反映密钥的汇报。 在特定情况下,如果键具有一些位依赖关系,则不会反映对键的写入。 例如,32 位 InprocServer32 键与 64 位应用程序无关,因此 InprocServer32 键不会反映在 64 位注册表视图中。 但是,64 位应用程序可以使用 32 位 LocalServer32 密钥,LocalServer32 密钥将得到反映。

对于 HKEY_LOCAL_MACHINE\Software\Classes\CLSIDHKEY_CURRENT_USER\Software\Classes\CLSID,仅反映未指定 InprocServer32 或 InprocHandler32 的 CLSD。 仅反映 LocalServer32 CLSID,因为它们在进程外运行,并且可由 32 位或 64 位应用程序激活。 InProcServer32 CLSID 未反映,因为无法加载 32 位 DLL 以在 64 位进程中执行,或加载 64 位 DLL 以在 32 位进程中执行。

对于 HKEY_LOCAL_MACHINE\Software\Classes\AppidHKEY_CURRENT_USER\Software\Classes\Appid,如果 DllSurrogateDllSurrogateExecutable 注册表值是空字符串,则不会反映这些值。

若要禁用和启用特定反射项的注册表反射,请使用 RegDisableReflectionKeyRegEnableReflectionKey 函数。 这些函数不会影响本主题前面未出现在反射键列表中的键。 应用程序应仅对所创建的注册表项禁用反射,而不应尝试禁用预定义键(例如 HKEY_LOCAL_MACHINE或HKEY_CURRENT_USER反射。 若要确定反射列表中的键是否已禁用,请使用 RegQueryReflectionKey 函数。

不应在事务处理注册表操作中使用反射键。 在事务期间写入反射的键可能会导致事务失败。 有关事务的详细信息,请参阅 内核事务管理器

注册表重定向程序

Windows 中的注册表反射

受 WOW64 影响的注册表项