Win32 API 日本語リファレンス
ホームSystem.Diagnostics.Debug › IMAGE_OPTIONAL_HEADER32

IMAGE_OPTIONAL_HEADER32

構造体
サイズx64: 224 バイト / x86: 224 バイト

サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。

フィールド

フィールドサイズx64x86説明
MagicIMAGE_OPTIONAL_HEADER_MAGIC2+0+0

イメージファイルの状態です。このメンバーには次のいずれかの値を指定できます。

意味
IMAGE_NT_OPTIONAL_HDR_MAGIC
ファイルは実行可能イメージです。この値は、32 ビットアプリケーションでは IMAGE_NT_OPTIONAL_HDR32_MAGIC として、64 ビットアプリケーションでは IMAGE_NT_OPTIONAL_HDR64_MAGIC として定義されます。
IMAGE_NT_OPTIONAL_HDR32_MAGIC
0x10b
ファイルは実行可能イメージです。
IMAGE_NT_OPTIONAL_HDR64_MAGIC
0x20b
ファイルは実行可能イメージです。
IMAGE_ROM_OPTIONAL_HDR_MAGIC
0x107
ファイルは ROM イメージです。
MajorLinkerVersionBYTE1+2+2リンカーのメジャーバージョン番号です。
MinorLinkerVersionBYTE1+3+3リンカーのマイナーバージョン番号です。
SizeOfCodeDWORD4+4+4コードセクションのサイズ (バイト単位) です。コードセクションが複数ある場合は、それらすべての合計サイズです。
SizeOfInitializedDataDWORD4+8+8初期化済みデータセクションのサイズ (バイト単位) です。初期化済みデータセクションが複数ある場合は、それらすべての合計サイズです。
SizeOfUninitializedDataDWORD4+12+12未初期化データセクションのサイズ (バイト単位) です。未初期化データセクションが複数ある場合は、それらすべての合計サイズです。
AddressOfEntryPointDWORD4+16+16イメージのベースアドレスからの相対値で表した、エントリポイント関数へのポインターです。実行可能ファイルの場合は開始アドレス、デバイスドライバーの場合は初期化関数のアドレスになります。DLL ではエントリポイント関数は省略可能です。エントリポイントが存在しない場合、このメンバーは 0 になります。
BaseOfCodeDWORD4+20+20イメージのベースアドレスからの相対値で表した、コードセクションの先頭へのポインターです。
BaseOfDataDWORD4+24+24イメージのベースアドレスからの相対値で表した、データセクションの先頭へのポインターです。
ImageBaseDWORD4+28+28メモリに読み込まれたときの、イメージの先頭バイトの推奨アドレスです。この値は 64K バイトの倍数です。既定値は DLL では 0x10000000、アプリケーションでは 0x00400000 です (ただし Windows CE では 0x00010000)。
SectionAlignmentDWORD4+32+32メモリに読み込まれるセクションのアラインメント (バイト単位) です。この値は FileAlignment メンバー以上でなければなりません。既定値はシステムのページサイズです。
FileAlignmentDWORD4+36+36イメージファイル内のセクションの生データのアラインメント (バイト単位) です。この値は 512 から 64K までの範囲 (両端を含む) の 2 のべき乗にしてください。既定値は 512 です。SectionAlignment メンバー がシステムのページサイズより小さい場合、このメンバーは SectionAlignment と同じ値でなければなりません。
MajorOperatingSystemVersionWORD2+40+40必要なオペレーティングシステムのメジャーバージョン番号です。
MinorOperatingSystemVersionWORD2+42+42必要なオペレーティングシステムのマイナーバージョン番号です。
MajorImageVersionWORD2+44+44イメージのメジャーバージョン番号です。
MinorImageVersionWORD2+46+46イメージのマイナーバージョン番号です。
MajorSubsystemVersionWORD2+48+48サブシステムのメジャーバージョン番号です。
MinorSubsystemVersionWORD2+50+50サブシステムのマイナーバージョン番号です。
Win32VersionValueDWORD4+52+52このメンバーは予約済みであり、0 でなければなりません。
SizeOfImageDWORD4+56+56すべてのヘッダーを含むイメージのサイズ (バイト単位) です。 SectionAlignment の倍数でなければなりません。
SizeOfHeadersDWORD4+60+60

