Кровавые подробности
DLL использует исполняемый формат PE, и прочитать эту информацию из файла несложно.
См. статью MSDN о формате файлов PE для обзор. Вам нужно прочитать заголовок MS-DOS, а затем прочитать IMAGE_NT_HEADERS структура. Он содержит структуру IMAGE_FILE_HEADER, которая содержит информацию, которую вы необходимость в элементе Machine, который содержит одно из следующих значений
- IMAGE_FILE_MACHINE_I386 (0x014c)
- IMAGE_FILE_MACHINE_IA64 (0x0200)
- IMAGE_FILE_MACHINE_AMD64 (0x8664)
Эта информация должна иметь фиксированное смещение в файле, но я все же рекомендую просмотреть файл и проверить подпись заголовка MS-DOS и IMAGE_NT_HEADERS, чтобы быть уверенным, что вы справитесь с любыми будущими изменениями.
Используйте ImageHelp для чтения заголовков ...
Вы также можете использовать ImageHelp API для этого. - загрузите DLL с помощью LoadImage, и вы получить структуру LOADED_IMAGE, которая будет содержать указатель на структура IMAGE_NT_HEADERS. Освободите LOADED_IMAGE с помощью ImageUnload.
... или адаптировать этот грубый Perl-скрипт
Вот примерный сценарий Perl, который выполняет свою работу. Он проверяет, имеет ли файл заголовок DOS, затем считывает смещение PE из 60 байт IMAGE_DOS_HEADER в файл.
Затем он ищет начало PE-части, считывает подпись и проверяет ее, а затем извлекает интересующее нас значение.
#!/usr/bin/perl
#
# usage: petype <exefile>
#
$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 an executable") if ($magic ne 'MZ');
seek(EXE,$offset,SEEK_SET);
if (read(EXE, $pehdr, 6)){
($sig,$skip,$machine)=unpack('a2a2v', $pehdr);
die("No a PE Executable") if ($sig ne 'PE');
if ($machine == 0x014c){
print "i386\n";
}
elsif ($machine == 0x0200){
print "IA64\n";
}
elsif ($machine == 0x8664){
print "AMD64\n";
}
else{
printf("Unknown machine type 0x%lx\n", $machine);
}
}
}
close(EXE);
person
Paul Dixon
schedule
30.01.2009