ホーム › System.Diagnostics.Debug › IMAGE_ROM_OPTIONAL_HEADER
IMAGE_ROM_OPTIONAL_HEADER
構造体サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。
フィールド
| フィールド | 型 | サイズ | x64 | x86 | 説明 |
|---|---|---|---|---|---|
| Magic | WORD | 2 | +0 | +0 | ROMイメージを示すマジック値。 |
| MajorLinkerVersion | BYTE | 1 | +2 | +2 | リンカのメジャーバージョン。 |
| MinorLinkerVersion | BYTE | 1 | +3 | +3 | リンカのマイナーバージョン。 |
| SizeOfCode | DWORD | 4 | +4 | +4 | コードセクションの合計サイズ。 |
| SizeOfInitializedData | DWORD | 4 | +8 | +8 | 初期化済みデータの合計サイズ。 |
| SizeOfUninitializedData | DWORD | 4 | +12 | +12 | 未初期化データの合計サイズ。 |
| AddressOfEntryPoint | DWORD | 4 | +16 | +16 | エントリポイントのRVA。 |
| BaseOfCode | DWORD | 4 | +20 | +20 | コードセクションの基準RVA。 |
| BaseOfData | DWORD | 4 | +24 | +24 | データセクションの基準RVA。 |
| BaseOfBss | DWORD | 4 | +28 | +28 | BSSセクションの基準RVA。 |
| GprMask | DWORD | 4 | +32 | +32 | 汎用レジスタのマスク(MIPS等のROM用)。 |
| CprMask | DWORD | 16 | +36 | +36 | コプロセッサレジスタのマスク。 |
| GpValue | DWORD | 4 | +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 Structureimport 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: uint32struct 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