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

CONTEXT

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

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

フィールド

フィールドサイズx64x86説明
ContextFlagsCONTEXT_FLAGS4+0+0有効なレジスタ群を示すCONTEXT_FLAGSビットマスク。取得/設定対象を選択する。
Dr0DWORD4+4+4デバッグレジスタDR0。ハードウェアブレークポイントアドレス。
Dr1DWORD4+8+8デバッグレジスタDR1。
Dr2DWORD4+12+12デバッグレジスタDR2。
Dr3DWORD4+16+16デバッグレジスタDR3。
Dr6DWORD4+20+20デバッグ状態レジスタDR6。
Dr7DWORD4+24+24デバッグ制御レジスタDR7。
FloatSaveFLOATING_SAVE_AREA112+28+28x87 FPU状態を格納するFLOATING_SAVE_AREA。
SegGsDWORD4+140+140GSセグメントセレクタ。
SegFsDWORD4+144+144FSセグメントセレクタ。
SegEsDWORD4+148+148エクストラセグメント(ES)セレクタ。
SegDsDWORD4+152+152データセグメント(DS)セレクタ。
EdiDWORD4+156+156汎用レジスタEDI(x86)。
EsiDWORD4+160+160汎用レジスタESI。
EbxDWORD4+164+164汎用レジスタEBX。
EdxDWORD4+168+168汎用レジスタEDX。
EcxDWORD4+172+172汎用レジスタECX。
EaxDWORD4+176+176汎用レジスタEAX。
EbpDWORD4+180+180ベースポインタEBP。
EipDWORD4+184+184命令ポインタEIP(x86)。
SegCsDWORD4+188+188コードセグメント(CS)セレクタ。
EFlagsDWORD4+192+192CPUのフラグレジスタ(EFLAGS)。
EspDWORD4+196+196スタックポインタESP。
SegSsDWORD4+200+200スタックセグメント(SS)セレクタ。
ExtendedRegistersBYTE512+204+204拡張レジスタ(SSE等)を保存するバイト配列。

各言語での定義

#include <windows.h>

// FLOATING_SAVE_AREA  (x64 112 / x86 112 バイト)
typedef struct FLOATING_SAVE_AREA {
    DWORD ControlWord;
    DWORD StatusWord;
    DWORD TagWord;
    DWORD ErrorOffset;
    DWORD ErrorSelector;
    DWORD DataOffset;
    DWORD DataSelector;
    BYTE RegisterArea[80];
    DWORD Cr0NpxState;
} FLOATING_SAVE_AREA;

// CONTEXT  (x64 716 / x86 716 バイト)
typedef struct CONTEXT {
    CONTEXT_FLAGS ContextFlags;
    DWORD Dr0;
    DWORD Dr1;
    DWORD Dr2;
    DWORD Dr3;
    DWORD Dr6;
    DWORD Dr7;
    FLOATING_SAVE_AREA FloatSave;
    DWORD SegGs;
    DWORD SegFs;
    DWORD SegEs;
    DWORD SegDs;
    DWORD Edi;
    DWORD Esi;
    DWORD Ebx;
    DWORD Edx;
    DWORD Ecx;
    DWORD Eax;
    DWORD Ebp;
    DWORD Eip;
    DWORD SegCs;
    DWORD EFlags;
    DWORD Esp;
    DWORD SegSs;
    BYTE ExtendedRegisters[512];
} CONTEXT;
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct FLOATING_SAVE_AREA
{
    public uint ControlWord;
    public uint StatusWord;
    public uint TagWord;
    public uint ErrorOffset;
    public uint ErrorSelector;
    public uint DataOffset;
    public uint DataSelector;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 80)] public byte[] RegisterArea;
    public uint Cr0NpxState;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct CONTEXT
{
    public uint ContextFlags;
    public uint Dr0;
    public uint Dr1;
    public uint Dr2;
    public uint Dr3;
    public uint Dr6;
    public uint Dr7;
    public FLOATING_SAVE_AREA FloatSave;
    public uint SegGs;
    public uint SegFs;
    public uint SegEs;
    public uint SegDs;
    public uint Edi;
    public uint Esi;
    public uint Ebx;
    public uint Edx;
    public uint Ecx;
    public uint Eax;
    public uint Ebp;
    public uint Eip;
    public uint SegCs;
    public uint EFlags;
    public uint Esp;
    public uint SegSs;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 512)] public byte[] ExtendedRegisters;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure FLOATING_SAVE_AREA
    Public ControlWord As UInteger
    Public StatusWord As UInteger
    Public TagWord As UInteger
    Public ErrorOffset As UInteger
    Public ErrorSelector As UInteger
    Public DataOffset As UInteger
    Public DataSelector As UInteger
    <MarshalAs(UnmanagedType.ByValArray, SizeConst:=80)> Public RegisterArea() As Byte
    Public Cr0NpxState As UInteger
