最近开发有遇到这方面的一些知识点,在此记录下。
首先,什么是WOW64?在知道这个之前我觉得需要了解一下,C:\\Windows\\System32和C:\\Winodws\\SysWOW64这两个文件夹的区别,Windows系统最开始的时候出的就是32bit的系统,所以当时给文件夹命名System32,后来出了64bit系统,为了继续用这个文件夹,就把64位的一些库放到System32里面了,所以System32这个文件夹下的所有dll全是64位的,后来为了让32位的程式也能在64位上运行,就把32位的库放到SysWOW64下了,为啥叫WOW64,是因为其中的关键技术就是WOW64技术,它的存在保证了32位程式能够在64位的系统上运行。
所以综上所述,Wow64是64bit的Windows系统里面的一个模拟器技术名字(32bitOS没有),它存在的意义是保证32bit的程式可以在64位Windows系统上正常运行。
对应这个技术的Windows API名字叫做IsWow64Process,通过调用它可以获得是否使用了WOW64技术,如果是true表示使用了,可以确定系统是64位,但是值为false并不代表系统就是32位,只是表示没有使用WOW64,情况有很多种:32位程式在32位Windows OS下运行、64位程式在64位Windows OS下运行、64位程式在ARM64位 Windows下运行,所以得出结论:当参数2值是false时,IsWow64Process这个方法并不能准确的判断出Windows OS的Bit。
下面介绍下IsWow64Process函数的用法,通常用IsWow64Process都是通过GetProcAddress从Knernel32.dll中获取IsWow64Process函数首地址然后在调用,为啥不直接调用,是因为这样可以通过GetProcAddress是否调用成功来判断是否可以安全的调用IsWow64Process函数,因为可能有些系统不支持此函数。
typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE hProcess, PBOOL Wow64Process);
BOOL isWow64 = FALSE;
LPFN_ISWOW64PROCESS fnIsWow64Process = (LPFN_ISWOW64PROCESS)GetProcAddress(
GetModuleHandle(L"kernel32"), "IsWow64Process");
if(fnIsWow64Process != NULL)
{
if(! fnIsWow64Process(GetCurrentProcess(), &isWow64))
{
//error
}
else
{
if(isWow64)
{
//64bit
}
else
{
//32bit
}
}
}
可以看到,isWow64是true 和false分别就对应32bit,但这是因为我的程式是Win32程式,所以可以这样写,要是程式是64位的,你用这个就没法判断了,就得考虑用我下面介绍的方式:
用如下代码代替,主要是用到GetNativeSystemInfoWindows API,和IsWow64Process区别在于,这个API是从Windows XP开始就有了,而后者是从Windows XP with SP1&2才有
SYSTEM_INFOsi;
GetNativeSystemInfo(&si);
if (si.wProcessorArchitecture ==PROCESSOR_ARCHITECTURE_AMD64 ||
si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_IA64)
{
//"System is 64bit");
return TRUE;
}
else
{
//"System is 32bit");
return FALSE;
}
这个函数我稍微说明一下,其实它对应的就是系统环境变量PROCESSOR_ARCHITECTURE,该变量在32位系统为x86,在AMD的x64的机器和在Intel的x64机器上为AMD64,在安腾(Itanium)系统为IA64,即通过读取这个值来判断系统位数。
这个方式我比较建议使用,因为不管它对32和64位程式都是通用的。
//-----------------------------------------------------------------------------
最近有看到有关于WOW64重定向的一些说明,在网上查了下,它的使用背景时一些32位程式在64位系统上运行时,系统默认会把它的目录转向到C:\Windows\SysWOW64这个下面,这个功能默认时打开的,如果说想关闭这个功能,可以调用Wow64EnableWow64FsRedirection(BOOLEAN Wow64FsEnableRedirection),这个函数,参数为true表示开启,false表示关闭。此函式适用于想要存取原生system32目录的32位应用程序。根据预设,会启用WOW64档案系统重新导向,所以有些32位程式会先将它关闭。