WOW64

来自BetaHeritage Wiki
跳到导航 跳到搜索

模板:正在施工

WOW64 (Windows-on-Windows 64-bit )是一个Windows操作系统的子系统, 它为现有的 32 位应用程序提供了 32 位的模拟,可以使大多数 32 位应用程序在无需修改的情况下运行在 Windows 64 位版本上。该功能也是64位系统的兼容性基础,没了它,大部分的32位应用程序都将难以运行。

目前臭名昭著的Flash Player Helper Service就运行在Windows系统的"C:\Windows\SysWOW64\Macromed\Flash\FlashHelperService.exe"当中.

简介

它类似于旧的 WOW32 子系统,负责在 Windows 32 位版本下运行 16 位的代码。

硬件本身具有 32 位兼容性模式,可以处理 IA-32 指令的实际执行,而 WOW 层处理诸如在 32 位和 64 位模式之间切换处理器以及模拟 32 位系统的事务。例如,32 位和 64 位程序具有不同的注册表配置单元。还有一个用于 32 位二进制文件的不同的系统目录。64 位二进制文件仍然使用 System32 目录,因此,当 32 位应用程序安装到系统中时,WOW 层会确保将 32 位二进制文件置于一个新的目录 SysWOW64 中。这是通过如下方式实现的:根据应用程序是否运行在 WOW 下,截获对 API 的调用(如 GetSystemDirectory)并返回适当的目录。相同的问题可能会存在于注册表中。因为 32 位和 64 位的 COM 服务器都可以安装在系统上,并位于相同的类标识符 (CLSID) 下,因此 WOW 层需要将对注册表的调用重定向到适当的 32 位或 64 位配置单元中。WOW 层也会处理注册表中某些区域之间的镜像更改,以便使其更简单地支持 32 位和 64 位代码之间的交互操作。

WOW64 非常重要,因为当不关注性能和可伸缩性的问题时,它使您可以利用大多数现有的 32 位代码。它是两种方法的最佳结合。您可以将您的服务迁移到 64 位,同时将 Microsoft 管理控制台 (MMC) 配置管理单元保留为 32 位。Windows 64 位版本包括 MMC 的 32 位和 64 位的版本。当选择保留管理工具为 32 位时,进程间的通讯可能会遇到某些问题,但是只要接口设计正确,诸如远程过程调用 (RPC) 的协议应该可以在 32 位和 64 位进程之间运行。有关 WOW64 的另外一点需要牢记:它并不是为要求高性能的应用程序而设计的。至少,WOW64 子系统需要将 32 位参数扩展到 64 位,并且需要将 64 位的返回值截断为 32 位。在最糟糕的情况下,WOW64 子系统将需要进行内核调用,涉及到的不仅仅是到内核的转换,还有从处理器的 32 位兼容性模式到其本机 64 位模式的转换。

在 WOW64 下运行时,应用程序将无法妥当地进行调整。对于那些您要将其保留为 32 位的应用程序而言,请在 WOW64 下测试它们。如果性能不能满足您的期望,您需要考虑将应用程序迁移到 64 位。

实现

WOW64 是在用户模式下实现的,作为 ntdll.dll 和内核之间的层。WOW64 及其支持的一些 DLL 仅仅是可以加载到 32 位进程中的 64 位的 DLL。对于所有其他情况,进程保持为纯进程。32 位的进程无法加载 64 位的 DLL,反之亦然。

转换库

WoW64子系统是一个轻量级的compatibility layer, 在所有版本的windows上都拥有同样的接口. 它的主要目的是用来创建32-bit环境, 为了让32位的应用程序可以不经过任何修改就运行在64-bit的系统上, 它提供了必须的接口.

技术上说, WOW64是由三个DLL实现的.

Wow64.dll 是Windows NT kernel的核心接口, 在32位和64位调用之间进行转换, 包括指针和调用栈的操控. Wow64win.dll 为32位应用程序提供合适的入口指针. Wow64cpu.dll 负责将处理器在32位和64位的模式之间转换。

注册表和文件系统

WOW子系统也会处理运行64-bit应用程序的其他关键方面. 比如说, 在管理32位应用程序与windows注册表的交互时, 会给存储子系统提供接口(32位的注册表与64位的注册表不太一样.) 操作系统使用%SystemRoot%\system32目录来存储64-bit的库文件和可执行文件. 这样做是为了向后兼容, 因为很多旧系统的应用程序都是使用hardcoded的方式来获取这个路径的. 当执行32位应用程序的时候, WOW64会将对DLL的请求从system32重定向到%SystemRoot%\SysWOW64, 在SysWOW64目录中, 包含了旧系统的库和可执行文件.

存在

Windows 2000 Limited Edition

Windows XP Professional x64 Edition

IA-64 64-bit版本的Windows Server 2003

64-bit版本的Windows Vista

64-bit版本的Windows Server 2008

64-bit版本的Windows 7

Windows server 2008 R2上, 这是一个可选组件.

WoW64被设计用来处理许多在32-bit Windows 和64-bit Windows之间的不同, 尤其是在Windows自身的结构变化上的不同。

虚拟内存的使用

默认情况下,Windows 32 位版本的地址空间限制在 4 GB,其中一半是为内核保留的。这限制了普通的应用程序只能使用 2 GB 的有效虚拟内存。2 GB看起来好像很多,但是由于错误的分配算法、大型文件映射甚至过多的使用 DLL,地址空间很容易在应用程序中变得零碎。看一下任务管理器中的“VM Size”列,就会发现普通应用程序消耗的虚拟内存量。当然,就像过去的 DOS 时期(利用 XMS/EMS)一样,有很多种方法可以使 32 位的应用程序访问多于 4 GB 的物理内存。进入物理地址扩展 (PAE) 和地址窗口扩展(Address Windowing Extensions,AWE)。PAE 通过将地址位的数量从 32 扩展到 36 来工作,这样使应用程序可以寻址的空间达到 64 GB。AWE 使应用程序可以将大于 4 GB 的物理内存范围映射到虚拟地址空间中。这两种方法都引入了开销并增加了代码的复杂性。

Windows 64 位版本提供 16 TB 的有效寻址空间,其中一半可用于用户模式的应用程序。这意味着整个数据库可以移动到内存中,显著地提高了性能,或者整个网站可以缓存到内存中。它还可以使代码保留并委托到巨型的邻近虚拟内存块中,无需实际地担心虚拟内存碎片问题。这也考虑到了巨型文件映射对象或共享的内存部分。

判断方法及模式

其中程序有三种情况: 一是64bit的程序跑在64bit下,那么不是wow64模式,返回0

二是32bit程序跑在64bit下,是wow64模式,返回1.

三是32bit程序跑在32bit下,返回0.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS)(HANDLE, PBOOL);

LPFN_ISWOW64PROCESS fnIsWow64Process;


BOOL IsWow64()

{

   BOOL bIsWow64 = FALSE;

   fnIsWow64Process = (LPFN_ISWOW64PROCESS)GetProcAddress(

                       GetModuleHandle(TEXT("kernel32")),"IsWow64Process");


   if (NULL != fnIsWow64Process)

   {

     if (!fnIsWow64Process(GetCurrentProcess(),&bIsWow64))

    {

           // handle error    

    }

   }


   return bIsWow64;

 }