WoW64

WoW64（Windows 32-bit on Windows 64-bit）是Microsoft Windows操作系统的一个子系统，它提供在所有Windows 64位系统上运行32位元应用程序的能力——这包括Windows XP Professional x64 Edition、IA-64和Windows Server 2003的64位版本，以及Windows Vista、Windows Server 2008、Windows 7、Windows 8、Windows Server 2012、Windows 8.1、Windows 10、Windows Server 2022和Windows 11的64位版本。在Windows Server 2008 R2 Server Core中它成为了可选组件，并在Nano Server中不再提供。WoW64旨在解决32位与64位Windows中的许多差异，特别是涉及到Windows本身的结构变化。

 转换-{zh:库;zh-hans:库;zh-hant:函式庫;}- 
WoW64子系统由一个轻量级兼容层组成，其在所有64位Windows版本上有类似的接口。它的目的是创建一个32位环境，为未修改的32位Windows应用程序在64位系统上运行提供一个必需的接口。在技术上，WoW64使用三个-{zh:动态链接库;zh-hans:动态链接库;zh-hant:動態連結函式庫;}-（DLL）实现：
 Wow64.dll，通往Windows NT内核的核心接口，它转换32位与64位调用，包括指针和调用栈操作。
 Wow64win.dll，为32位应用程序提供适当的入口点。
 Wow64cpu.dll，负责解决进程从32位切换到64位模式。

 架构 
尽管表面上看它在所有64位Windows版本上都表现相同，但WoW64的实现取决于目标处理器架构。举例来说，面向Intel Itanium 2处理器（即IA-64架构）开发的64位Windows版本，会使用Wow64win.dll在Itanium 2的独有指令集中设置x86指令的仿真。这种仿真会比 Wow64win.dll的函数在x86-64架构（也称“Intel 64”或“AMD64”）上的计算代价更昂贵，因为当有必要执行32位线程时，处理器硬件必须从64位模式切换到兼容模式，然后再切换回64位模式。

 注册表和文件系统 
WoW64子系统也处理其他运行32位应用程序所必需的关键问题。它参与32位应用程序与Windows组件的互动，例如注册表，64位与32位应用程序会使用不同的键。举例来说，HKEY_LOCAL_MACHINE\Software\Wow6432Node 是 HKEY_LOCAL_MACHINE\Software 的32位环境版本，并且32位应用程序不会感觉到这种重定向。有些注册表键是等效从64位映射到32位，还有些则是内容镜像，这取决于Windows的版本。

操作系统使用%SystemRoot%\system32目录放置其64位函数库和可执行文件。这样做的原因是考虑到向后兼容性，许多旧款程序采用硬编码使用该路径。当执行32位应用程序时，WoW64会将32位透明重定向到 %SystemRoot%\SysWoW64，那里放着32位函数库和可执行文件。32位应用程序不会知道自己在64位操作系统上运行。32位应用程序可以通过伪目录%SystemRoot%\sysnative访问真实的存有64位函数库和可执行文件的文件夹%SystemRoot%\System32 。

你会看到有两个Program Files目录可见，里面分别放着32位和64位应用程序。存储32位文件的目录名为 Program Files (x86) 以区分两者，而64位目录使用原有的 Program Files 为名，不附加任何限定名称。

 应用程序兼容性 
只包含32位内核模式驱动程序，或者插入组件到仅64位实现的组件进程（例如Windows Explorer）的内存空间的32位应用程序不能在64位平台上执行。32位服务程序是支持的。SysWOW64文件夹位于操作系统所在分区的Windows文件夹，其包含许多支持32位应用程序的程序（例如cmd.exe、odbcad32.exe，为32位应用程序注册ODBC连接等）。面向MS-DOS和Windows早期版本的16位应用程序通常不兼容64位版本的Windows Vista、7和8，但可以通过Windows Virtual PC或DOSBox运行在16位或32位的Windows操作系统上。32位版本的Windows XP、Vista、7和8在另一方面通常也可以几乎无问题地运行16位应用程序。16位应用程序不能直接运行在x64版本的Windows上，因为CPU在x64模式下运行时不支持VM86。

Internet Explorer实现了32位与64位两个应用程序版本，因为互联网上有许多32位ActiveX组件，而它们不可能在64位版本上运行。Internet Explorer的32位版本被定为默认版本，并且64位版本不能被设置为默认浏览器。

WoW64 64位版本中透明层的一个程序错误导致所有依赖Windows API函数GetThreadContext的32位应用程序不兼容。此类应用包括应用程序调试器、调用堆栈跟踪器（例如IDE显示调用堆栈）和使用垃圾收集（GC）引擎的应用程序。受影响最广泛的一个GC引擎是Boehm GC，它被同样流行的Mono作为默认的垃圾收集引擎。虽然Mono截至2010年10月有一种新的、可选的GC（称作SGen-GC），但它与Boehm GC执行堆栈扫描的方式相同，因此它也不兼容WoW64。截至2010年11月15日，微软没有提供修复计划或变通解决方案。

 性能 
据微软介绍，运行在WOW64下的32位软件与在32位Windows上的执行性能相近，但可能增加少许线程和其他开销。

一个32位应用程序在64位系统上可以完全使用4GB虚拟内存，而在32位系统上，部分可寻址内存无法使用，因为那会被内核和内存映射的外部设备（如显卡）使用。

 参见 
 Windows on Windows
 使用者帳戶控制也有一个机制，将旧款程序写入到特定区域的文件处理到新位置。无管理员权限的进程将文件写入到system32将被重定向到一个虚拟存储目录。
 垫片

 参考资料 

 外部链接 
 关于在64位Windows上运行32位应用的MSDN页面 
 WOW64文件夹、变量、值和参考资料的综合资料 

Category:Windows NT
Category:兼容层