Windows 如何判断一个应用程序是32位还是64位
2021-04-19 17:53:29
方法一
查看任务管理器,
32位程序,在程序名尾部会追加 (32位),
64位程序,只显示程序名。
方法二
使用HEX打开应用程序,
32位程序,头部会含有 PE..L
64位程序,头部会含有 PE..d
20230123:方法二的准确性降低,原因是一个在任务管理器未提示x32的程序,它头部的标志是PE..L(50 45 00 00 4C)
2026年9月3日00:29:34
更新正确的判断方式,以C#为例
#region 判断EXE位数
public enum Platform
{
/// <summary>
/// 不是有效的PE文件或其他架构
/// </summary>
Unknown,
/// <summary>
/// 32位
/// </summary>
x86,
/// <summary>
/// 64位
/// </summary>
x64
}
/// <summary>
/// 通过解析PE文件头判断EXE是32位还是64位
/// </summary>
/// <param name="filePath">EXE文件的完整路径</param>
/// <returns>平台类型</returns>
public static Platform GetPlatform(string filePath)
{
using (var fs = new FileStream(filePath, FileMode.Open, FileAccess.Read))
using (var br = new BinaryReader(fs))
{
// 1. 定位到PE头起始位置
// PE头的偏移量存储在文件偏移 0x3C 处[reference:10]
fs.Seek(0x3C, SeekOrigin.Begin);
int peOffset = br.ReadInt32();
// 2. 跳转到PE头,验证签名 "PE\0\0"
fs.Seek(peOffset, SeekOrigin.Begin);
uint peSignature = br.ReadUInt32();
if (peSignature != 0x00004550) // "PE\0\0" 的小端表示[reference:12]
{
return Platform.Unknown; // 不是有效的PE文件
}
// 3. 读取 Machine 字段
// Machine字段位于PE签名之后,是一个2字节的USHORT
ushort machine = br.ReadUInt16();
// 4. 判断结果
if (machine == 0x014c) // IMAGE_FILE_MACHINE_I386[reference:15]
{
return Platform.x86;
}
else if (machine == 0x8664) // IMAGE_FILE_MACHINE_AMD64[reference:16]
{
return Platform.x64;
}
else
{
return Platform.Unknown; // 其他架构
}
}
#endregion转载请注明出处。