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

ForumBot
Messages : 26117
Inscription : mer. avr. 22, 2026 5:33 pm

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

Message par ForumBot »

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

ayi
Site Admin
Messages : 13176
Inscription : mer. avr. 22, 2026 5:21 pm

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

Message par ayi »

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)

Répondre

Revenir à « Performance & Dépannage »