x64系统的判断和x64下文件和注册表访问的重定向(1)
2013-10-30 13:20
169 查看
转载自:/article/1423221.html
判断一个32位应用程序是否运行在x64系统下,可以使用下面的代码:
[cpp] view
plaincopy
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
plaincopy
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下重定向的问题。
判断一个32位应用程序是否运行在x64系统下,可以使用下面的代码:
[cpp] view
plaincopy
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
plaincopy
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系统的判断和x64下文件和注册表访问的重定向(1)
- x64系统的判断和x64下文件和注册表访问的重定向(3)
- x64系统的判断和x64下文件和注册表访问的重定向(2)
- x64系统的判断和x64下文件和注册表访问的重定向(2)
- x64系统的判断和x64下文件和注册表访问的重定向(3)
- x64系统的判断和x64下文件和注册表访问的重定向(举例了GetProcAddress后转成函数指针的用法)
- x64系统的判断和x64下文件和注册表访问的重定向——补记
- x64系统的判断和x64下文件和注册表访问的重定向——补记
- X64系统 注册表和文件重定向 Python
- x64下文件和注册表访问的重定向
- 应对32位程序在64位系统上访问注册表和文件自动转向问题
- 应对32位程序在64位系统上访问注册表和文件自动转向问题
- 64位系统下文件重定向和注册表重定向
- 应对32位程序在64位系统上访问注册表和文件自动转向问题
- 应对32位程序在64位系统上访问注册表和文件自动转向问题
- 32位程序访问64位Windows操作系统存放64位系统文件的 \Windows\System32 目录时将遇到重定向目录问题
- 应对32位程序在64位系统上访问注册表和文件自动转向问题
- 使用 /sys 文件系统访问 Linux 内核
- Linux 中 7 个判断文件系统类型的方法