End Structure

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure CONTEXT
    Public ContextFlags As UInteger
    Public Dr0 As UInteger
    Public Dr1 As UInteger
    Public Dr2 As UInteger
    Public Dr3 As UInteger
    Public Dr6 As UInteger
    Public Dr7 As UInteger
    Public FloatSave As FLOATING_SAVE_AREA
    Public SegGs As UInteger
    Public SegFs As UInteger
    Public SegEs As UInteger
    Public SegDs As UInteger
    Public Edi As UInteger
    Public Esi As UInteger
    Public Ebx As UInteger
    Public Edx As UInteger
    Public Ecx As UInteger
    Public Eax As UInteger
    Public Ebp As UInteger
    Public Eip As UInteger
    Public SegCs As UInteger
    Public EFlags As UInteger
    Public Esp As UInteger
    Public SegSs As UInteger
    <MarshalAs(UnmanagedType.ByValArray, SizeConst:=512)> Public ExtendedRegisters() As Byte
End Structure
import ctypes
from ctypes import wintypes

class FLOATING_SAVE_AREA(ctypes.Structure):
    _fields_ = [
        ("ControlWord", wintypes.DWORD),
        ("StatusWord", wintypes.DWORD),
        ("TagWord", wintypes.DWORD),
        ("ErrorOffset", wintypes.DWORD),
        ("ErrorSelector", wintypes.DWORD),
        ("DataOffset", wintypes.DWORD),
        ("DataSelector", wintypes.DWORD),
        ("RegisterArea", ctypes.c_ubyte * 80),
        ("Cr0NpxState", wintypes.DWORD),
    ]

class CONTEXT(ctypes.Structure):
    _fields_ = [
        ("ContextFlags", wintypes.DWORD),
        ("Dr0", wintypes.DWORD),
        ("Dr1", wintypes.DWORD),
        ("Dr2", wintypes.DWORD),
        ("Dr3", wintypes.DWORD),
        ("Dr6", wintypes.DWORD),
        ("Dr7", wintypes.DWORD),
        ("FloatSave", FLOATING_SAVE_AREA),
        ("SegGs", wintypes.DWORD),
        ("SegFs", wintypes.DWORD),
        ("SegEs", wintypes.DWORD),
        ("SegDs", wintypes.DWORD),
        ("Edi", wintypes.DWORD),
        ("Esi", wintypes.DWORD),
        ("Ebx", wintypes.DWORD),
        ("Edx", wintypes.DWORD),
        ("Ecx", wintypes.DWORD),
        ("Eax", wintypes.DWORD),
        ("Ebp", wintypes.DWORD),
        ("Eip", wintypes.DWORD),
        ("SegCs", wintypes.DWORD),
        ("EFlags", wintypes.DWORD),
        ("Esp", wintypes.DWORD),
        ("SegSs", wintypes.DWORD),
        ("ExtendedRegisters", ctypes.c_ubyte * 512),
    ]
#[repr(C)]
pub struct FLOATING_SAVE_AREA {
    pub ControlWord: u32,
    pub StatusWord: u32,
    pub TagWord: u32,
    pub ErrorOffset: u32,
    pub ErrorSelector: u32,
    pub DataOffset: u32,
    pub DataSelector: u32,
    pub RegisterArea: [u8; 80],
    pub Cr0NpxState: u32,
}

#[repr(C)]
pub struct CONTEXT {
    pub ContextFlags: u32,
    pub Dr0: u32,
    pub Dr1: u32,
    pub Dr2: u32,
    pub Dr3: u32,
    pub Dr6: u32,
    pub Dr7: u32,
    pub FloatSave: FLOATING_SAVE_AREA,
    pub SegGs: u32,
    pub SegFs: u32,
    pub SegEs: u32,
    pub SegDs: u32,
    pub Edi: u32,
    pub Esi: u32,
    pub Ebx: u32,
    pub Edx: u32,
    pub Ecx: u32,
    pub Eax: u32,
    pub Ebp: u32,
    pub Eip: u32,
    pub SegCs: u32,
    pub EFlags: u32,
    pub Esp: u32,
    pub SegSs: u32,
    pub ExtendedRegisters: [u8; 512],
}
import "golang.org/x/sys/windows"

type FLOATING_SAVE_AREA struct {
	ControlWord uint32
	StatusWord uint32
	TagWord uint32
	ErrorOffset uint32
	ErrorSelector uint32
	DataOffset uint32
	DataSelector uint32
	RegisterArea [80]byte
	Cr0NpxState uint32
}

