(转载)判断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中的一个域实现的,通过代码比较容易就能看的出来。