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

DISPATCHER_CONTEXT

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

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

フィールド

フィールドサイズx64x86説明
ControlPcULONGLONG8+0+0例外処理中の制御PC(現在の命令アドレス)。
ImageBaseULONGLONG8+8+8対象モジュールのイメージベースアドレス。
FunctionEntryIMAGE_RUNTIME_FUNCTION_ENTRY*8/4+16+16対応する関数の実行時関数エントリへのポインタ。
EstablisherFrameULONGLONG8+24+24例外ハンドラを設定したフレームのアドレス。
TargetIpULONGLONG8+32+32巻き戻し先のターゲット命令ポインタ。x64版。
ContextRecordCONTEXT*8/4+40+40対象スレッドのレジスタ状態を保持するCONTEXTへのポインタ。
LanguageHandlerEXCEPTION_ROUTINE8/4+48+44言語固有の例外ハンドラルーチン。
HandlerDatavoid*8/4+56+48例外ハンドラに渡される補助データへのポインタ。
HistoryTableUNWIND_HISTORY_TABLE*8/4+64+52アンワインド履歴テーブルへのポインタ。検索高速化に用いる。
ScopeIndexDWORD4+72+56現在処理中のスコープ(__try)のインデックス。
Fill0DWORD4+76+60構造体アラインメント用の予約パディング(x64)。

各言語での定義

#include <windows.h>

