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

IMAGE_COFF_SYMBOLS_HEADER

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

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

フィールド

フィールドサイズx64x86説明
NumberOfSymbolsDWORD4+0+0シンボルの個数。
LvaToFirstSymbolDWORD4+4+4最初のシンボルへの線形仮想アドレス。
NumberOfLinenumbersDWORD4+8+8行番号エントリの個数。
LvaToFirstLinenumberDWORD4+12+12最初の行番号エントリへの線形仮想アドレス。
RvaToFirstByteOfCodeDWORD4+16+16コード先頭バイトのRVA。
RvaToLastByteOfCodeDWORD4+20+20コード末尾バイトのRVA。
RvaToFirstByteOfDataDWORD4+24+24データ先頭バイトのRVA。
RvaToLastByteOfDataDWORD4+28+28データ末尾バイトのRVA。

各言語での定義

#include <windows.h>

// IMAGE_COFF_SYMBOLS_HEADER  (x64 32 / x86 32 バイト)
typedef struct IMAGE_COFF_SYMBOLS_HEADER {
    DWORD NumberOfSymbols;
    DWORD LvaToFirstSymbol;
    DWORD NumberOfLinenumbers;
    DWORD LvaToFirstLinenumber;
    DWORD RvaToFirstByteOfCode;
    DWORD RvaToLastByteOfCode;
    DWORD RvaToFirstByteOfData;
    DWORD RvaToLastByteOfData;
} IMAGE_COFF_SYMBOLS_HEADER;
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct IMAGE_COFF_SYMBOLS_HEADER
{
    public uint NumberOfSymbols;
    public uint LvaToFirstSymbol;
    public uint NumberOfLinenumbers;
    public uint LvaToFirstLinenumber;
    public uint RvaToFirstByteOfCode;
    public uint RvaToLastByteOfCode;
    public uint RvaToFirstByteOfData;
    public uint RvaToLastByteOfData;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure IMAGE_COFF_SYMBOLS_HEADER
    Public NumberOfSymbols As UInteger
    Public LvaToFirstSymbol As UInteger
    Public NumberOfLinenumbers As UInteger
    Public LvaToFirstLinenumber As UInteger
    Public RvaToFirstByteOfCode As UInteger
    Public RvaToLastByteOfCode As UInteger
    Public RvaToFirstByteOfData As UInteger
    Public RvaToLastByteOfData As UInteger
End Structure
import ctypes
from ctypes import wintypes

class IMAGE_COFF_SYMBOLS_HEADER(ctypes.Structure):
    _fields_ = [
        ("NumberOfSymbols", wintypes.DWORD),
        ("LvaToFirstSymbol", wintypes.DWORD),
        ("NumberOfLinenumbers", wintypes.DWORD),
        ("LvaToFirstLinenumber", wintypes.DWORD),
        ("RvaToFirstByteOfCode", wintypes.DWORD),
        ("RvaToLastByteOfCode", wintypes.DWORD),
        ("RvaToFirstByteOfData", wintypes.DWORD),
        ("RvaToLastByteOfData", wintypes.DWORD),
    ]
#[repr(C)]
pub struct IMAGE_COFF_SYMBOLS_HEADER {
    pub NumberOfSymbols: u32,
    pub LvaToFirstSymbol: u32,
    pub NumberOfLinenumbers: u32,
    pub LvaToFirstLinenumber: u32,
    pub RvaToFirstByteOfCode: u32,
    pub RvaToLastByteOfCode: u32,
    pub RvaToFirstByteOfData: u32,
    pub RvaToLastByteOfData: u32,
}
import "golang.org/x/sys/windows"

type IMAGE_COFF_SYMBOLS_HEADER struct {
	NumberOfSymbols uint32
	LvaToFirstSymbol uint32
	NumberOfLinenumbers uint32
	LvaToFirstLinenumber uint32
	RvaToFirstByteOfCode uint32
	RvaToLastByteOfCode uint32
	RvaToFirstByteOfData uint32
	RvaToLastByteOfData uint32
}
type
  IMAGE_COFF_SYMBOLS_HEADER = record
    NumberOfSymbols: DWORD;
    LvaToFirstSymbol: DWORD;
    NumberOfLinenumbers: DWORD;
    LvaToFirstLinenumber: DWORD;
    RvaToFirstByteOfCode: DWORD;
    RvaToLastByteOfCode: DWORD;
    RvaToFirstByteOfData: DWORD;
    RvaToLastByteOfData: DWORD;
  end;
const IMAGE_COFF_SYMBOLS_HEADER = extern struct {
    NumberOfSymbols: u32,
    LvaToFirstSymbol: u32,
    NumberOfLinenumbers: u32,
    LvaToFirstLinenumber: u32,
    RvaToFirstByteOfCode: u32,
    RvaToLastByteOfCode: u32,
    RvaToFirstByteOfData: u32,
    RvaToLastByteOfData: u32,
};
type
  IMAGE_COFF_SYMBOLS_HEADER {.bycopy.} = object
    NumberOfSymbols: uint32
    LvaToFirstSymbol: uint32
    NumberOfLinenumbers: uint32
    LvaToFirstLinenumber: uint32
    RvaToFirstByteOfCode: uint32
    RvaToLastByteOfCode: uint32
    RvaToFirstByteOfData: uint32
    RvaToLastByteOfData: uint32
struct IMAGE_COFF_SYMBOLS_HEADER
{
    uint NumberOfSymbols;
    uint LvaToFirstSymbol;
    uint NumberOfLinenumbers;
    uint LvaToFirstLinenumber;
    uint RvaToFirstByteOfCode;
    uint RvaToLastByteOfCode;
    uint RvaToFirstByteOfData;
    uint RvaToLastByteOfData;
}

HSP用 定義

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

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; IMAGE_COFF_SYMBOLS_HEADER サイズ: 32 バイト(x64)
dim st, 8    ; 4byte整数×8(構造体サイズ 32 / 4 切り上げ)
; NumberOfSymbols : DWORD (+0, 4byte)  st.0 = 値  /  値 = st.0   (lpoke/lpeek も可)
; LvaToFirstSymbol : DWORD (+4, 4byte)  st.1 = 値  /  値 = st.1   (lpoke/lpeek も可)
; NumberOfLinenumbers : DWORD (+8, 4byte)  st.2 = 値  /  値 = st.2   (lpoke/lpeek も可)
; LvaToFirstLinenumber : DWORD (+12, 4byte)  st.3 = 値  /  値 = st.3   (lpoke/lpeek も可)
; RvaToFirstByteOfCode : DWORD (+16, 4byte)  st.4 = 値  /  値 = st.4   (lpoke/lpeek も可)
; RvaToLastByteOfCode : DWORD (+20, 4byte)  st.5 = 値  /  値 = st.5   (lpoke/lpeek も可)
; RvaToFirstByteOfData : DWORD (+24, 4byte)  st.6 = 値  /  値 = st.6   (lpoke/lpeek も可)
; RvaToLastByteOfData : DWORD (+28, 4byte)  st.7 = 値  /  値 = st.7   (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global IMAGE_COFF_SYMBOLS_HEADER
    #field int NumberOfSymbols
    #field int LvaToFirstSymbol
    #field int NumberOfLinenumbers
    #field int LvaToFirstLinenumber
    #field int RvaToFirstByteOfCode
    #field int RvaToLastByteOfCode
    #field int RvaToFirstByteOfData
    #field int RvaToLastByteOfData
#endstruct

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