Windows下判断PE文件是32位还是64位程序
程序员文章站
2022-05-08 13:37:11
...
int __stdcall get_file_machine_bit(const WCHAR * pwszFullPath)
{
FILE * peFile = NULL;
_wfopen_s(&peFile, pwszFullPath, L"rb");
if (peFile == NULL)
{
fclose(peFile);
return -1;
}
IMAGE_DOS_HEADER imageDosHeader;
fread(&imageDosHeader, sizeof(IMAGE_DOS_HEADER), 1, peFile);
if (imageDosHeader.e_magic != IMAGE_DOS_SIGNATURE)
{
fclose(peFile);
return -1;
}
IMAGE_NT_HEADERS imageNtHeaders;
fseek(peFile, imageDosHeader.e_lfanew, SEEK_SET);
fread(&imageNtHeaders, sizeof(IMAGE_NT_HEADERS), 1, peFile);
fclose(peFile);
if (imageNtHeaders.Signature != IMAGE_NT_SIGNATURE)
{
return -1;
}
if (imageNtHeaders.FileHeader.Machine == IMAGE_FILE_MACHINE_I386)
{
return 32;
}
if (imageNtHeaders.FileHeader.Machine == IMAGE_FILE_MACHINE_IA64 ||
imageNtHeaders.FileHeader.Machine == IMAGE_FILE_MACHINE_AMD64)
{
return 64;
}
return -1;
}
上述程序当文件为32位可执行文件的时候返回32,财神网www.973949.com并为64位可执行文件时返回64。需要包含头文件windows.h或WinNT.h
其中
IMAGE_DOS_HEADER中的e_lfanew是IMAGE_NT_HEADERS的偏移量。
IMAGE_NT_HEADERS 结构定义: http://msdn.microsoft.com/en-us/library/windows/desktop/ms680336(v=vs.85).aspx
IMAGE_FILE_HEADER 结构定义: http://msdn.microsoft.com/en-us/library/windows/desktop/ms680313(v=vs.85).aspx
IMAGE_FILE_HEADER 中的Machine定义了PE文件的运行环境,因此判断该变量就可以获取其可运行的环境。