type CONTEXT struct {
	ContextFlags uint32
	Dr0 uint32
	Dr1 uint32
	Dr2 uint32
	Dr3 uint32
	Dr6 uint32
	Dr7 uint32
	FloatSave FLOATING_SAVE_AREA
	SegGs uint32
	SegFs uint32
	SegEs uint32
	SegDs uint32
	Edi uint32
	Esi uint32
	Ebx uint32
	Edx uint32
	Ecx uint32
	Eax uint32
	Ebp uint32
	Eip uint32
	SegCs uint32
	EFlags uint32
	Esp uint32
	SegSs uint32
	ExtendedRegisters [512]byte
}
type
  FLOATING_SAVE_AREA = record
    ControlWord: DWORD;
    StatusWord: DWORD;
    TagWord: DWORD;
    ErrorOffset: DWORD;
    ErrorSelector: DWORD;
    DataOffset: DWORD;
    DataSelector: DWORD;
    RegisterArea: array[0..79] of Byte;
    Cr0NpxState: DWORD;
  end;

  CONTEXT = record
    ContextFlags: DWORD;
    Dr0: DWORD;
    Dr1: DWORD;
    Dr2: DWORD;
    Dr3: DWORD;
    Dr6: DWORD;
    Dr7: DWORD;
    FloatSave: FLOATING_SAVE_AREA;
    SegGs: DWORD;
    SegFs: DWORD;
    SegEs: DWORD;
    SegDs: DWORD;
    Edi: DWORD;
    Esi: DWORD;
    Ebx: DWORD;
    Edx: DWORD;
    Ecx: DWORD;
    Eax: DWORD;
    Ebp: DWORD;
    Eip: DWORD;
    SegCs: DWORD;
    EFlags: DWORD;
    Esp: DWORD;
    SegSs: DWORD;
    ExtendedRegisters: array[0..511] of Byte;
  end;
const FLOATING_SAVE_AREA = extern struct {
    ControlWord: u32,
    StatusWord: u32,
    TagWord: u32,
    ErrorOffset: u32,
    ErrorSelector: u32,
    DataOffset: u32,
    DataSelector: u32,
    RegisterArea: [80]u8,
    Cr0NpxState: u32,
};

const CONTEXT = extern struct {
    ContextFlags: u32,
    Dr0: u32,
    Dr1: u32,
    Dr2: u32,
    Dr3: u32,
    Dr6: u32,
    Dr7: u32,
    FloatSave: FLOATING_SAVE_AREA,
    SegGs: u32,
    SegFs: u32,
    SegEs: u32,
    SegDs: u32,
    Edi: u32,
    Esi: u32,
    Ebx: u32,
    Edx: u32,
    Ecx: u32,
    Eax: u32,
    Ebp: u32,
    Eip: u32,
    SegCs: u32,
    EFlags: u32,
    Esp: u32,
    SegSs: u32,
    ExtendedRegisters: [512]u8,
};
type
  FLOATING_SAVE_AREA {.bycopy.} = object
    ControlWord: uint32
    StatusWord: uint32
    TagWord: uint32
    ErrorOffset: uint32
    ErrorSelector: uint32
    DataOffset: uint32
    DataSelector: uint32
    RegisterArea: array[80, uint8]
    Cr0NpxState: uint32

  CONTEXT {.bycopy.} = object
    ContextFlags: uint32
    Dr0: uint32
    Dr1: uint32
    Dr2: uint32
    Dr3: uint32
    Dr6: uint32
    Dr7: uint32
    FloatSave: FLOATING_SAVE_AREA
    SegGs: uint32
    SegFs: uint32
    SegEs: uint32
    SegDs: uint32
    Edi: uint32
    Esi: uint32
    Ebx: uint32
    Edx: uint32
    Ecx: uint32
    Eax: uint32
    Ebp: uint32
    Eip: uint32
    SegCs: uint32
    EFlags: uint32
    Esp: uint32
    SegSs: uint32
    ExtendedRegisters: array[512, uint8]
struct FLOATING_SAVE_AREA
{
    uint ControlWord;
    uint StatusWord;
    uint TagWord;
    uint ErrorOffset;
    uint ErrorSelector;
    uint DataOffset;
    uint DataSelector;
    ubyte[80] RegisterArea;
    uint Cr0NpxState;
}

struct CONTEXT
{
    uint ContextFlags;
    uint Dr0;
    uint Dr1;
    uint Dr2;
    uint Dr3;
    uint Dr6;
    uint Dr7;
    FLOATING_SAVE_AREA FloatSave;
    uint SegGs;
    uint SegFs;
    uint SegEs;
    uint SegDs;
    uint Edi;
    uint Esi;
    uint Ebx;
    uint Edx;
    uint Ecx;
    uint Eax;
    uint Ebp;
    uint Eip;
    uint SegCs;
    uint EFlags;
    uint Esp;
    uint SegSs;
    ubyte[512] ExtendedRegisters;
}

