(转载)判断PE文件是32位还是64位的

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

代码比较简单,主要就是通过PE中的一个域实现的,通过代码比较容易就能看的出来。

posted @ 2014-11-17 21:01  kms_hhl  阅读(511)  评论(0编辑  收藏  举报