欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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文件的运行环境,因此判断该变量就可以获取其可运行的环境。