ホーム › System.Diagnostics.Debug › IMAGE_ROM_HEADERS
IMAGE_ROM_HEADERS
構造体サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。
フィールド
| フィールド | 型 | サイズ | x64 | x86 | 説明 |
|---|---|---|---|---|---|
| FileHeader | IMAGE_FILE_HEADER | 20 | +0 | +0 | COFFファイルヘッダ(IMAGE_FILE_HEADER)。 |
| OptionalHeader | IMAGE_ROM_OPTIONAL_HEADER | 56 | +20 | +20 | ROMオプションヘッダ(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 Structureimport 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_HEADERstruct 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 変数を確保