PE フォーマットのイメージファイルで使用されるオプションヘッダの情報を定義します。
(以下の定義は Win32 用の PE ファイルで使用される構造体です。 ROM イメージや Win64 の場合は異なります。)
#define IMAGE_NUMBEROF_DIRECTORY_ENTRIES 16
typedef struct _IMAGE_OPTIONAL_HEADER {
// 標準フィールド
WORD Magic;
BYTE MajorLinkerVersion;
BYTE MinorLinkerVersion;
DWORD SizeOfCode;
DWORD SizeOfInitializedData;
DWORD SizeOfUninitializedData;
DWORD AddressOfEntryPoint;
DWORD BaseOfCode;
DWORD BaseOfData;
// NT 固有フィールド
DWORD ImageBase;
DWORD SectionAlignment;
DWORD FileAlignment;
WORD MajorOperatingSystemVersion;
WORD MinorOperatingSystemVersion;
WORD MajorImageVersion;
WORD MinorImageVersion;
WORD MajorSubsystemVersion;
WORD MinorSubsystemVersion;
DWORD Win32VersionValue;
DWORD SizeOfImage;
DWORD SizeOfHeaders;
DWORD CheckSum;
WORD Subsystem;
WORD DllCharacteristics;
DWORD SizeOfStackReserve;
DWORD SizeOfStackCommit;
DWORD SizeOfHeapReserve;
DWORD SizeOfHeapCommit;
DWORD LoaderFlags;
DWORD NumberOfRvaAndSizes;
// データディレクトリ
IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
} IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;
イメージファイルの状態を表す値が格納されます。 Win32 用の PE ファイルでは常に 0x10b になります。また、 ROM イメージのために 0x107 が、 Win64 のために 0x20b が定義されています。
実行ファイルを作成したリンカのメジャーバージョン番号およびマイナーバージョン番号がそれぞれ格納されます。
実行可能コードセクション(テキストセクション)のサイズが格納されます。実行可能コードセクションが複数存在する場合にはその合計サイズが格納されます。
初期化されたデータセクションのサイズが格納されます。初期化されたデータセクションが複数存在する場合にはその合計サイズが格納されます。
初期化されていないデータセクション(BSS セクション)のサイズが格納されます。初期化されていないデータセクションが複数存在する場合にはその合計サイズが格納されます。
イメージファイルのエントリポイントの RVA (相対仮想アドレス)が格納されます。エントリポイントとは、イメージファイルがメモリ上に読み込まれて、最初に実行されるコードのことを指します。
メモリにロードされたときの実行可能コードセクションの RVA が格納されます。
メモリにロードされたときの初期化されたデータセクションの RVA が格納されます。
イメージファイルのベースアドレスが格納されます。ベースアドレスとは、イメージがロードされる時の先頭アドレスのことです。このアドレスは常に 64K バイトの整数倍になります。通常、EXE ファイルでは 0x00400000 が、 DLL では 0x10000000 がデフォルトのアドレスとして指定されています。ただし、ベースアドレスは、イメージがそのアドレスにロードされることが望ましい、ということを表すもので、必ずしもそのアドレスにロードされるわけではありません。また、すべての RVA (相対仮想アドレス)はこのベースアドレスからの相対値で表されています。
PE ファイルのセクションの、メモリ内におけるアライメント値(セクションの境界の整列値)が格納されます。ファイルアライメントの値(FileAlignment メンバ)と等しいか、それよりも大きな値でなければなりません。通常は、マシンのページサイズ(Intel 互換 CPU では 4K バイト)になります。
PE ファイルのセクションのファイル内におけるアライメント値が格納されます。値は 512 〜 64K の範囲の 2 の乗数でなければなりません。通常は 512 になります。セクションアライメントの値(SectionAlignment メンバ)がページサイズよりも小さい場合には、ファイルアライメントはセクションアライメントと同じ値でなければなりません。
必要なオペレーティングシステムのメジャーバージョン番号およびマイナーバージョン番号がそれぞれ格納されます。
イメージファイルのメジャーバージョン番号およびマイナーバージョン番号がそれぞれ格納されます。ただし、ここに正しいバージョンを設定しないリンカも多く存在します。通常、イメージファイルのバーションは、イメージがバージョンリソースを持つ場合にはそれを参照します。
サブシステムのメジャーバージョン番号およびマイナーバージョン番号がそれぞれ格納されます。
使用されません。 0 が格納されます。
イメージのサイズがメモリ上にロードされるのに必要となるメモリサイズが格納されます。この値は、セクションアライメントの値(SectionAlignment メンバ)でアライメントされた、ヘッダサイズおよびすべてのセクションサイズの合計になります。
MS-DOS スタブ、 PE ヘッダ、セクションヘッダを含むすべてのヘッダの合計サイズが格納されます。この値は、ファイルアライメントの値(FileAlignment メンバ)でアライメントされます。この値は、ファイル先頭からの最初のセクションデータへのオフセットになります。
イメージファイルのチェックサムが格納されます。チェックサムは Windows NT のカーネルモードドライバ DLL 、システム DLL 、サーバ DLL などで使用されます。それ以外のイメージファイルではチェックサムによるチェックは行なわれません。多くのイメージファイルではこのメンバが 0 で埋められています。
このイメージを実行するために必要なサブシステムを表す値が格納されます。
| 値 | 意味 |
|---|---|
| 0 (IMAGE_SUBSYSTEM_UNKNOWN) | 未知のサブシステム |
| 1 (IMAGE_SUBSYSTEM_NATIVE) | デバイスドライバおよび Windows NT ネイティブのプロセスのために使用されます。 |
| 2 (IMAGE_SUBSYSTEM_WINDOWS_GUI) | Windows GUI サブシステム内で実行されるイメージです。 |
| 3 (IMAGE_SUBSYSTEM_WINDOWS_CUI) | Windows キャラクタサブシステム内で実行されるイメージです。 |
| 5 (IMAGE_SUBSYSTEM_OS2_CUI) | OS/2 キャラクタサブシステム内で実行されるイメージです。 |
| 7 (IMAGE_SUBSYSTEM_POSIX_CUI) | Posix キャラクタサブシステム内で実行されるイメージです。 |
| 9 (IMAGE_SUBSYSTEM_WINDOWS_CE_GUI) | Windows CE上で実行されるイメージです。 |
DLL の特性を表すビットフラグが格納されます。
| 値 | 意味 |
|---|---|
| 0x0001 | 予約されています。 |
| 0x0002 | |
| 0x0003 | |
| 0x0004 | |
| 0x2000 (IMAGE_DLLCHARACTERISTICS_WDM_DRIVER) | ドライバは WDM ドライバです。 |
予約されるスタックサイズが格納されます。
コミット(確保)されるスタックサイズが格納されます。
予約されるヒープのサイズが格納されます。
コミットされるヒープのサイズが格納されます。
使用されません。 0 が格納されます。
オプションヘッダの残りの部分(DataDirectory メンバで表される配列)にあるデータディクショナリエントリの数が格納されます。通常は 16 (IMAGE_NUMBEROF_DIRECTORY_ENTRIES) です。
データディクショナリが格納されます。これは、 IMAGE_DATA_DIRECTORY 構造体で表される各エントリの配列で表されます。エントリの数は NumberOfRvaAndSizes メンバで表されます。
各エントリには以下の内容の RVA およびサイズが格納されます。
| インデックス | 内容 |
|---|---|
| 0 (IMAGE_DIRECTORY_ENTRY_EXPORT) | エクスポートシンボルテーブル |
| 1 (IMAGE_DIRECTORY_ENTRY_IMPORT) | インポートシンボルテーブル |
| 2 (IMAGE_DIRECTORY_ENTRY_RESOURCE) | リソーステーブル |
| 3 (IMAGE_DIRECTORY_ENTRY_EXCEPTION) | 例外テーブル |
| 4 (IMAGE_DIRECTORY_ENTRY_SECURITY) | 属性認証テーブル(VirtualAddress メンバはファイルオフセット) |
| 5 (IMAGE_DIRECTORY_ENTRY_BASERELOC) | ベース再配置テーブル |
| 6 (IMAGE_DIRECTORY_ENTRY_DEBUG) | デバッグデータ |
| 7 (IMAGE_DIRECTORY_ENTRY_ARCHITECTURE) | アーキテクチャ固有データ |
| 8 (IMAGE_DIRECTORY_ENTRY_GLOBALPTR) | グローバルポインタレジスタ(VirtualAddress メンバのみ/Size メンバは 0) |
| 9 (IMAGE_DIRECTORY_ENTRY_TLS) | スレッドローカルストレージ(TLS)テーブル |
| 10 (IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG) | ロードコンフィグレーションテーブル |
| 11 (IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT) | バウンドインポートテーブル |
| 12 (IMAGE_DIRECTORY_ENTRY_IAT) | インポートアドレステーブル |
| 13 (IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT) | 遅延インポート記述子 |
| 14 (IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR) | 予約されています。 |
| 15 |
Windows 95 以降 / Windows NT 3.1 以降
| HSP 変数 | メンバ | ||||
|---|---|---|---|---|---|
| メンバ名 | オフセット | サイズ | |||
| opthdr.0 | 1バイト目 | Magic | 0 | 2 | |
| 2バイト目 | |||||
| 3バイト目 | MajorLinkerVersion | 2 | 1 | ||
| 4バイト目 | MinorLinkerVersion | 3 | 1 | ||
| opthdr.1 | SizeOfCode | 4 | 4 | ||
| opthdr.2 | SizeOfInitializedData | 8 | 4 | ||
| opthdr.3 | SizeOfUninitializedData | 12 | 4 | ||
| opthdr.4 | AddressOfEntryPoint | 16 | 4 | ||
| opthdr.5 | BaseOfCode | 20 | 4 | ||
| opthdr.6 | BaseOfData | 24 | 4 | ||
| opthdr.7 | ImageBase | 28 | 4 | ||
| opthdr.8 | SectionAlignment | 32 | 4 | ||
| opthdr.9 | FileAlignment | 36 | 4 | ||
| opthdr.10 | 下位ワード | MajorOperatingSystemVersion | 40 | 2 | |
| 上位ワード | MinorOperatingSystemVersion | 42 | 2 | ||
| opthdr.11 | 下位ワード | MajorImageVersion | 44 | 2 | |
| 上位ワード | MinorImageVersion | 46 | 2 | ||
| opthdr.12 | 下位ワード | MajorSubsystemVersion | 48 | 2 | |
| 上位ワード | MinorSubsystemVersion | 50 | 2 | ||
| opthdr.13 | Win32VersionValue | 52 | 4 | ||
| opthdr.14 | SizeOfImage | 56 | 4 | ||
| opthdr.15 | SizeOfHeaders | 60 | 4 | ||
| opthdr.16 | CheckSum | 64 | 4 | ||
| opthdr.17 | 下位ワード | Subsystem | 68 | 2 | |
| 上位ワード | DllCharacteristics | 70 | 2 | ||
| opthdr.18 | SizeOfStackReserve | 72 | 4 | ||
| opthdr.19 | SizeOfStackCommit | 76 | 4 | ||
| opthdr.20 | SizeOfHeapReserve | 80 | 4 | ||
| opthdr.21 | SizeOfHeapCommit | 84 | 4 | ||
| opthdr.22 | LoaderFlags | 88 | 4 | ||
| opthdr.23 | NumberOfRvaAndSizes | 92 | 4 | ||
| opthdr.24 | DataDirectory[0] | RVA | 96 | 4 | |
| opthdr.25 | Size | 100 | 4 | ||
| … | … | … | … | ||
| opthdr.54 | DataDirectory[15] | RVA | 216 | 4 | |
| opthdr.55 | Size | 220 | 4 | ||