(d'un autre Q, supprimé depuis)
Type de machine : Il s'agit d'un petit bout de code rapide que j'ai basé sur un autre qui récupère l'horodatage du linker. C'est dans le même en-tête, et cela semble fonctionner - il retourne I386 quand il est compilé - n'importe quel processeur -, et x64 quand il est compilé avec cette plate-forme comme cible.
L'article de blog Exploring PE Headers (K. Stanton, MSDN) qui m'a montré le décalage, comme l'a indiqué une autre réponse.
public enum MachineType {
Native = 0, I386 = 0x014c, Itanium = 0x0200, x64 = 0x8664
}
public static MachineType GetMachineType(string fileName)
{
const int PE_POINTER_OFFSET = 60;
const int MACHINE_OFFSET = 4;
byte[] data = new byte[4096];
using (Stream s = new FileStream(fileName, FileMode.Open, FileAccess.Read)) {
s.Read(data, 0, 4096);
}
// dos header is 64 bytes, last element, long (4 bytes) is the address of the PE header
int PE_HEADER_ADDR = BitConverter.ToInt32(data, PE_POINTER_OFFSET);
int machineUint = BitConverter.ToUInt16(data, PE_HEADER_ADDR + MACHINE_OFFSET);
return (MachineType)machineUint;
}
1 votes
Cela répond-il à votre question ? Comment savoir si un fichier DLL natif est compilé en x64 ou en x86 ?