次の項目の合計サイズを、 FileAlignment メンバーで指定された値の倍数に切り上げたものです。

  • IMAGE_DOS_HEADERe_lfanew メンバー
  • 4 バイトのシグネチャ
  • IMAGE_FILE_HEADER のサイズ
  • オプションヘッダーのサイズ
  • すべてのセクションヘッダーのサイズ
CheckSumDWORD4+64+64イメージファイルのチェックサムです。次のファイルは読み込み時に検証されます。すべてのドライバー、ブート時に読み込まれるすべての DLL、および重要なシステムプロセスに読み込まれるすべての DLL。
SubsystemIMAGE_SUBSYSTEM2+68+68

このイメージの実行に必要なサブシステムです。次の値が定義されています。

意味
IMAGE_SUBSYSTEM_UNKNOWN
0
不明なサブシステムです。
IMAGE_SUBSYSTEM_NATIVE
1
サブシステムを必要としません (デバイスドライバーおよびネイティブシステムプロセス)。
IMAGE_SUBSYSTEM_WINDOWS_GUI
2
Windows グラフィカルユーザーインターフェイス (GUI) サブシステムです。
IMAGE_SUBSYSTEM_WINDOWS_CUI
3
Windows キャラクターモードユーザーインターフェイス (CUI) サブシステムです。
IMAGE_SUBSYSTEM_OS2_CUI
5
OS/2 CUI サブシステムです。
IMAGE_SUBSYSTEM_POSIX_CUI
7
POSIX CUI サブシステムです。
IMAGE_SUBSYSTEM_WINDOWS_CE_GUI
9
Windows CE システムです。
IMAGE_SUBSYSTEM_EFI_APPLICATION
10
Extensible Firmware Interface (EFI) アプリケーションです。
IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER
11
ブートサービスを備えた EFI ドライバーです。
IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER
12
ランタイムサービスを備えた EFI ドライバーです。
IMAGE_SUBSYSTEM_EFI_ROM
13
EFI ROM イメージです。
IMAGE_SUBSYSTEM_XBOX
14
Xbox システムです。
IMAGE_SUBSYSTEM_WINDOWS_BOOT_APPLICATION
16
ブートアプリケーションです。
DllCharacteristicsIMAGE_DLL_CHARACTERISTICS2+70+70

イメージの DLL 特性です。次の値が定義されています。

意味
0x0001
予約済みです。
0x0002
予約済みです。
0x0004
予約済みです。
0x0008
予約済みです。
IMAGE_DLL_CHARACTERISTICS_HIGH_ENTROPY_VA
0x0020
64 ビットアドレス空間での ASLR に対応します。
IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE
0x0040
DLL は読み込み時に再配置できます。
IMAGE_DLLCHARACTERISTICS_FORCE_INTEGRITY
0x0080
コードの整合性チェックが強制されます。このフラグを設定し、かつセクションが未初期化データのみを含む場合は、そのセクションの IMAGE_SECTION_HEADERPointerToRawData メンバーを 0 に設定してください。そうしないと、デジタル署名を検証できないためイメージの読み込みに失敗します。
IMAGE_DLLCHARACTERISTICS_NX_COMPAT
0x0100
イメージはデータ実行防止 (DEP) に対応しています。
IMAGE_DLLCHARACTERISTICS_NO_ISOLATION
0x0200
イメージは分離 (isolation) に対応していますが、分離すべきではありません。
IMAGE_DLLCHARACTERISTICS_NO_SEH
0x0400
イメージは構造化例外処理 (SEH) を使用しません。このイメージ内ではハンドラーを呼び出すことはできません。
IMAGE_DLLCHARACTERISTICS_NO_BIND
0x0800
イメージをバインドしません。
IMAGE_DLL_CHARACTERISTICS_APPCONTAINER
0x1000
イメージは AppContainer 内で実行される必要があります。
IMAGE_DLLCHARACTERISTICS_WDM_DRIVER
0x2000
WDM ドライバーです。
IMAGE_DLL_CHARACTERISTICS_GUARD_CF
0x4000
イメージは Control Flow Guard をサポートします。
IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE
0x8000
イメージはターミナルサーバーに対応しています。
SizeOfStackReserveDWORD4+72+72スタック用に予約するバイト数です。読み込み時にコミットされるのは SizeOfStackCommit メンバーで指定されたメモリのみで、残りはこの予約サイズに達するまで 1 ページずつ利用可能になります。
SizeOfStackCommitDWORD4+76+76スタック用にコミットするバイト数です。
SizeOfHeapReserveDWORD4+80+80ローカルヒープ用に予約するバイト数です。読み込み時にコミットされるのは SizeOfHeapCommit メンバーで指定されたメモリのみで、残りはこの予約サイズに達するまで 1 ページずつ利用可能になります。
SizeOfHeapCommitDWORD4+84+84ローカルヒープ用にコミットするバイト数です。
LoaderFlagsDWORD4+88+88このメンバーは廃止されています。
NumberOfRvaAndSizesDWORD4+92+92オプションヘッダーの残りの部分に含まれるディレクトリエントリの数です。各エントリは位置とサイズを記述します。
DataDirectoryIMAGE_DATA_DIRECTORY128+96+96

