x64系统的判断和x64下文件和注册表访问的重定向(1)

      判断一个32位应用程序是否运行在x64系统下,可以使用下面的代码:

BOOL IsX64System() { BOOL bIsWow64 = FALSE; typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS)(HANDLE, PBOOL); LPFN_ISWOW64PROCESS pfnIsWow64 = NULL; pfnIsWow64 = (LPFN_ISWOW64PROCESS)GetProcAddress( GetModuleHandle(_T("kernel32.dll")), "IsWow64Process"); if (pfnIsWow64) { if (!pfnIsWow64(GetCurrentProcess(), &bIsWow64)) { // handle error } } return bIsWow64; }

      函数返回真则是运行在x64下,其实IsWow64Process是一个API,这里之所以从dll中导出来使用是因为32位系统的kernel32.dll里面是没有这个函数导出函数的,直接使用有问题。另外就是我看了几份网上的代码,写得有点小问题,很多是判断IsWow64Process的返回值来决定是否运行在x64下,这是不对的,说明下,IsWow64Process的返回值只说明函数是否成功了,要看是否运行在x64下要看这个API第二个传出参数的值。

      另外就是获得处理器的架构,数量页面大小时,x64下要调用GetNativeSystemInfo,而32位系统是调用GetSystemInfo,有点点小小的区别,要注意一下,详细可以参见一下MSDN,代码在下面,GetNativeSystemInfo要导出来使用的原因同上(主要是防止意外):

BOOL GetSystemInfoEx(SYSTEM_INFO *pSystemInfo) { BOOL bRet = FALSE; if (!pSystemInfo) goto Exit0; typedef void (WINAPI *PGNSI)(LPSYSTEM_INFO); PGNSI pfnGNSI = NULL; ZeroMemory(pSystemInfo, sizeof(SYSTEM_INFO)); if (IsX64System()) { // x64下要调用这个API pfnGNSI = (PGNSI)GetProcAddress( GetModuleHandle(_T("kernel32.dll")), "GetNativeSystemInfo"); if (!pfnGNSI) goto Exit0; pfnGNSI(pSystemInfo); } else { // 32位系统调用下面的API GetSystemInfo(pSystemInfo); } bRet = TRUE; Exit0: return bRet; }

 

      可以看看我的系统o(∩_∩)o :

x64系统的判断和x64下文件和注册表访问的重定向(1)_第1张图片

 

      下次再讲讲x64下重定向的问题。

你可能感兴趣的:(api,System,dll,winapi)