ホーム › System.VirtualDosMachines › VDMCONTEXT
VDMCONTEXT
構造体サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。
フィールド
| フィールド | 型 | サイズ | x64 | x86 | 説明 |
|---|---|---|---|---|---|
| ContextFlags | DWORD | 4 | +0 | +0 | 取得/設定するレジスタ群を示すフラグのビットマスク(CONTEXT_*)。 |
| Dr0 | DWORD | 4 | +4 | +4 | デバッグレジスタDR0。ハードウェアブレークポイントアドレス。 |
| Dr1 | DWORD | 4 | +8 | +8 | デバッグレジスタDR1。ハードウェアブレークポイントアドレス。 |
| Dr2 | DWORD | 4 | +12 | +12 | デバッグレジスタDR2。ハードウェアブレークポイントアドレス。 |
| Dr3 | DWORD | 4 | +16 | +16 | デバッグレジスタDR3。ハードウェアブレークポイントアドレス。 |
| Dr6 | DWORD | 4 | +20 | +20 | デバッグステータスレジスタDR6。 |
| Dr7 | DWORD | 4 | +24 | +24 | デバッグ制御レジスタDR7。 |
| FloatSave | FLOATING_SAVE_AREA | 112 | +28 | +28 | x87 FPU(浮動小数点)の状態を保持するFLOATING_SAVE_AREA。 |
| SegGs | DWORD | 4 | +140 | +140 | GSセグメントレジスタの値。 |
| SegFs | DWORD | 4 | +144 | +144 | FSセグメントレジスタの値。 |
| SegEs | DWORD | 4 | +148 | +148 | ESセグメントレジスタの値。 |
| SegDs | DWORD | 4 | +152 | +152 | DSセグメントレジスタの値。 |
| Edi | DWORD | 4 | +156 | +156 | 汎用レジスタEDIの値。 |
| Esi | DWORD | 4 | +160 | +160 | 汎用レジスタESIの値。 |
| Ebx | DWORD | 4 | +164 | +164 | 汎用レジスタEBXの値。 |
| Edx | DWORD | 4 | +168 | +168 | 汎用レジスタEDXの値。 |
| Ecx | DWORD | 4 | +172 | +172 | 汎用レジスタECXの値。 |
| Eax | DWORD | 4 | +176 | +176 | 汎用レジスタEAXの値。 |
| Ebp | DWORD | 4 | +180 | +180 | ベースポインタレジスタEBPの値。 |
| Eip | DWORD | 4 | +184 | +184 | 命令ポインタレジスタEIPの値。次に実行する命令のアドレス。 |
| SegCs | DWORD | 4 | +188 | +188 | CSコードセグメントレジスタの値。 |
| EFlags | DWORD | 4 | +192 | +192 | フラグレジスタEFLAGSの値。 |
| Esp | DWORD | 4 | +196 | +196 | スタックポインタレジスタESPの値。 |
| SegSs | DWORD | 4 | +200 | +200 | SSスタックセグメントレジスタの値。 |
| ExtendedRegisters | BYTE | 512 | +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;
// VDMCONTEXT (x64 716 / x86 716 バイト)
typedef struct VDMCONTEXT {
DWORD 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];
} VDMCONTEXT;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 VDMCONTEXT
{
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 VDMCONTEXT
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 Structureimport 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 VDMCONTEXT(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 VDMCONTEXT {
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 VDMCONTEXT 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;
VDMCONTEXT = 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 VDMCONTEXT = 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
VDMCONTEXT {.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 VDMCONTEXT
{
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 レイアウト)
; VDMCONTEXT サイズ: 716 バイト(x64)
dim st, 179 ; 4byte整数×179(構造体サイズ 716 / 4 切り上げ)
; ContextFlags : DWORD (+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 VDMCONTEXT
#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, VDMCONTEXT ; NSTRUCT 変数を確保
st->ContextFlags = 100
mes "ContextFlags=" + st->ContextFlags