Comment puis-je tester un fichier DLL Windows pour determiner s'il est 32 bits ou 64 bits ?

Comment puis-je tester un fichier DLL Windows pour determiner s’il est 32 bits ou 64 bits ?

Details techniques

Un DLL utilise le format d’executable PE, et il n’est pas trop complique de lire ces informations a partir du fichier.

Consultez cet article MSDN sur le format de fichier PE pour un apercu. Vous devez lire l’en-tete MS-DOS, puis lire la structure IMAGE_NT_HEADERS. Celle-ci contient la structure IMAGE_FILE_HEADER qui contient l’information dont vous avez besoin dans le membre Machine, qui contient l’une des valeurs suivantes :

  • IMAGE_FILE_MACHINE_I386 (0x014c)

  • IMAGE_FILE_MACHINE_IA64 (0x0200)

  • IMAGE_FILE_MACHINE_AMD64 (0x8664)

Ces informations devraient se trouver a un emplacement fixe dans le fichier, mais je recommanderais tout de meme de parcourir le fichier et de verifier la signature de l’en-tete MS-DOS et de IMAGE_NT_HEADERS pour etre sur de gerer tout changement futur.

Utiliser ImageHelp pour lire les en-tetes…

Vous pouvez egalement utiliser l’API ImageHelp pour cela - chargez la DLL avec LoadImage et vous obtiendrez une structure LOADED_IMAGE qui contiendra un pointeur vers une structure IMAGE_NT_HEADERS. Liberez la LOADED_IMAGE avec ImageUnload.

…ou adaptez ce script Perl approximatif

Voici un script Perl approximatif qui fait le travail. Il verifie que le fichier possede un en-tete DOS, puis lit le decalage PE depuis IMAGE_DOS_HEADER a 60 octets dans le fichier.

Il se positionne ensuite au debut de la partie PE, lit la signature et la verifie, puis extrait la valeur qui nous interesse.

`#!/usr/bin/perl

usage: petype

$exe = $ARGV[0];

open(EXE, $exe) or die “can’t open $exe: $!”;
binmode(EXE);
if (read(EXE, $doshdr, 64)) {

($magic,$skip,$offset)=unpack(‘a2a58l’, $doshdr);
die("Not a

(Reponse tronquee)