Windows DLL ファイルをテストして、32 ビットか 64 ビットかを判断するにはどうすればよいですか?[重複]
-
20-08-2019 - |
質問
この質問にはすでに答えがあります:
指定されたディレクトリ内のすべての DLL ファイルが特定のビルド タイプであることを確認するテスト スクリプトまたはプログラムを作成したいと考えています。
これを SDK のビルド プロセスの最後に健全性チェックとして使用し、64 ビット バージョンに 32 ビット DLL ファイルが何らかの形で組み込まれていないこと、またはその逆のことを確認します。
DLL ファイルを調べてその種類を判断する簡単な方法はありますか?
このソリューションは xp32 と xp64 の両方で動作するはずです。
解決
悲惨な詳細
DLL は PE 実行可能形式を使用するため、ファイルからその情報を読み取るのはそれほど難しくありません。
これを参照してください PE ファイル形式に関する MSDN 記事 概要については。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 を使用してヘッダーを読み取ります...
を使用することもできます。 イメージヘルプ API これを行うには、DLLをロードします 画像のロード そしてあなたは LOADED_IMAGE IMAGE_NT_HEADERS 構造体へのポインタを含む構造体。ImageUnload を使用して LOADED_IMAGE の割り当てを解除します。
...または、この大まかな Perl スクリプトを適応させます
これが仕事を完了させる大まかな Perl スクリプトです。ファイルに DOS ヘッダーがあることを確認し、IMAGE_DOS_HEADER の 60 バイトから PE オフセットをファイルに読み取ります。
次に、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);
他のヒント
粗製の方法は、それぞれのDLLにVisual Studioツールからヘッダオプションを指定してDUMPBINを呼び出して、適切な出力を探すことになります
dumpbin /headers my32bit.dll PE signature found File Type: DLL FILE HEADER VALUES 14C machine (x86) 1 number of sections 45499E0A time date stamp Thu Nov 02 03:28:10 2006 0 file pointer to symbol table 0 number of symbols E0 size of optional header 2102 characteristics Executable 32 bit word machine DLL OPTIONAL HEADER VALUES 10B magic # (PE32)
あなたはそれがパウロが言及14C値を含む32ビットのDLLを、である出力のカップルの手がかりを見ることができます。スクリプト内で探しやすいはずです。
、あなたは "を使用することができますDLL上のファイル」ユーティリティ
file <filename>
このような出力を与えることになるます:
icuuc36.dll: MS-DOS executable PE for MS Windows (DLL) (GUI) Intel 80386 32-bit
依存関係ウォーカーは(もほぼ)すべてを伝えます。 http://www.dependencywalker.com/する
これは、それを得る、それを抽出し、幹部を実行-JUST「インストール」しません。 アプリケーション
|これは、任意のx32またはx64の窓モジュールのために動作します。 今思い出すと、すべての依存関係、すなわちDLLモジュール、およびAPPL以降を見ることが非常に簡単です。それはフルのx64、x32の(x86の)または各々のビットであればいずれか確認することができ、依存関係の和です。
モジュールがために建てられたCPUの種類は、「CPU」の欄にあります。ほとんどの64ビットAPは依然としてすべてのx86 B / W 32ビットAPが、それぞれのビットです。
オタク/プログラマのための美しいプログラムと、それは無料です...
私は正確にはない非常にシンプルなツールを書かれている - 。それはPEデコンストラクタと呼ばれています。
単にそれを起動し、あなたのDLLファイルをロードします:
上記の例では、ロードされたDLLは、32ビットである。
あなたは(私は唯一のATMをコンパイルした64ビットバージョンを持っている)、ここでそれをダウンロードすることができます。
http://files.quickmediasolutions.com/exe/pedeconstructor_0.1_amd64.exeする
古い32ビット版はこちら:
http://dl.dropbox.com/u/31080052/pedeconstructor.zipする