データディレクトリ内の最初の IMAGE_DATA_DIRECTORY 構造体へのポインターです。

目的のディレクトリエントリのインデックス番号です。このパラメーターには次のいずれかの値を指定できます。

意味
IMAGE_DIRECTORY_ENTRY_ARCHITECTURE
7
アーキテクチャ固有のデータ
IMAGE_DIRECTORY_ENTRY_BASERELOC
5
ベース再配置テーブル
IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT
11
バインド済みインポートディレクトリ
IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR
14
COM 記述子テーブル
IMAGE_DIRECTORY_ENTRY_DEBUG
6
デバッグディレクトリ
IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT
13
遅延インポートテーブル
IMAGE_DIRECTORY_ENTRY_EXCEPTION
3
例外ディレクトリ
IMAGE_DIRECTORY_ENTRY_EXPORT
0
エクスポートディレクトリ
IMAGE_DIRECTORY_ENTRY_GLOBALPTR
8
グローバルポインターの相対仮想アドレス
IMAGE_DIRECTORY_ENTRY_IAT
12
インポートアドレステーブル
IMAGE_DIRECTORY_ENTRY_IMPORT
1
インポートディレクトリ
IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG
10
ロード構成ディレクトリ
IMAGE_DIRECTORY_ENTRY_RESOURCE
2
リソースディレクトリ
IMAGE_DIRECTORY_ENTRY_SECURITY
4
セキュリティディレクトリ
IMAGE_DIRECTORY_ENTRY_TLS
9
スレッドローカルストレージディレクトリ

公式ドキュメント

オプションヘッダーの形式を表します。

解説(Remarks)

ディレクトリの数は固定ではありません。特定のディレクトリを探す前に NumberOfRvaAndSizes メンバーを確認してください。

WinNT.h における実際の構造体の名前は IMAGE_OPTIONAL_HEADER32 であり、IMAGE_OPTIONAL_HEADERIMAGE_OPTIONAL_HEADER32 として定義されています。ただし、_WIN64 が 定義されている場合、IMAGE_OPTIONAL_HEADERIMAGE_OPTIONAL_HEADER64 として定義されます。

typedef struct _IMAGE_OPTIONAL_HEADER64 {
 WORD        Magic;
 BYTE        MajorLinkerVersion;
 BYTE        MinorLinkerVersion;
 DWORD       SizeOfCode;
 DWORD       SizeOfInitializedData;
 DWORD       SizeOfUninitializedData;
 DWORD       AddressOfEntryPoint;
 DWORD       BaseOfCode;
 ULONGLONG   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;
 ULONGLONG   SizeOfStackReserve;
 ULONGLONG   SizeOfStackCommit;
 ULONGLONG   SizeOfHeapReserve;
 ULONGLONG   SizeOfHeapCommit;
 DWORD       LoaderFlags;
 DWORD       NumberOfRvaAndSizes;
 IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
} IMAGE_OPTIONAL_HEADER64, *PIMAGE_OPTIONAL_HEADER64;
出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

各言語での定義

#include <windows.h>

