• 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

  • 相关阅读:
    2016计算机专业考研:c++大学教程第二版目录(下)
    2016考研计算机考研备考书籍推荐
    2014年计算机考研真题重点选择题部分真题及解析
    2016计算机考研:数据结构常用算法精析
    2015考研计算机专业基础综合试题真题及答案(1)
    java串讲之String 如何定义字符串对象
    WindowsService
    sql 将datetime类型转化为指定格式的字符串
    C# 利用SMTP异步发送邮件
    Visual Studio
  • 原文地址:https://www.cnblogs.com/findumars/p/6143380.html
Copyright © 2020-2023  润新知