[解決済み】WindowsのDLLファイルが32ビットか64ビットかを判断するためのテスト方法は?[重複]。
質問
あるディレクトリにあるすべてのDLLファイルが特定のビルドタイプであることを保証するテストスクリプトまたはプログラムを書きたいのですが、どうすればいいですか?
SDKのビルドプロセスの最後に、64ビットバージョンに32ビットDLLファイルが含まれていないか、またはその逆になっていないかを確認するためのサニティチェックとして使用したいのです。
DLLファイルを見て、その種類を簡単に判断する方法はありますか?
解決策は、xp32とxp64の両方で動作するはずです。
どのように解決するのですか?
詳細
DLLはPE実行形式を使用しており、ファイルからその情報を読み出すのはそれほど厄介なことではありません。
こちらをご覧ください PEファイルフォーマットに関するMSDN記事 をご覧ください。MS-DOSのヘッダーを読み、次に 画像_nt_headers 構造体です。これには 画像_ファイル_ヘッダー 構造体には、次の値のいずれかを含む 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をロードします。 ロードイメージ を表示させれば LOADED_IMAGE 構造体はIMAGE_NT_HEADERS構造体へのポインタを含んでいます。LOADED_IMAGEはImageUnloadで解放します。
...または、次の荒い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);
関連
-
[解決済み] vbscriptのコンソールへの出力
-
[解決済み] cmd lineを使用してファイルをZIPする方法は?
-
[解決済み] 管理者として実行せずにネットワークドライブにマップするためのBATファイル
-
[解決済み] Windowsにpipをインストールするにはどうしたらいいですか?
-
[解決済み] WindowsのCMDで1行に2つのコマンドを実行するにはどうしたらいいですか?
-
[解決済み] バッチファイル内で改行をエコーする方法を教えてください。
-
[解決済み] Windowsでコマンドラインから空のファイルを作成するには?
-
[解決済み】WindowsでTCPまたはUDPポートをリッスンしているプロセスを見つけるにはどうすればよいですか?
-
[解決済み】Windowsでnpmをアップデートするにはどうすればいいですか?
-
[解決済み】あるLinuxが32bitか64bitかを判断する方法は?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】DockerリポジトリサーバーがHTTPSクライアントにHTTPレスポンスを返すようになった
-
[解決済み] 依存関係ウォーカー:DLLが見つからない
-
[解決済み] openssl' は内部コマンドまたは外部コマンドとして認識されません。
-
[解決済み] Postgres "psqlが内部コマンドまたは外部コマンドとして認識されない"
-
[解決済み] Sudoが見つかりません。npm install を試しています。
-
[解決済み] TensorFlow : cuInitの呼び出しに失敗しました。CUDA_ERROR_NO_DEVICE
-
[解決済み] docker-machine: マシン名がない、"default" が存在しない
-
[解決済み] npm' は内部または外部コマンド、操作可能なプログラムまたはバッチファイルとして認識されません。
-
[解決済み] git cloneです。<URL> の認証に失敗しました。
-
[解決済み] PowerShellのWrite-HostとWrite-Outputの違い?