注册表重定向器通过在WOW64上提供注册表某些部分的单独逻辑视图来隔离32位和64位应用程序。注册表重定向器拦截对其各自逻辑注册表视图的32位和64位注册表调用,并将它们映射到相应的物理注册表位置。重定向过程对应用程序是透明的。因此,32位应用程序可以访问注册表数据,就像它在32位Windows上运行一样,即使数据存储在64位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-bit x86 world”创建它;否则,它会读取并显示该值。
- 修改相同的应用程序以编写“Hello 64-bit world”而不是“Hello 32-bit 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下的物理位置。
为了帮助那些编写包含的%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之前反映的键。
有关更多信息,请参阅以下主题:
原文链接:Registry Redirector