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)