您的位置:首页 > 编程语言 > PHP开发

x64系统的判断和x64下文件和注册表访问的重定向(举例了GetProcAddress后转成函数指针的用法)

2016-12-08 00:23 453 查看
判断一个32位应用程序是否运行在x64系统下,可以使用下面的代码:

[cpp] view plain copy

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要导出来使用的原因同上(主要是防止意外):

[c-sharp] view plain copy

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: