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

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

[cpp] view plain copy

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

函数返回真则是运行在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. typedef void (WINAPI *PGNSI)(LPSYSTEM_INFO);
  7. PGNSI pfnGNSI = NULL;
  8. ZeroMemory(pSystemInfo, sizeof(SYSTEM_INFO));
  9. if (IsX64System())
  10. {
  11. // x64下要调用这个API
  12. pfnGNSI = (PGNSI)GetProcAddress(
  13. GetModuleHandle(_T("kernel32.dll")), "GetNativeSystemInfo");
  14. if (!pfnGNSI)
  15. goto Exit0;
  16. pfnGNSI(pSystemInfo);
  17. }
  18. else
  19. {
  20. // 32位系统调用下面的API
  21. GetSystemInfo(pSystemInfo);
  22. }
  23. bRet = TRUE;
  24. Exit0:
  25. return bRet;
  26. }

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

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

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

时间: 2024-08-01 17:00:22

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

x64系统的判断和x64下文件和注册表访问的重定向——补记

原来的地址 x64系统的判断和x64下文件和注册表访问的重定向(1) x64系统的判断和x64下文件和注册表访问的重定向(2) x64系统的判断和x64下文件和注册表访问的重定向(3) 之前在(3)里面讨论过%ProgramFiles%这个环境变量的指向问题,其实在x64环境下面还有两个环境变量可以使用:%ProgramFiles(x86)%和%ProgramW6432%,如果你的系统安装在C盘,那么对应关系是这样的(注32位系统只有%ProgramFiles%,这里不讨论): %Program

ATL使用.rgs注册脚本文件操作注册表注册Com组件

1.      ATL注册组件 1.1     创建注册脚本 注册脚本通过操作 系统注册表完成Com服务的注册,通过数字形式而非代码API的形式完成,这种形式显得更加简单有效,因为它只需要几行数字代码就可以将一个Key添加到注册表中. 使用ATL向导时,会自动的生成一个后缀为.rgs的注册脚本文件,ATL在服务安装时,会自动的调用脚本文件,实现对注册表的修改,完成Com服务的注册. 1.1.1       基本术语 符号释义 符号 解释 ::= 相等 | 或 X+ 一个或多个Xs [X] X是可

【读书笔记】C#高级编程 第二十四章 文件和注册表操作

(一)文件和注册表 对于文件系统操作,相关的类几乎都在System.IO名称空间中,而注册表操作由System.Win32名称空间中的类来处理. (二)管理文件系统 System.MarshalByRefObject--这是.NET类中用于远程操作的基对象类,它允许在应用程序域之间编组数据. FileSystemInfo--这是表示任何文件系统对象的基类. FileInfo和File--这些类表示文件系统上的文件. DirectoryInfo和Directory--这些类表示文件系统上的文件夹.

Windows下通过写注册表的方式实现程序开机自启动

程序可以读取同目录下的config.ini文件中的配置来实现开机自启动. config.ini文件地格式实例如下: [Main] KeyName = test ProcessPath = D:\bin\test.exe 其中KeyName字段为写入注册表的表项名称(可以设置为程序名) ProcessPath为程序的完整路径 程序的完整源代码如下. regedit函数实现注册表写入,autopen实现开机自启动. 编译后的程序在此下载:程序下载 #include <stdio.h> #inclu

Ch25 文件和注册表操作(2)-- 读写文件

老早之前就有一个想法,写一个小程序,可以读取文档,可以查找替换关键字,其实也是很简单的,正好最近看到文件系统这章,今天下午没事也就做了一个,这里总结一下: 1.用StreamReader读取文本文件,编码用Encoding.Default. StreamReader sr = new StreamReader(filePath,Encoding.Default); rtbContent.Text = sr.ReadToEnd(); sr.Close(); //释放锁定资源 2.统计要查找的字符,

彻底清除Window7下的360注册表

当流氓360遇到强迫症,将注定有一场厮杀... 今天装了个虚拟机,其中win7系统是在网上随便下载了一个,是非纯净版的,自带了360在内的好多软件,其他软件都轻松删掉,但查看注册表时发现竟然有360残余,如图: 尼玛,竟然不能删除... 于是,重启进入安全模式进行尝试,然并卵,仍然不能删除... 哎呦,我这个暴脾气... 于是用ARK工具尝试一下,先介绍一下ARK工具,下面这段是从网上拷贝的... ARK工具 (Anti Rootkit) ,又叫反内核工具,运行时具有最高的系统权限.代表工具有:

Ch25 文件和注册表操作(1)--文件系统

1.文件系统操作,相关的累在 System.IO命名空间中,而注册表操作由System.Win32命名空间中的类执行. 2.System.Runtime.Serialization都与串行化有关,串行化是把一些数据(如文档的内容)转化为字节流并存储在某个地方的过程. 3.FileSystemInfo---表示任何文件系统对象的基类 4.FileInfo和File---表示文件系统上的文件 5.DirectoryInfo和Directory---表示文件系统上的文件夹 只需要执行一次时,用File

无法在Windows 7下删除/修改注册表项:权限不足

在注册表的某些关键项(譬如:System.Root),连Administrator都没有权限进行修改,因为只有"system"有权限. [警告]切勿企图进行注册表上层权限覆盖低层权限的方式来使Administrator或其他用户夺权,这样会导致很多Windows服务都无法打开!!!甚至Windows就此挂掉! (像我这个傻B刚才就进行了上面的操作...... 如果像我这样操作了,就要看我上一条博客,把注册表权限恢复默认.) [正确操作] 使用 psexec.exe,以 system 身

C#注册表访问程序Win7系统下报错 “不允许所请求的注册表访问权”

今天一个同事安装完系统的客户端程序后,给发来一个报错截图,如下: 这个是在软件登陆时,有一个保存系统用户名的设置保存到注册表里,一直用着都没问题,今天却报错了.一问才知道他用的win7系统,看来win7对注册表的修改做了一定的限制. 经过测试可以通过修改程序的兼容性及设置权限来解决.因为这个程序是ClickOnce程序,所以要找到这个程序也不容易,动用windows的搜索功能吧,程序安装完会在xxx这样类似的一个目录下,找到启动的主程序,点右键"属性",点"兼容性"