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

IMAGE_ROM_HEADERS

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

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

フィールド

フィールドサイズx64x86説明
FileHeaderIMAGE_FILE_HEADER20+0+0COFFファイルヘッダ(IMAGE_FILE_HEADER)。
OptionalHeaderIMAGE_ROM_OPTIONAL_HEADER56+20+20ROMオプションヘッダ(IMAGE_ROM_OPTIONAL_HEADER)。

各言語での定義

#include <windows.h>

// IMAGE_FILE_HEADER  (x64 20 / x86 20 バイト)
typedef struct IMAGE_FILE_HEADER {
    IMAGE_FILE_MACHINE Machine;
    WORD NumberOfSections;
    DWORD TimeDateStamp;
    DWORD PointerToSymbolTable;
    DWORD NumberOfSymbols;
    WORD SizeOfOptionalHeader;
    IMAGE_FILE_CHARACTERISTICS Characteristics;
} IMAGE_FILE_HEADER;

// 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;

// IMAGE_ROM_HEADERS  (x64 76 / x86 76 バイト)
typedef struct IMAGE_ROM_HEADERS {
    IMAGE_FILE_HEADER FileHeader;
    IMAGE_ROM_OPTIONAL_HEADER OptionalHeader;
} IMAGE_ROM_HEADERS;
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct IMAGE_FILE_HEADER
{
    public ushort Machine;
    public ushort NumberOfSections;
    public uint TimeDateStamp;
    public uint PointerToSymbolTable;
    public uint NumberOfSymbols;
    public ushort SizeOfOptionalHeader;
    public ushort Characteristics;
}

[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;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct IMAGE_ROM_HEADERS
{
    public IMAGE_FILE_HEADER FileHeader;
    public IMAGE_ROM_OPTIONAL_HEADER OptionalHeader;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure IMAGE_FILE_HEADER
    Public Machine As UShort
    Public NumberOfSections As UShort
    Public TimeDateStamp As UInteger
    Public PointerToSymbolTable As UInteger
    Public NumberOfSymbols As UInteger
    Public SizeOfOptionalHeader As UShort
    Public Characteristics As UShort
End Structure

<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

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure IMAGE_ROM_HEADERS
    Public FileHeader As IMAGE_FILE_HEADER
    Public OptionalHeader As IMAGE_ROM_OPTIONAL_HEADER
End Structure
import ctypes
from ctypes import wintypes

class IMAGE_FILE_HEADER(ctypes.Structure):
    _fields_ = [
        ("Machine", ctypes.c_ushort),
        ("NumberOfSections", ctypes.c_ushort),
        ("TimeDateStamp", wintypes.DWORD),
        ("PointerToSymbolTable", wintypes.DWORD),
        ("NumberOfSymbols", wintypes.DWORD),
        ("SizeOfOptionalHeader", ctypes.c_ushort),
        ("Characteristics", ctypes.c_ushort),
    ]

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),
    ]

class IMAGE_ROM_HEADERS(ctypes.Structure):
    _fields_ = [
        ("FileHeader", IMAGE_FILE_HEADER),
        ("OptionalHeader", IMAGE_ROM_OPTIONAL_HEADER),
    ]
#[repr(C)]
pub struct IMAGE_FILE_HEADER {
    pub Machine: u16,
    pub NumberOfSections: u16,
    pub TimeDateStamp: u32,
    pub PointerToSymbolTable: u32,
    pub NumberOfSymbols: u32,
    pub SizeOfOptionalHeader: u16,
    pub Characteristics: u16,
}

#[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,
}

#[repr(C)]
pub struct IMAGE_ROM_HEADERS {
    pub FileHeader: IMAGE_FILE_HEADER,
    pub OptionalHeader: IMAGE_ROM_OPTIONAL_HEADER,
}
import "golang.org/x/sys/windows"

type IMAGE_FILE_HEADER struct {
	Machine uint16
	NumberOfSections uint16
	TimeDateStamp uint32
	PointerToSymbolTable uint32
	NumberOfSymbols uint32
	SizeOfOptionalHeader uint16
	Characteristics uint16
}

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_HEADERS struct {
	FileHeader IMAGE_FILE_HEADER
	OptionalHeader IMAGE_ROM_OPTIONAL_HEADER
}
type
  IMAGE_FILE_HEADER = record
    Machine: Word;
    NumberOfSections: Word;
    TimeDateStamp: DWORD;
    PointerToSymbolTable: DWORD;
    NumberOfSymbols: DWORD;
    SizeOfOptionalHeader: Word;
    Characteristics: Word;
  end;

  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;

  IMAGE_ROM_HEADERS = record
    FileHeader: IMAGE_FILE_HEADER;
    OptionalHeader: IMAGE_ROM_OPTIONAL_HEADER;
  end;
const IMAGE_FILE_HEADER = extern struct {
    Machine: u16,
    NumberOfSections: u16,
    TimeDateStamp: u32,
    PointerToSymbolTable: u32,
    NumberOfSymbols: u32,
    SizeOfOptionalHeader: u16,
    Characteristics: u16,
};

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,
};

const IMAGE_ROM_HEADERS = extern struct {
    FileHeader: IMAGE_FILE_HEADER,
    OptionalHeader: IMAGE_ROM_OPTIONAL_HEADER,
};
type
  IMAGE_FILE_HEADER {.bycopy.} = object
    Machine: uint16
    NumberOfSections: uint16
    TimeDateStamp: uint32
    PointerToSymbolTable: uint32
    NumberOfSymbols: uint32
    SizeOfOptionalHeader: uint16
    Characteristics: uint16

  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

  IMAGE_ROM_HEADERS {.bycopy.} = object
    FileHeader: IMAGE_FILE_HEADER
    OptionalHeader: IMAGE_ROM_OPTIONAL_HEADER
struct IMAGE_FILE_HEADER
{
    ushort Machine;
    ushort NumberOfSections;
    uint TimeDateStamp;
    uint PointerToSymbolTable;
    uint NumberOfSymbols;
    ushort SizeOfOptionalHeader;
    ushort Characteristics;
}

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;
}

struct IMAGE_ROM_HEADERS
{
    IMAGE_FILE_HEADER FileHeader;
    IMAGE_ROM_OPTIONAL_HEADER OptionalHeader;
}

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_HEADERS サイズ: 76 バイト(x64)
dim st, 19    ; 4byte整数×19(構造体サイズ 76 / 4 切り上げ)
; FileHeader : IMAGE_FILE_HEADER (+0, 20byte)  varptr(st)+0 を基点に操作(20byte:入れ子/配列)
; OptionalHeader : IMAGE_ROM_OPTIONAL_HEADER (+20, 56byte)  varptr(st)+20 を基点に操作(56byte:入れ子/配列)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
; ※GUID・入れ子構造体はデフォルト型でないため、依存する #defstruct を先に定義(下記に同梱)。
#defstruct global IMAGE_FILE_HEADER
    #field short Machine
    #field short NumberOfSections
    #field int TimeDateStamp
    #field int PointerToSymbolTable
    #field int NumberOfSymbols
    #field short SizeOfOptionalHeader
    #field short Characteristics
#endstruct

#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

#defstruct global IMAGE_ROM_HEADERS
    #field IMAGE_FILE_HEADER FileHeader
    #field IMAGE_ROM_OPTIONAL_HEADER OptionalHeader
#endstruct

stdim st, IMAGE_ROM_HEADERS        ; NSTRUCT 変数を確保