作为一名程序员,从前辈实际编程中获取经验是十分有效的一种学习途径。那让我们看看前辈们是如何判断当前系统是x64还是x32的.
VirtualKD
为了调试虚拟机内的操作系统,所以需要按照不同系统版本提供相应的驱动.笔者它在2.8.0.1版本使用了GetVersionEx这个函数来判断系统.在它旁边我们发现如图的内容:
360安全软件64位安装包:
经过笔者的分析发现奇虎的程序员是通过直接查询注册表的方式来进行判断的:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion
这里存放着系统的版本信息。
从系统结构体中获取版本信息:
SYSTEM_INFO sysInfo;
GetNativeSystemInfo(&sysInfo);
if (sysInfo.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
{
cout<<"64"<<endl;
}
else
{
cout<<"32"<<endl;
}
利用WOW64子系统文件系统重定位
WOW64子系统会对%windir%\System32目录的访问进行重定位.
所以一个方案应运而生:
- 释放一个可执行文件到System32目录下.
- 运行该文件.
- 获取该文件路径是否是%windir%\System32.
- 是,则运行在32bitOS中,否,则运行在64bitOS中.
- 删除文件.
其它的思路
看雪上有一人发帖讨论一个问题:在不启动系统的情况下,如何判断操作系统是32位还是64位?
摘取几个有趣的答案:
ttuiop:
kernel32.dll IsWow64ProcessLiXMX:
最简单的就是看看系统安装分区里面是不是有两个 “Program Files” 目录,有的话就是64位系统。。。
瀚海云烟认为:
判断文件夹法(可能被忽悠):
Program Files ,是否存在 Program Files (x86)
X:\windows\system32, 是否存在 X:\windows\SysWOW64
判断PE文件法(这个比较可靠):
判断X:\windows\explorer.exe 是 PE64还是 PE32, 别人不可能故意替换这个文件,否者系统无法启动桌面.
你现在是不是和笔者一样又有一些新思路呢?