HSP用 定義

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

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; CONTEXT サイズ: 716 バイト(x64)
dim st, 179    ; 4byte整数×179(構造体サイズ 716 / 4 切り上げ)
; ContextFlags : CONTEXT_FLAGS (+0, 4byte)  st.0 = 値  /  値 = st.0   (lpoke/lpeek も可)
; Dr0 : DWORD (+4, 4byte)  st.1 = 値  /  値 = st.1   (lpoke/lpeek も可)
; Dr1 : DWORD (+8, 4byte)  st.2 = 値  /  値 = st.2   (lpoke/lpeek も可)
; Dr2 : DWORD (+12, 4byte)  st.3 = 値  /  値 = st.3   (lpoke/lpeek も可)
; Dr3 : DWORD (+16, 4byte)  st.4 = 値  /  値 = st.4   (lpoke/lpeek も可)
; Dr6 : DWORD (+20, 4byte)  st.5 = 値  /  値 = st.5   (lpoke/lpeek も可)
; Dr7 : DWORD (+24, 4byte)  st.6 = 値  /  値 = st.6   (lpoke/lpeek も可)
; FloatSave : FLOATING_SAVE_AREA (+28, 112byte)  varptr(st)+28 を基点に操作(112byte:入れ子/配列)
; SegGs : DWORD (+140, 4byte)  st.35 = 値  /  値 = st.35   (lpoke/lpeek も可)
; SegFs : DWORD (+144, 4byte)  st.36 = 値  /  値 = st.36   (lpoke/lpeek も可)
; SegEs : DWORD (+148, 4byte)  st.37 = 値  /  値 = st.37   (lpoke/lpeek も可)
; SegDs : DWORD (+152, 4byte)  st.38 = 値  /  値 = st.38   (lpoke/lpeek も可)
; Edi : DWORD (+156, 4byte)  st.39 = 値  /  値 = st.39   (lpoke/lpeek も可)
; Esi : DWORD (+160, 4byte)  st.40 = 値  /  値 = st.40   (lpoke/lpeek も可)
; Ebx : DWORD (+164, 4byte)  st.41 = 値  /  値 = st.41   (lpoke/lpeek も可)
; Edx : DWORD (+168, 4byte)  st.42 = 値  /  値 = st.42   (lpoke/lpeek も可)
; Ecx : DWORD (+172, 4byte)  st.43 = 値  /  値 = st.43   (lpoke/lpeek も可)
; Eax : DWORD (+176, 4byte)  st.44 = 値  /  値 = st.44   (lpoke/lpeek も可)
; Ebp : DWORD (+180, 4byte)  st.45 = 値  /  値 = st.45   (lpoke/lpeek も可)
; Eip : DWORD (+184, 4byte)  st.46 = 値  /  値 = st.46   (lpoke/lpeek も可)
; SegCs : DWORD (+188, 4byte)  st.47 = 値  /  値 = st.47   (lpoke/lpeek も可)
; EFlags : DWORD (+192, 4byte)  st.48 = 値  /  値 = st.48   (lpoke/lpeek も可)
; Esp : DWORD (+196, 4byte)  st.49 = 値  /  値 = st.49   (lpoke/lpeek も可)
; SegSs : DWORD (+200, 4byte)  st.50 = 値  /  値 = st.50   (lpoke/lpeek も可)
; ExtendedRegisters : BYTE (+204, 512byte)  varptr(st)+204 を基点に操作(512byte:入れ子/配列)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
; ※GUID・入れ子構造体はデフォルト型でないため、依存する #defstruct を先に定義(下記に同梱)。
#defstruct global FLOATING_SAVE_AREA
    #field int ControlWord
    #field int StatusWord
    #field int TagWord
    #field int ErrorOffset
    #field int ErrorSelector
    #field int DataOffset
    #field int DataSelector
    #field byte RegisterArea 80
    #field int Cr0NpxState
#endstruct

#defstruct global CONTEXT
    #field int ContextFlags
    #field int Dr0
    #field int Dr1
    #field int Dr2
    #field int Dr3
    #field int Dr6
    #field int Dr7
    #field FLOATING_SAVE_AREA FloatSave
    #field int SegGs
    #field int SegFs
    #field int SegEs
    #field int SegDs
    #field int Edi
    #field int Esi
    #field int Ebx
    #field int Edx
    #field int Ecx
    #field int Eax
    #field int Ebp
    #field int Eip
    #field int SegCs
    #field int EFlags
    #field int Esp
    #field int SegSs
    #field byte ExtendedRegisters 512
#endstruct

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