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

IMAGE_ROM_OPTIONAL_HEADER

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

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

フィールド

フィールドサイズx64x86説明
MagicWORD2+0+0ROMイメージを示すマジック値。
MajorLinkerVersionBYTE1+2+2リンカのメジャーバージョン。
MinorLinkerVersionBYTE1+3+3リンカのマイナーバージョン。
SizeOfCodeDWORD4+4+4コードセクションの合計サイズ。
SizeOfInitializedDataDWORD4+8+8初期化済みデータの合計サイズ。
SizeOfUninitializedDataDWORD4+12+12未初期化データの合計サイズ。
AddressOfEntryPointDWORD4+16+16エントリポイントのRVA。
BaseOfCodeDWORD4+20+20コードセクションの基準RVA。
BaseOfDataDWORD4+24+24データセクションの基準RVA。
BaseOfBssDWORD4+28+28BSSセクションの基準RVA。
GprMaskDWORD4+32+32汎用レジスタのマスク(MIPS等のROM用)。
CprMaskDWORD16+36+36コプロセッサレジスタのマスク。
GpValueDWORD4+52+52グローバルポインタ(GP)の値。

各言語での定義

#include <windows.h>

// IMAGE_ROM_OPTIONAL_HEADER  (x64 56 / x86 56 バイト)
typedef struct IMAGE_ROM_OPTIONAL_HEADER {
    WORD Magic;
    BYTE MajorLinkerVersion;
    BYTE MinorLinkerVersion;
    DWORD SizeOfCode;
    DWORD SizeOfInitializedData;
    DWORD SizeOfUninitializedData;
    DWORD AddressOfEntryPoint;
    DWORD BaseOfCode;
    DWORD BaseOfData;
    DWORD BaseOfBss;
    DWORD GprMask;
    DWORD CprMask[4];
    DWORD GpValue;
} IMAGE_ROM_OPTIONAL_HEADER;
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct IMAGE_ROM_OPTIONAL_HEADER
{
    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 BaseOfBss;
    public uint GprMask;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] public uint[] CprMask;
    public uint GpValue;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure IMAGE_ROM_OPTIONAL_HEADER
    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 BaseOfBss As UInteger
    Public GprMask As UInteger
    <MarshalAs(UnmanagedType.ByValArray, SizeConst:=4)> Public CprMask() As UInteger
    Public GpValue As UInteger
End Structure
import ctypes
from ctypes import wintypes

class IMAGE_ROM_OPTIONAL_HEADER(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),
        ("BaseOfBss", wintypes.DWORD),
        ("GprMask", wintypes.DWORD),
        ("CprMask", wintypes.DWORD * 4),
        ("GpValue", wintypes.DWORD),
    ]
#[repr(C)]
pub struct IMAGE_ROM_OPTIONAL_HEADER {
    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 BaseOfBss: u32,
    pub GprMask: u32,
    pub CprMask: [u32; 4],
    pub GpValue: u32,
}
import "golang.org/x/sys/windows"

type IMAGE_ROM_OPTIONAL_HEADER struct {
	Magic uint16
	MajorLinkerVersion byte
	MinorLinkerVersion byte
	SizeOfCode uint32
	SizeOfInitializedData uint32
	SizeOfUninitializedData uint32
	AddressOfEntryPoint uint32
	BaseOfCode uint32
	BaseOfData uint32
	BaseOfBss uint32
	GprMask uint32
	CprMask [4]uint32
	GpValue uint32
}
type
  IMAGE_ROM_OPTIONAL_HEADER = record
    Magic: Word;
    MajorLinkerVersion: Byte;
    MinorLinkerVersion: Byte;
    SizeOfCode: DWORD;
    SizeOfInitializedData: DWORD;
    SizeOfUninitializedData: DWORD;
    AddressOfEntryPoint: DWORD;
    BaseOfCode: DWORD;
    BaseOfData: DWORD;
    BaseOfBss: DWORD;
    GprMask: DWORD;
    CprMask: array[0..3] of DWORD;
    GpValue: DWORD;
  end;
const IMAGE_ROM_OPTIONAL_HEADER = extern struct {
    Magic: u16,
    MajorLinkerVersion: u8,
    MinorLinkerVersion: u8,
    SizeOfCode: u32,
    SizeOfInitializedData: u32,
    SizeOfUninitializedData: u32,
    AddressOfEntryPoint: u32,
    BaseOfCode: u32,
    BaseOfData: u32,
    BaseOfBss: u32,
    GprMask: u32,
    CprMask: [4]u32,
    GpValue: u32,
};
type
  IMAGE_ROM_OPTIONAL_HEADER {.bycopy.} = object
    Magic: uint16
    MajorLinkerVersion: uint8
    MinorLinkerVersion: uint8
    SizeOfCode: uint32
    SizeOfInitializedData: uint32
    SizeOfUninitializedData: uint32
    AddressOfEntryPoint: uint32
    BaseOfCode: uint32
    BaseOfData: uint32
    BaseOfBss: uint32
    GprMask: uint32
    CprMask: array[4, uint32]
    GpValue: uint32
struct IMAGE_ROM_OPTIONAL_HEADER
{
    ushort Magic;
    ubyte MajorLinkerVersion;
    ubyte MinorLinkerVersion;
    uint SizeOfCode;
    uint SizeOfInitializedData;
    uint SizeOfUninitializedData;
    uint AddressOfEntryPoint;
    uint BaseOfCode;
    uint BaseOfData;
    uint BaseOfBss;
    uint GprMask;
    uint[4] CprMask;
    uint GpValue;
}

HSP用 定義

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

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; IMAGE_ROM_OPTIONAL_HEADER サイズ: 56 バイト(x64)
dim st, 14    ; 4byte整数×14(構造体サイズ 56 / 4 切り上げ)
; Magic : WORD (+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 も可)
; BaseOfBss : DWORD (+28, 4byte)  st.7 = 値  /  値 = st.7   (lpoke/lpeek も可)
; GprMask : DWORD (+32, 4byte)  st.8 = 値  /  値 = st.8   (lpoke/lpeek も可)
; CprMask : DWORD (+36, 16byte)  varptr(st)+36 を基点に操作(16byte:入れ子/配列)
; GpValue : DWORD (+52, 4byte)  st.13 = 値  /  値 = st.13   (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global IMAGE_ROM_OPTIONAL_HEADER
    #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 BaseOfBss
    #field int GprMask
    #field int CprMask 4
    #field int GpValue
#endstruct

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