// IMAGE_DATA_DIRECTORY  (x64 8 / x86 8 バイト)
typedef struct IMAGE_DATA_DIRECTORY {
    DWORD VirtualAddress;
    DWORD Size;
} IMAGE_DATA_DIRECTORY;

// IMAGE_OPTIONAL_HEADER32  (x64 224 / x86 224 バイト)
typedef struct IMAGE_OPTIONAL_HEADER32 {
    IMAGE_OPTIONAL_HEADER_MAGIC Magic;
    BYTE MajorLinkerVersion;
    BYTE MinorLinkerVersion;
    DWORD SizeOfCode;
    DWORD SizeOfInitializedData;
    DWORD SizeOfUninitializedData;
    DWORD AddressOfEntryPoint;
    DWORD BaseOfCode;
    DWORD BaseOfData;
    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;
    IMAGE_SUBSYSTEM Subsystem;
    IMAGE_DLL_CHARACTERISTICS DllCharacteristics;
    DWORD SizeOfStackReserve;
    DWORD SizeOfStackCommit;
    DWORD SizeOfHeapReserve;
    DWORD SizeOfHeapCommit;
    DWORD LoaderFlags;
    DWORD NumberOfRvaAndSizes;
    IMAGE_DATA_DIRECTORY DataDirectory[16];
} IMAGE_OPTIONAL_HEADER32;
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct IMAGE_DATA_DIRECTORY
{
    public uint VirtualAddress;
    public uint Size;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct IMAGE_OPTIONAL_HEADER32
{
    public ushort Magic;
    public byte MajorLinkerVersion;
    public byte MinorLinkerVersion;
    public uint SizeOfCode;
    public uint SizeOfInitializedData;
    public uint SizeOfUninitializedData;
    public uint AddressOfEntryPoint;
    public uint BaseOfCode;
    public uint BaseOfData;
    public uint ImageBase;
    public uint SectionAlignment;
    public uint FileAlignment;
    public ushort MajorOperatingSystemVersion;
    public ushort MinorOperatingSystemVersion;
    public ushort MajorImageVersion;
    public ushort MinorImageVersion;
    public ushort MajorSubsystemVersion;
    public ushort MinorSubsystemVersion;
    public uint Win32VersionValue;
    public uint SizeOfImage;
    public uint SizeOfHeaders;
    public uint CheckSum;
    public ushort Subsystem;
    public ushort DllCharacteristics;
    public uint SizeOfStackReserve;
    public uint SizeOfStackCommit;
    public uint SizeOfHeapReserve;
    public uint SizeOfHeapCommit;
    public uint LoaderFlags;
    public uint NumberOfRvaAndSizes;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] public IMAGE_DATA_DIRECTORY[] DataDirectory;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure IMAGE_DATA_DIRECTORY
    Public VirtualAddress As UInteger
    Public Size As UInteger
End Structure

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure IMAGE_OPTIONAL_HEADER32
    Public Magic As UShort
    Public MajorLinkerVersion As Byte
    Public MinorLinkerVersion As Byte
    Public SizeOfCode As UInteger
    Public SizeOfInitializedData As UInteger
    Public SizeOfUninitializedData As UInteger
    Public AddressOfEntryPoint As UInteger
    Public BaseOfCode As UInteger
    Public BaseOfData As UInteger
    Public ImageBase As UInteger
    Public SectionAlignment As UInteger
    Public FileAlignment As UInteger
    Public MajorOperatingSystemVersion As UShort
    Public MinorOperatingSystemVersion As UShort
    Public MajorImageVersion As UShort
    Public MinorImageVersion As UShort
    Public MajorSubsystemVersion As UShort
    Public MinorSubsystemVersion As UShort
    Public Win32VersionValue As UInteger
    Public SizeOfImage As UInteger
    Public SizeOfHeaders As UInteger
    Public CheckSum As UInteger
    Public Subsystem As UShort
    Public DllCharacteristics As UShort
    Public SizeOfStackReserve As UInteger
    Public SizeOfStackCommit As UInteger
    Public SizeOfHeapReserve As UInteger
    Public SizeOfHeapCommit As UInteger
    Public LoaderFlags As UInteger
    Public NumberOfRvaAndSizes As UInteger
    <MarshalAs(UnmanagedType.ByValArray, SizeConst:=16)> Public DataDirectory() As IMAGE_DATA_DIRECTORY
End Structure
import ctypes
from ctypes import wintypes

class IMAGE_DATA_DIRECTORY(ctypes.Structure):
    _fields_ = [
        ("VirtualAddress", wintypes.DWORD),
        ("Size", wintypes.DWORD),
    ]

class IMAGE_OPTIONAL_HEADER32(ctypes.Structure):
    _fields_ = [
        ("Magic", ctypes.c_ushort),
        ("MajorLinkerVersion", ctypes.c_ubyte),
        ("MinorLinkerVersion", ctypes.c_ubyte),
        ("SizeOfCode", wintypes.DWORD),
        ("SizeOfInitializedData", wintypes.DWORD),
        ("SizeOfUninitializedData", wintypes.DWORD),
        ("AddressOfEntryPoint", wintypes.DWORD),
        ("BaseOfCode", wintypes.DWORD),
        ("BaseOfData", wintypes.DWORD),
        ("ImageBase", wintypes.DWORD),
        ("SectionAlignment", wintypes.DWORD),
        ("FileAlignment", wintypes.DWORD),
        ("MajorOperatingSystemVersion", ctypes.c_ushort),
        ("MinorOperatingSystemVersion", ctypes.c_ushort),
        ("MajorImageVersion", ctypes.c_ushort),
        ("MinorImageVersion", ctypes.c_ushort),
        ("MajorSubsystemVersion", ctypes.c_ushort),
        ("MinorSubsystemVersion", ctypes.c_ushort),
        ("Win32VersionValue", wintypes.DWORD),
        ("SizeOfImage", wintypes.DWORD),
        ("SizeOfHeaders", wintypes.DWORD),
        ("CheckSum", wintypes.DWORD),
        ("Subsystem", ctypes.c_ushort),
        ("DllCharacteristics", ctypes.c_ushort),
        ("SizeOfStackReserve", wintypes.DWORD),
        ("SizeOfStackCommit", wintypes.DWORD),
        ("SizeOfHeapReserve", wintypes.DWORD),
        ("SizeOfHeapCommit", wintypes.DWORD),
        ("LoaderFlags", wintypes.DWORD),
        ("NumberOfRvaAndSizes", wintypes.DWORD),
        ("DataDirectory", IMAGE_DATA_DIRECTORY * 16),
    ]
#[repr(C)]
pub struct IMAGE_DATA_DIRECTORY {
    pub VirtualAddress: u32,
    pub Size: u32,
}

#[repr(C)]
pub struct IMAGE_OPTIONAL_HEADER32 {
    pub Magic: u16,
    pub MajorLinkerVersion: u8,
    pub MinorLinkerVersion: u8,
    pub SizeOfCode: u32,
    pub SizeOfInitializedData: u32,
    pub SizeOfUninitializedData: u32,
    pub AddressOfEntryPoint: u32,
    pub BaseOfCode: u32,
    pub BaseOfData: u32,
    pub ImageBase: u32,
    pub SectionAlignment: u32,
    pub FileAlignment: u32,
    pub MajorOperatingSystemVersion: u16,
    pub MinorOperatingSystemVersion: u16,
    pub MajorImageVersion: u16,
    pub MinorImageVersion: u16,
    pub MajorSubsystemVersion: u16,
    pub MinorSubsystemVersion: u16,
    pub Win32VersionValue: u32,
    pub SizeOfImage: u32,
    pub SizeOfHeaders: u32,
    pub CheckSum: u32,
    pub Subsystem: u16,
    pub DllCharacteristics: u16,
    pub SizeOfStackReserve: u32,
    pub SizeOfStackCommit: u32,
    pub SizeOfHeapReserve: u32,
    pub SizeOfHeapCommit: u32,
    pub LoaderFlags: u32,
    pub NumberOfRvaAndSizes: u32,
    pub DataDirectory: [IMAGE_DATA_DIRECTORY; 16],
}
import "golang.org/x/sys/windows"

type IMAGE_DATA_DIRECTORY struct {
	VirtualAddress uint32
	Size uint32
}

type IMAGE_OPTIONAL_HEADER32 struct {
	Magic uint16
	MajorLinkerVersion byte
	MinorLinkerVersion byte
	SizeOfCode uint32
	SizeOfInitializedData uint32
	SizeOfUninitializedData uint32
	AddressOfEntryPoint uint32
	BaseOfCode uint32
	BaseOfData uint32
	ImageBase uint32
	SectionAlignment uint32
	FileAlignment uint32
	MajorOperatingSystemVersion uint16
	MinorOperatingSystemVersion uint16
	MajorImageVersion uint16
	MinorImageVersion uint16
	MajorSubsystemVersion uint16
	MinorSubsystemVersion uint16
	Win32VersionValue uint32
	SizeOfImage uint32
	SizeOfHeaders uint32
	CheckSum uint32
	Subsystem uint16
	DllCharacteristics uint16
	SizeOfStackReserve uint32
	SizeOfStackCommit uint32
	SizeOfHeapReserve uint32
	SizeOfHeapCommit uint32
	LoaderFlags uint32
	NumberOfRvaAndSizes uint32
	DataDirectory [16]IMAGE_DATA_DIRECTORY
}
type
  IMAGE_DATA_DIRECTORY = record
    VirtualAddress: DWORD;
    Size: DWORD;
  end;

  IMAGE_OPTIONAL_HEADER32 = record
    Magic: Word;
    MajorLinkerVersion: Byte;
    MinorLinkerVersion: Byte;
    SizeOfCode: DWORD;
    SizeOfInitializedData: DWORD;
    SizeOfUninitializedData: DWORD;
    AddressOfEntryPoint: DWORD;
    BaseOfCode: DWORD;
    BaseOfData: DWORD;
    ImageBase: DWORD;
    SectionAlignment: DWORD;
    FileAlignment: DWORD;
    MajorOperatingSystemVersion: Word;
    MinorOperatingSystemVersion: Word;
    MajorImageVersion: Word;
    MinorImageVersion: Word;
    MajorSubsystemVersion: Word;
    MinorSubsystemVersion: Word;
    Win32VersionValue: DWORD;
    SizeOfImage: DWORD;
    SizeOfHeaders: DWORD;
    CheckSum: DWORD;
    Subsystem: Word;
    DllCharacteristics: Word;
    SizeOfStackReserve: DWORD;
    SizeOfStackCommit: DWORD;
    SizeOfHeapReserve: DWORD;
    SizeOfHeapCommit: DWORD;
    LoaderFlags: DWORD;
    NumberOfRvaAndSizes: DWORD;
    DataDirectory: array[0..15] of IMAGE_DATA_DIRECTORY;
  end;
const IMAGE_DATA_DIRECTORY = extern struct {
    VirtualAddress: u32,
    Size: u32,
};

const IMAGE_OPTIONAL_HEADER32 = extern struct {
    Magic: u16,
    MajorLinkerVersion: u8,
    MinorLinkerVersion: u8,
    SizeOfCode: u32,
    SizeOfInitializedData: u32,
    SizeOfUninitializedData: u32,
    AddressOfEntryPoint: u32,
    BaseOfCode: u32,
    BaseOfData: u32,
    ImageBase: u32,
    SectionAlignment: u32,
    FileAlignment: u32,
    MajorOperatingSystemVersion: u16,
    MinorOperatingSystemVersion: u16,
    MajorImageVersion: u16,
    MinorImageVersion: u16,
    MajorSubsystemVersion: u16,
    MinorSubsystemVersion: u16,
    Win32VersionValue: u32,
    SizeOfImage: u32,
    SizeOfHeaders: u32,
    CheckSum: u32,
    Subsystem: u16,
    DllCharacteristics: u16,
    SizeOfStackReserve: u32,
    SizeOfStackCommit: u32,
    SizeOfHeapReserve: u32,
    SizeOfHeapCommit: u32,
    LoaderFlags: u32,
    NumberOfRvaAndSizes: u32,
    DataDirectory: [16]IMAGE_DATA_DIRECTORY,
};
type
  IMAGE_DATA_DIRECTORY {.bycopy.} = object
    VirtualAddress: uint32
    Size: uint32

  IMAGE_OPTIONAL_HEADER32 {.bycopy.} = object
    Magic: uint16
    MajorLinkerVersion: uint8
    MinorLinkerVersion: uint8
    SizeOfCode: uint32
    SizeOfInitializedData: uint32
    SizeOfUninitializedData: uint32
    AddressOfEntryPoint: uint32
    BaseOfCode: uint32
    BaseOfData: uint32
    ImageBase: uint32
    SectionAlignment: uint32
    FileAlignment: uint32
    MajorOperatingSystemVersion: uint16
    MinorOperatingSystemVersion: uint16
    MajorImageVersion: uint16
    MinorImageVersion: uint16
    MajorSubsystemVersion: uint16
    MinorSubsystemVersion: uint16
    Win32VersionValue: uint32
    SizeOfImage: uint32
    SizeOfHeaders: uint32
    CheckSum: uint32
    Subsystem: uint16
    DllCharacteristics: uint16
    SizeOfStackReserve: uint32
    SizeOfStackCommit: uint32
    SizeOfHeapReserve: uint32
    SizeOfHeapCommit: uint32
    LoaderFlags: uint32
    NumberOfRvaAndSizes: uint32
    DataDirectory: array[16, IMAGE_DATA_DIRECTORY]
struct IMAGE_DATA_DIRECTORY
{
    uint VirtualAddress;
    uint Size;
}

struct IMAGE_OPTIONAL_HEADER32
{
    ushort Magic;
    ubyte MajorLinkerVersion;
    ubyte MinorLinkerVersion;
    uint SizeOfCode;
    uint SizeOfInitializedData;
    uint SizeOfUninitializedData;
    uint AddressOfEntryPoint;
    uint BaseOfCode;
    uint BaseOfData;
    uint ImageBase;
    uint SectionAlignment;
    uint FileAlignment;
    ushort MajorOperatingSystemVersion;
    ushort MinorOperatingSystemVersion;
    ushort MajorImageVersion;
    ushort MinorImageVersion;
    ushort MajorSubsystemVersion;
    ushort MinorSubsystemVersion;
    uint Win32VersionValue;
    uint SizeOfImage;
    uint SizeOfHeaders;
    uint CheckSum;
    ushort Subsystem;
    ushort DllCharacteristics;
    uint SizeOfStackReserve;
    uint SizeOfStackCommit;
    uint SizeOfHeapReserve;
    uint SizeOfHeapCommit;
    uint LoaderFlags;
    uint NumberOfRvaAndSizes;
    IMAGE_DATA_DIRECTORY[16] DataDirectory;
}

HSP用 定義

HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; IMAGE_OPTIONAL_HEADER32 サイズ: 224 バイト(x64)
dim st, 56    ; 4byte整数×56(構造体サイズ 224 / 4 切り上げ)
; Magic : IMAGE_OPTIONAL_HEADER_MAGIC (+0, 2byte)  wpoke st,0,値  /  値 = wpeek(st,0)
; MajorLinkerVersion : BYTE (+2, 1byte)  poke st,2,値  /  値 = peek(st,2)
; MinorLinkerVersion : BYTE (+3, 1byte)  poke st,3,値  /  値 = peek(st,3)
; SizeOfCode : DWORD (+4, 4byte)  st.1 = 値  /  値 = st.1   (lpoke/lpeek も可)
; SizeOfInitializedData : DWORD (+8, 4byte)  st.2 = 値  /  値 = st.2   (lpoke/lpeek も可)
; SizeOfUninitializedData : DWORD (+12, 4byte)  st.3 = 値  /  値 = st.3   (lpoke/lpeek も可)
; AddressOfEntryPoint : DWORD (+16, 4byte)  st.4 = 値  /  値 = st.4   (lpoke/lpeek も可)
; BaseOfCode : DWORD (+20, 4byte)  st.5 = 値  /  値 = st.5   (lpoke/lpeek も可)
; BaseOfData : DWORD (+24, 4byte)  st.6 = 値  /  値 = st.6   (lpoke/lpeek も可)
; ImageBase : DWORD (+28, 4byte)  st.7 = 値  /  値 = st.7   (lpoke/lpeek も可)
; SectionAlignment : DWORD (+32, 4byte)  st.8 = 値  /  値 = st.8   (lpoke/lpeek も可)
; FileAlignment : DWORD (+36, 4byte)  st.9 = 値  /  値 = st.9   (lpoke/lpeek も可)
; MajorOperatingSystemVersion : WORD (+40, 2byte)  wpoke st,40,値  /  値 = wpeek(st,40)
; MinorOperatingSystemVersion : WORD (+42, 2byte)  wpoke st,42,値  /  値 = wpeek(st,42)
; MajorImageVersion : WORD (+44, 2byte)  wpoke st,44,値  /  値 = wpeek(st,44)
; MinorImageVersion : WORD (+46, 2byte)  wpoke st,46,値  /  値 = wpeek(st,46)
; MajorSubsystemVersion : WORD (+48, 2byte)  wpoke st,48,値  /  値 = wpeek(st,48)
; MinorSubsystemVersion : WORD (+50, 2byte)  wpoke st,50,値  /  値 = wpeek(st,50)
; Win32VersionValue : DWORD (+52, 4byte)  st.13 = 値  /  値 = st.13   (lpoke/lpeek も可)
; SizeOfImage : DWORD (+56, 4byte)  st.14 = 値  /  値 = st.14   (lpoke/lpeek も可)
; SizeOfHeaders : DWORD (+60, 4byte)  st.15 = 値  /  値 = st.15   (lpoke/lpeek も可)
; CheckSum : DWORD (+64, 4byte)  st.16 = 値  /  値 = st.16   (lpoke/lpeek も可)
; Subsystem : IMAGE_SUBSYSTEM (+68, 2byte)  wpoke st,68,値  /  値 = wpeek(st,68)
; DllCharacteristics : IMAGE_DLL_CHARACTERISTICS (+70, 2byte)  wpoke st,70,値  /  値 = wpeek(st,70)
; SizeOfStackReserve : DWORD (+72, 4byte)  st.18 = 値  /  値 = st.18   (lpoke/lpeek も可)
; SizeOfStackCommit : DWORD (+76, 4byte)  st.19 = 値  /  値 = st.19   (lpoke/lpeek も可)
; SizeOfHeapReserve : DWORD (+80, 4byte)  st.20 = 値  /  値 = st.20   (lpoke/lpeek も可)
; SizeOfHeapCommit : DWORD (+84, 4byte)  st.21 = 値  /  値 = st.21   (lpoke/lpeek も可)
; LoaderFlags : DWORD (+88, 4byte)  st.22 = 値  /  値 = st.22   (lpoke/lpeek も可)
; NumberOfRvaAndSizes : DWORD (+92, 4byte)  st.23 = 値  /  値 = st.23   (lpoke/lpeek も可)
; DataDirectory : IMAGE_DATA_DIRECTORY (+96, 128byte)  varptr(st)+96 を基点に操作(128byte:入れ子/配列)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
; ※GUID・入れ子構造体はデフォルト型でないため、依存する #defstruct を先に定義(下記に同梱)。
#defstruct global IMAGE_DATA_DIRECTORY
    #field int VirtualAddress
    #field int Size
#endstruct

#defstruct global IMAGE_OPTIONAL_HEADER32
    #field short Magic
    #field byte MajorLinkerVersion
    #field byte MinorLinkerVersion
    #field int SizeOfCode
    #field int SizeOfInitializedData
    #field int SizeOfUninitializedData
    #field int AddressOfEntryPoint
    #field int BaseOfCode
    #field int BaseOfData
    #field int ImageBase
    #field int SectionAlignment
    #field int FileAlignment
    #field short MajorOperatingSystemVersion
    #field short MinorOperatingSystemVersion
    #field short MajorImageVersion
    #field short MinorImageVersion
    #field short MajorSubsystemVersion
    #field short MinorSubsystemVersion
    #field int Win32VersionValue
    #field int SizeOfImage
    #field int SizeOfHeaders
    #field int CheckSum
    #field short Subsystem
    #field short DllCharacteristics
    #field int SizeOfStackReserve
    #field int SizeOfStackCommit
    #field int SizeOfHeapReserve
    #field int SizeOfHeapCommit
    #field int LoaderFlags
    #field int NumberOfRvaAndSizes
    #field IMAGE_DATA_DIRECTORY DataDirectory 16
#endstruct

stdim st, IMAGE_OPTIONAL_HEADER32        ; NSTRUCT 変数を確保
st->Magic = 100
mes "Magic=" + st->Magic