IMAGE_OPTIONAL_HEADER

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;

メンバ

Magic

イメージファイルの状態を表す値が格納されます。 Win32 用の PE ファイルでは常に 0x10b になります。また、 ROM イメージのために 0x107 が、 Win64 のために 0x20b が定義されています。

MajorLinkerVersion
MinorLinkerVersion

実行ファイルを作成したリンカのメジャーバージョン番号およびマイナーバージョン番号がそれぞれ格納されます。

SizeOfCode

実行可能コードセクション(テキストセクション)のサイズが格納されます。実行可能コードセクションが複数存在する場合にはその合計サイズが格納されます。

SizeOfInitializedData

初期化されたデータセクションのサイズが格納されます。初期化されたデータセクションが複数存在する場合にはその合計サイズが格納されます。

SizeOfUninitializedData

初期化されていないデータセクション(BSS セクション)のサイズが格納されます。初期化されていないデータセクションが複数存在する場合にはその合計サイズが格納されます。

AddressOfEntryPoint

イメージファイルのエントリポイントの RVA (相対仮想アドレス)が格納されます。エントリポイントとは、イメージファイルがメモリ上に読み込まれて、最初に実行されるコードのことを指します。

BaseOfCode

メモリにロードされたときの実行可能コードセクションの RVA が格納されます。

BaseOfData

メモリにロードされたときの初期化されたデータセクションの RVA が格納されます。

ImageBase

イメージファイルのベースアドレスが格納されます。ベースアドレスとは、イメージがロードされる時の先頭アドレスのことです。このアドレスは常に 64K バイトの整数倍になります。通常、EXE ファイルでは 0x00400000 が、 DLL では 0x10000000 がデフォルトのアドレスとして指定されています。ただし、ベースアドレスは、イメージがそのアドレスにロードされることが望ましい、ということを表すもので、必ずしもそのアドレスにロードされるわけではありません。また、すべての RVA (相対仮想アドレス)はこのベースアドレスからの相対値で表されています。

SectionAlignment

PE ファイルのセクションの、メモリ内におけるアライメント値(セクションの境界の整列値)が格納されます。ファイルアライメントの値(FileAlignment メンバ)と等しいか、それよりも大きな値でなければなりません。通常は、マシンのページサイズ(Intel 互換 CPU では 4K バイト)になります。

FileAlignment

PE ファイルのセクションのファイル内におけるアライメント値が格納されます。値は 512 〜 64K の範囲の 2 の乗数でなければなりません。通常は 512 になります。セクションアライメントの値(SectionAlignment メンバ)がページサイズよりも小さい場合には、ファイルアライメントはセクションアライメントと同じ値でなければなりません。

MajorOperatingSystemVersion
MinorOperatingSystemVersion

必要なオペレーティングシステムのメジャーバージョン番号およびマイナーバージョン番号がそれぞれ格納されます。

MajorImageVersion
MinorImageVersion

イメージファイルのメジャーバージョン番号およびマイナーバージョン番号がそれぞれ格納されます。ただし、ここに正しいバージョンを設定しないリンカも多く存在します。通常、イメージファイルのバーションは、イメージがバージョンリソースを持つ場合にはそれを参照します。

MajorSubsystemVersion
MinorSubsystemVersion

サブシステムのメジャーバージョン番号およびマイナーバージョン番号がそれぞれ格納されます。

Win32VersionValue

使用されません。 0 が格納されます。

SizeOfImage

イメージのサイズがメモリ上にロードされるのに必要となるメモリサイズが格納されます。この値は、セクションアライメントの値(SectionAlignment メンバ)でアライメントされた、ヘッダサイズおよびすべてのセクションサイズの合計になります。

SizeOfHeaders

MS-DOS スタブ、 PE ヘッダ、セクションヘッダを含むすべてのヘッダの合計サイズが格納されます。この値は、ファイルアライメントの値(FileAlignment メンバ)でアライメントされます。この値は、ファイル先頭からの最初のセクションデータへのオフセットになります。

CheckSum

イメージファイルのチェックサムが格納されます。チェックサムは Windows NT のカーネルモードドライバ DLL 、システム DLL 、サーバ DLL などで使用されます。それ以外のイメージファイルではチェックサムによるチェックは行なわれません。多くのイメージファイルではこのメンバが 0 で埋められています。

Subsystem

このイメージを実行するために必要なサブシステムを表す値が格納されます。

意味
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上で実行されるイメージです。
DllCharacteristics

DLL の特性を表すビットフラグが格納されます。

意味
0x0001 予約されています。
0x0002
0x0003
0x0004
0x2000 (IMAGE_DLLCHARACTERISTICS_WDM_DRIVER) ドライバは WDM ドライバです。
SizeOfStackReserve

予約されるスタックサイズが格納されます。

SizeOfStackCommit

コミット(確保)されるスタックサイズが格納されます。

SizeOfHeapReserve

予約されるヒープのサイズが格納されます。

SizeOfHeapCommit

コミットされるヒープのサイズが格納されます。

LoaderFlags

使用されません。 0 が格納されます。

NumberOfRvaAndSizes

オプションヘッダの残りの部分(DataDirectory メンバで表される配列)にあるデータディクショナリエントリの数が格納されます。通常は 16 (IMAGE_NUMBEROF_DIRECTORY_ENTRIES) です。

DataDirectory

データディクショナリが格納されます。これは、 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