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

Posted 朝闻道

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了x64系统的判断和x64下文件和注册表访问的重定向(举例了GetProcAddress后转成函数指针的用法)相关的知识,希望对你有一定的参考价值。

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

 

[cpp] view plain copy
 
  1. BOOL IsX64System()  
  2. {  
  3.     BOOL bIsWow64 = FALSE;  
  4.   
  5.     typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS)(HANDLE, PBOOL);  
  6.     LPFN_ISWOW64PROCESS pfnIsWow64 = NULL;  
  7.   
  8.     pfnIsWow64 = (LPFN_ISWOW64PROCESS)GetProcAddress(  
  9.         GetModuleHandle(_T("kernel32.dll")), "IsWow64Process");  
  10.     if (pfnIsWow64)  
  11.     {  
  12.         if (!pfnIsWow64(GetCurrentProcess(), &bIsWow64))  
  13.         {  
  14.             // handle error  
  15.         }  
  16.     }  
  17.   
  18.     return bIsWow64;  
  19. }  

 

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

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

 

[c-sharp] view plain copy
 
  1. BOOL GetSystemInfoEx(SYSTEM_INFO *pSystemInfo)  
  2. {  
  3.     BOOL bRet = FALSE;  
  4.     if (!pSystemInfo)  
  5.         goto Exit0;  
  6.   
  7.     typedef void (WINAPI *PGNSI)(LPSYSTEM_INFO);  
  8.     PGNSI pfnGNSI = NULL;  
  9.   
  10.     ZeroMemory(pSystemInfo, sizeof(SYSTEM_INFO));  
  11.     if (IsX64System())  
  12.     {  
  13.         // x64下要调用这个API  
  14.         pfnGNSI = (PGNSI)GetProcAddress(  
  15.             GetModuleHandle(_T("kernel32.dll")), "GetNativeSystemInfo");  
  16.         if (!pfnGNSI)  
  17.             goto Exit0;  
  18.   
  19.         pfnGNSI(pSystemInfo);  
  20.     }  
  21.     else  
  22.     {  
  23.         // 32位系统调用下面的API  
  24.         GetSystemInfo(pSystemInfo);  
  25.     }  
  26.   
  27.     bRet = TRUE;  
  28. Exit0:  
  29.     return bRet;  
  30. }  

 

 

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

技术分享

 

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

 

http://blog.csdn.net/magictong/article/details/5838863

以上是关于x64系统的判断和x64下文件和注册表访问的重定向(举例了GetProcAddress后转成函数指针的用法)的主要内容,如果未能解决你的问题,请参考以下文章

将设置写入注册表,由 x64 和 x86 应用程序共享(绕过注册表重定向)

如何检测 x64 Windows 上是不是安装了 32 位 Java,仅查看文件系统和注册表?

从 x64 .NET 访问 x86 COM

win10 x64 手动注册ocx控件的方法

关于32位程序在64位系统下运行中需要注意的重定向问题(有图,很清楚)

Win7 x64 Vad遍历模块