ホーム › System.Diagnostics.Debug › DISPATCHER_CONTEXT
DISPATCHER_CONTEXT
構造体サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。
フィールド
| フィールド | 型 | サイズ | x64 | x86 | 説明 |
|---|---|---|---|---|---|
| ControlPc | ULONGLONG | 8 | +0 | +0 | 例外処理中の制御PC(現在の命令アドレス)。 |
| ImageBase | ULONGLONG | 8 | +8 | +8 | 対象モジュールのイメージベースアドレス。 |
| FunctionEntry | IMAGE_RUNTIME_FUNCTION_ENTRY* | 8/4 | +16 | +16 | 対応する関数の実行時関数エントリへのポインタ。 |
| EstablisherFrame | ULONGLONG | 8 | +24 | +24 | 例外ハンドラを設定したフレームのアドレス。 |
| TargetIp | ULONGLONG | 8 | +32 | +32 | 巻き戻し先のターゲット命令ポインタ。x64版。 |
| ContextRecord | CONTEXT* | 8/4 | +40 | +40 | 対象スレッドのレジスタ状態を保持するCONTEXTへのポインタ。 |
| LanguageHandler | EXCEPTION_ROUTINE | 8/4 | +48 | +44 | 言語固有の例外ハンドラルーチン。 |
| HandlerData | void* | 8/4 | +56 | +48 | 例外ハンドラに渡される補助データへのポインタ。 |
| HistoryTable | UNWIND_HISTORY_TABLE* | 8/4 | +64 | +52 | アンワインド履歴テーブルへのポインタ。検索高速化に用いる。 |
| ScopeIndex | DWORD | 4 | +72 | +56 | 現在処理中のスコープ(__try)のインデックス。 |
| Fill0 | DWORD | 4 | +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 Structureimport 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: uint32struct 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