C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


■85317 / )  Re[4]: CPUタイプを判別する方法
□投稿者/ 魔界の仮面弁士 (1422回)-(2017/10/06(Fri) 12:18:40)
2017/10/06(Fri) 17:44:51 編集(投稿者)

No85314 (餓狼 さん) に返信
> https://dobon.net/vb/dotnet/system/is64bit.html
> 解決しました

自プロセスに対して判断する場合は、上記の手法が一般的ですね。

ちなみに、アセンブリ(EXE や DLL)から調査する場合は
 CorFlags WindowsApplication1.exe
 CorFlags Library1.dll
のようにして確認できます。


=== 以下蛇足 ===

【VS2012 以上に付属の CorFlags の場合】
PE = PE32+ および 32BITREQ = 0 および 32BITPREF = 0 → x64 ビルド
PE = PE32 および 32BITREQ = 1 および 32BITPREF = 0 → x86 ビルド
PE = PE32 および 32BITREQ = 0 および 32BITPREF = 1 → Any CPU (32 ビットの優先: On) ビルド
PE = PE32 および 32BITREQ = 0 および 32BITPREF = 0 → Any CPU (32 ビットの優先: Off) ビルド

【VS2010 以下に付属の CorFlags の場合】
PE = PE32+ および 32BIT = 0 → x64 ビルド
PE = PE32 および 32BIT = 1 → x86 ビルド
PE = PE32 および 32BIT = 0 → Any CPU ビルド


VS2012 以降で追加された "32 ビットの優先" フラグの状態を
VS2010 以下の CorFlags.exe で判定したい場合は、
"CorFlags" フィールドの値を確認してみてください。
たとえば 131075 (0x20003) が得られた場合には
32 ビットの優先 On な AnyCPU としてビルドされています。


ツールに頼らず、直接 PE ヘッダーを読み取る場合はこのあたり。

IMAGE_FILE_HEADER.Machine
 0x014c (IMAGE_FILE_MACHINE_I386) x86
 0x0200 (IMAGE_FILE_MACHINE_IA64) Intel Itanium
 0x8664 (IMAGE_FILE_MACHINE_AMD64) x64

IMAGE_OPTIONAL_HEADER32.Magic / IMAGE_NT_OPTIONAL_HDR64_MAGIC.Magic
 0x10b (IMAGE_NT_OPTIONAL_HDR32_MAGIC) PE32
 0x20b (IMAGE_NT_OPTIONAL_HDR64_MAGIC) PE32+


"32bit の優先" の方は、CLR ヘッダーから CorFlags を読むことになりそう。
(IMAGE_COR20_HEADER.Flags)
https://jstdev.wordpress.com/2014/02/16/clr-header/
https://qiita.com/katabamisan/items/ae94ff3b582dd42de44a

=== 追記 ===
以下、[corhdr.h] より。

0x00000001: COMIMAGE_FLAGS_ILONLY
0x00000002: COMIMAGE_FLAGS_32BITREQUIRED
0x00000004: COMIMAGE_FLAGS_IL_LIBRARY
0x00000008: COMIMAGE_FLAGS_STRONGNAMESIGNED
0x00000010: COMIMAGE_FLAGS_NATIVE_ENTRYPOINT
0x00010000: COMIMAGE_FLAGS_TRACKDEBUGDATA
0x00020000: COMIMAGE_FLAGS_32BITPREFERRED
解決済み
返信 編集キー/


管理者用

- Child Tree -