views:

514

answers:

2

Hello, I am trying to find a programmatic way to tell if a binary is x86, x64, or ia64.

Platform: Windows. Language: c/c++.

Background: Before trying to load a third-party dll, I need to find out its bitness.

Appreciate any pointers.

+7  A: 

For EXEs

use GetBinaryType(...)

Here is same question for manged exe.

For DLLs (and EXEs)

Use the ImageNtHeader(...) to get the PE data of the file and then check the IMAGE_FILE_HEADER.Machine field.

Here is some code I found using Google Code Search

No Cleanup and NO error checking

// map the file to our address space
// first, create a file mapping object
hMap = CreateFileMapping( 
  hFile, 
  NULL,           // security attrs
  PAGE_READONLY,  // protection flags
  0,              // max size - high DWORD
  0,              // max size - low DWORD      
  NULL );         // mapping name - not used

// next, map the file to our address space
void* mapAddr = MapViewOfFileEx( 
  hMap,             // mapping object
  FILE_MAP_READ,  // desired access
  0,              // loc to map - hi DWORD
  0,              // loc to map - lo DWORD
  0,              // #bytes to map - 0=all
  NULL );         // suggested map addr

peHdr = ImageNtHeader( mapAddr );
Shay Erlichmen
Thanks for the reply. Looks like that particular API is going to just fail for .dll.
A: 

You can check the PE header yourself to read the IMAGE_FILE_MACHINE field. Here's a C# implementation that shouldn't be too hard to adapt to C++.

yoyoyoyosef