// DISPATCHER_CONTEXT  (x64 80 / x86 64 バイト)
typedef struct DISPATCHER_CONTEXT {
    ULONGLONG ControlPc;
    ULONGLONG ImageBase;
    IMAGE_RUNTIME_FUNCTION_ENTRY* FunctionEntry;
    ULONGLONG EstablisherFrame;
    ULONGLONG TargetIp;
    CONTEXT* ContextRecord;
    EXCEPTION_ROUTINE LanguageHandler;
    void* HandlerData;
    UNWIND_HISTORY_TABLE* HistoryTable;
    DWORD ScopeIndex;
    DWORD Fill0;
} DISPATCHER_CONTEXT;
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct DISPATCHER_CONTEXT
{
    public ulong ControlPc;
    public ulong ImageBase;
    public IntPtr FunctionEntry;
    public ulong EstablisherFrame;
    public ulong TargetIp;
    public IntPtr ContextRecord;
    public IntPtr LanguageHandler;
    public IntPtr HandlerData;
    public IntPtr HistoryTable;
    public uint ScopeIndex;
    public uint Fill0;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure DISPATCHER_CONTEXT
    Public ControlPc As ULong
    Public ImageBase As ULong
    Public FunctionEntry As IntPtr
    Public EstablisherFrame As ULong
    Public TargetIp As ULong
    Public ContextRecord As IntPtr
    Public LanguageHandler As IntPtr
    Public HandlerData As IntPtr
    Public HistoryTable As IntPtr
    Public ScopeIndex As UInteger
    Public Fill0 As UInteger
End Structure
import ctypes
from ctypes import wintypes

class DISPATCHER_CONTEXT(ctypes.Structure):
    _fields_ = [
        ("ControlPc", ctypes.c_ulonglong),
        ("ImageBase", ctypes.c_ulonglong),
        ("FunctionEntry", ctypes.c_void_p),
        ("EstablisherFrame", ctypes.c_ulonglong),
        ("TargetIp", ctypes.c_ulonglong),
        ("ContextRecord", ctypes.c_void_p),
        ("LanguageHandler", ctypes.c_void_p),
        ("HandlerData", ctypes.c_void_p),
        ("HistoryTable", ctypes.c_void_p),
        ("ScopeIndex", wintypes.DWORD),
        ("Fill0", wintypes.DWORD),
    ]
#[repr(C)]
pub struct DISPATCHER_CONTEXT {
    pub ControlPc: u64,
    pub ImageBase: u64,
    pub FunctionEntry: *mut core::ffi::c_void,
    pub EstablisherFrame: u64,
    pub TargetIp: u64,
    pub ContextRecord: *mut core::ffi::c_void,
    pub LanguageHandler: *mut core::ffi::c_void,
    pub HandlerData: *mut core::ffi::c_void,
    pub HistoryTable: *mut core::ffi::c_void,
    pub ScopeIndex: u32,
    pub Fill0: u32,
}
import "golang.org/x/sys/windows"

type DISPATCHER_CONTEXT struct {
	ControlPc uint64
	ImageBase uint64
	FunctionEntry uintptr
	EstablisherFrame uint64
	TargetIp uint64
	ContextRecord uintptr
	LanguageHandler uintptr
	HandlerData uintptr
	HistoryTable uintptr
	ScopeIndex uint32
	Fill0 uint32
}
type
  DISPATCHER_CONTEXT = record
    ControlPc: UInt64;
    ImageBase: UInt64;
    FunctionEntry: Pointer;
    EstablisherFrame: UInt64;
    TargetIp: UInt64;
    ContextRecord: Pointer;
    LanguageHandler: Pointer;
    HandlerData: Pointer;
    HistoryTable: Pointer;
    ScopeIndex: DWORD;
    Fill0: DWORD;
  end;
const DISPATCHER_CONTEXT = extern struct {
    ControlPc: u64,
    ImageBase: u64,
    FunctionEntry: ?*anyopaque,
    EstablisherFrame: u64,
    TargetIp: u64,
    ContextRecord: ?*anyopaque,
    LanguageHandler: ?*anyopaque,
    HandlerData: ?*anyopaque,
    HistoryTable: ?*anyopaque,
    ScopeIndex: u32,
    Fill0: u32,
};
type
  DISPATCHER_CONTEXT {.bycopy.} = object
    ControlPc: uint64
    ImageBase: uint64
    FunctionEntry: pointer
    EstablisherFrame: uint64
    TargetIp: uint64
    ContextRecord: pointer
    LanguageHandler: pointer
    HandlerData: pointer
    HistoryTable: pointer
    ScopeIndex: uint32
    Fill0: uint32
struct DISPATCHER_CONTEXT
{
    ulong ControlPc;
    ulong ImageBase;
    void* FunctionEntry;
    ulong EstablisherFrame;
    ulong TargetIp;
    void* ContextRecord;
    void* LanguageHandler;
    void* HandlerData;
    void* HistoryTable;
    uint ScopeIndex;
    uint Fill0;
}

HSP用 定義

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

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; DISPATCHER_CONTEXT サイズ: 64 バイト(x86)
dim st, 16    ; 4byte整数×16(構造体サイズ 64 / 4 切り上げ)
; ControlPc : ULONGLONG (+0, 8byte)  qpoke st,0,値 / qpeek(st,0)  ※IronHSPのみ。3.7/3.8は lpoke st,0,下位 : lpoke st,4,上位
; ImageBase : ULONGLONG (+8, 8byte)  qpoke st,8,値 / qpeek(st,8)  ※IronHSPのみ。3.7/3.8は lpoke st,8,下位 : lpoke st,12,上位
; FunctionEntry : IMAGE_RUNTIME_FUNCTION_ENTRY* (+16, 4byte)  varptr(st)+16 を基点に操作(4byte:入れ子/配列)
; EstablisherFrame : ULONGLONG (+24, 8byte)  qpoke st,24,値 / qpeek(st,24)  ※IronHSPのみ。3.7/3.8は lpoke st,24,下位 : lpoke st,28,上位
; TargetIp : ULONGLONG (+32, 8byte)  qpoke st,32,値 / qpeek(st,32)  ※IronHSPのみ。3.7/3.8は lpoke st,32,下位 : lpoke st,36,上位
; ContextRecord : CONTEXT* (+40, 4byte)  varptr(st)+40 を基点に操作(4byte:入れ子/配列)
; LanguageHandler : EXCEPTION_ROUTINE (+44, 4byte)  st.11 = 値  /  値 = st.11   (lpoke/lpeek も可)
; HandlerData : void* (+48, 4byte)  st.12 = 値  /  値 = st.12   (lpoke/lpeek も可)
; HistoryTable : UNWIND_HISTORY_TABLE* (+52, 4byte)  varptr(st)+52 を基点に操作(4byte:入れ子/配列)
; ScopeIndex : DWORD (+56, 4byte)  st.14 = 値  /  値 = st.14   (lpoke/lpeek も可)
; Fill0 : DWORD (+60, 4byte)  st.15 = 値  /  値 = st.15   (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; DISPATCHER_CONTEXT サイズ: 80 バイト(x64)
dim st, 20    ; 4byte整数×20(構造体サイズ 80 / 4 切り上げ)
; ControlPc : ULONGLONG (+0, 8byte)  qpoke st,0,値 / qpeek(st,0)  ※IronHSPのみ。3.7/3.8は lpoke st,0,下位 : lpoke st,4,上位
; ImageBase : ULONGLONG (+8, 8byte)  qpoke st,8,値 / qpeek(st,8)  ※IronHSPのみ。3.7/3.8は lpoke st,8,下位 : lpoke st,12,上位
; FunctionEntry : IMAGE_RUNTIME_FUNCTION_ENTRY* (+16, 8byte)  varptr(st)+16 を基点に操作(8byte:入れ子/配列)
; EstablisherFrame : ULONGLONG (+24, 8byte)  qpoke st,24,値 / qpeek(st,24)  ※IronHSPのみ。3.7/3.8は lpoke st,24,下位 : lpoke st,28,上位
; TargetIp : ULONGLONG (+32, 8byte)  qpoke st,32,値 / qpeek(st,32)  ※IronHSPのみ。3.7/3.8は lpoke st,32,下位 : lpoke st,36,上位
; ContextRecord : CONTEXT* (+40, 8byte)  varptr(st)+40 を基点に操作(8byte:入れ子/配列)
; LanguageHandler : EXCEPTION_ROUTINE (+48, 8byte)  qpoke st,48,値 / qpeek(st,48)  ※IronHSPのみ。3.7/3.8は lpoke st,48,下位 : lpoke st,52,上位
; HandlerData : void* (+56, 8byte)  qpoke st,56,値 / qpeek(st,56)  ※IronHSPのみ。3.7/3.8は lpoke st,56,下位 : lpoke st,60,上位
; HistoryTable : UNWIND_HISTORY_TABLE* (+64, 8byte)  varptr(st)+64 を基点に操作(8byte:入れ子/配列)
; ScopeIndex : DWORD (+72, 4byte)  st.18 = 値  /  値 = st.18   (lpoke/lpeek も可)
; Fill0 : DWORD (+76, 4byte)  st.19 = 値  /  値 = st.19   (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global DISPATCHER_CONTEXT
    #field int64 ControlPc
    #field int64 ImageBase
    #field intptr FunctionEntry
    #field int64 EstablisherFrame
    #field int64 TargetIp
    #field intptr ContextRecord
    #field intptr LanguageHandler
    #field intptr HandlerData
    #field intptr HistoryTable
    #field int ScopeIndex
    #field int Fill0
#endstruct

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