x64系统的判断和x64下文件和注册表访问的重定向(举例了GetProcAddress后转成函数指针的用法)
Posted 朝闻道
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了x64系统的判断和x64下文件和注册表访问的重定向(举例了GetProcAddress后转成函数指针的用法)相关的知识,希望对你有一定的参考价值。
判断一个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下重定向的问题。
http://blog.csdn.net/magictong/article/details/5838863
以上是关于x64系统的判断和x64下文件和注册表访问的重定向(举例了GetProcAddress后转成函数指针的用法)的主要内容,如果未能解决你的问题,请参考以下文章
将设置写入注册表,由 x64 和 x86 应用程序共享(绕过注册表重定向)
如何检测 x64 Windows 上是不是安装了 32 位 Java,仅查看文件系统和注册表?