ホーム › System.Diagnostics.Debug › ARM64_NT_CONTEXT
ARM64_NT_CONTEXT
構造体サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。
フィールド
| フィールド | 型 | サイズ | x64 | x86 | 説明 |
|---|---|---|---|---|---|
| ContextFlags | DWORD | 4 | +0 | +0 | 有効なレジスタ群を示すビットマスク。 |
| Cpsr | DWORD | 4 | +4 | +4 | 現在プログラム状態レジスタ(CPSR)。 |
| Anonymous | _Anonymous_e__Union | 248 | +8 | +8 | 汎用レジスタX0-X28とFP/LR/SPを格納する無名共用体。 |
| Sp | ULONGLONG | 8 | +256 | +256 | スタックポインタ(SP)。 |
| Pc | ULONGLONG | 8 | +264 | +264 | プログラムカウンタ(PC)。 |
| V | ARM64_NT_NEON128 | 512 | +272 | +272 | NEON/浮動小数点ベクタレジスタV0-V31。 |
| Fpcr | DWORD | 4 | +784 | +784 | 浮動小数点制御レジスタ。 |
| Fpsr | DWORD | 4 | +788 | +788 | 浮動小数点状態レジスタ。 |
| Bcr | DWORD | 32 | +792 | +792 | ブレークポイント制御レジスタ配列。 |
| Bvr | ULONGLONG | 64 | +824 | +824 | ブレークポイント値レジスタ配列。 |
| Wcr | DWORD | 8 | +888 | +888 | ウォッチポイント制御レジスタ配列。 |
| Wvr | ULONGLONG | 16 | +896 | +896 | ウォッチポイント値レジスタ配列。 |
共用体: _Anonymous_e__Union x64 248B / x86 248B
| フィールド | 型 | サイズ | x64 | x86 | 説明 |
|---|---|---|---|---|---|
| Anonymous | _Anonymous_e__Struct | 8/4 | +0 | +0 | 汎用レジスタX0-X28とFP/LR/SPを格納する無名共用体。 |
| X | ULONGLONG | 248 | +0 | +0 |
各言語での定義
#include <windows.h>
// ARM64_NT_NEON128 (x64 16 / x86 16 バイト)
typedef struct ARM64_NT_NEON128 {
_Anonymous_e__Struct Anonymous;
DOUBLE D[2];
FLOAT S[4];
WORD H[8];
BYTE B[16];
} ARM64_NT_NEON128;
// ARM64_NT_CONTEXT (x64 912 / x86 912 バイト)
typedef struct ARM64_NT_CONTEXT {
DWORD ContextFlags;
DWORD Cpsr;
_Anonymous_e__Union Anonymous;
ULONGLONG Sp;
ULONGLONG Pc;
ARM64_NT_NEON128 V[32];
DWORD Fpcr;
DWORD Fpsr;
DWORD Bcr[8];
ULONGLONG Bvr[8];
DWORD Wcr[2];
ULONGLONG Wvr[2];
} ARM64_NT_CONTEXT;using System;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct ARM64_NT_NEON128
{
public _Anonymous_e__Struct Anonymous;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] public double[] D;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] public float[] S;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] public ushort[] H;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] public byte[] B;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct ARM64_NT_CONTEXT
{
public uint ContextFlags;
public uint Cpsr;
public _Anonymous_e__Union Anonymous;
public ulong Sp;
public ulong Pc;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)] public ARM64_NT_NEON128[] V;
public uint Fpcr;
public uint Fpsr;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] public uint[] Bcr;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] public ulong[] Bvr;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] public uint[] Wcr;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] public ulong[] Wvr;
}Imports System.Runtime.InteropServices
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure ARM64_NT_NEON128
Public Anonymous As _Anonymous_e__Struct
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=2)> Public D() As Double
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=4)> Public S() As Single
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=8)> Public H() As UShort
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=16)> Public B() As Byte
End Structure
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure ARM64_NT_CONTEXT
Public ContextFlags As UInteger
Public Cpsr As UInteger
Public Anonymous As _Anonymous_e__Union
Public Sp As ULong
Public Pc As ULong
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=32)> Public V() As ARM64_NT_NEON128
Public Fpcr As UInteger
Public Fpsr As UInteger
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=8)> Public Bcr() As UInteger
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=8)> Public Bvr() As ULong
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=2)> Public Wcr() As UInteger
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=2)> Public Wvr() As ULong
End Structureimport ctypes
from ctypes import wintypes
class ARM64_NT_NEON128(ctypes.Structure):
_fields_ = [
("Anonymous", _Anonymous_e__Struct),
("D", ctypes.c_double * 2),
("S", ctypes.c_float * 4),
("H", ctypes.c_ushort * 8),
("B", ctypes.c_ubyte * 16),
]
class ARM64_NT_CONTEXT(ctypes.Structure):
_fields_ = [
("ContextFlags", wintypes.DWORD),
("Cpsr", wintypes.DWORD),
("Anonymous", _Anonymous_e__Union),
("Sp", ctypes.c_ulonglong),
("Pc", ctypes.c_ulonglong),
("V", ARM64_NT_NEON128 * 32),
("Fpcr", wintypes.DWORD),
("Fpsr", wintypes.DWORD),
("Bcr", wintypes.DWORD * 8),
("Bvr", ctypes.c_ulonglong * 8),
("Wcr", wintypes.DWORD * 2),
("Wvr", ctypes.c_ulonglong * 2),
]#[repr(C)]
pub struct ARM64_NT_NEON128 {
pub Anonymous: _Anonymous_e__Struct,
pub D: [f64; 2],
pub S: [f32; 4],
pub H: [u16; 8],
pub B: [u8; 16],
}
#[repr(C)]
pub struct ARM64_NT_CONTEXT {
pub ContextFlags: u32,
pub Cpsr: u32,
pub Anonymous: _Anonymous_e__Union,
pub Sp: u64,
pub Pc: u64,
pub V: [ARM64_NT_NEON128; 32],
pub Fpcr: u32,
pub Fpsr: u32,
pub Bcr: [u32; 8],
pub Bvr: [u64; 8],
pub Wcr: [u32; 2],
pub Wvr: [u64; 2],
}import "golang.org/x/sys/windows"
type ARM64_NT_NEON128 struct {
Anonymous _Anonymous_e__Struct
D [2]float64
S [4]float32
H [8]uint16
B [16]byte
}
type ARM64_NT_CONTEXT struct {
ContextFlags uint32
Cpsr uint32
Anonymous _Anonymous_e__Union
Sp uint64
Pc uint64
V [32]ARM64_NT_NEON128
Fpcr uint32
Fpsr uint32
Bcr [8]uint32
Bvr [8]uint64
Wcr [2]uint32
Wvr [2]uint64
}type
ARM64_NT_NEON128 = record
Anonymous: _Anonymous_e__Struct;
D: array[0..1] of Double;
S: array[0..3] of Single;
H: array[0..7] of Word;
B: array[0..15] of Byte;
end;
ARM64_NT_CONTEXT = record
ContextFlags: DWORD;
Cpsr: DWORD;
Anonymous: _Anonymous_e__Union;
Sp: UInt64;
Pc: UInt64;
V: array[0..31] of ARM64_NT_NEON128;
Fpcr: DWORD;
Fpsr: DWORD;
Bcr: array[0..7] of DWORD;
Bvr: array[0..7] of UInt64;
Wcr: array[0..1] of DWORD;
Wvr: array[0..1] of UInt64;
end;const ARM64_NT_NEON128 = extern struct {
Anonymous: _Anonymous_e__Struct,
D: [2]f64,
S: [4]f32,
H: [8]u16,
B: [16]u8,
};
const ARM64_NT_CONTEXT = extern struct {
ContextFlags: u32,
Cpsr: u32,
Anonymous: _Anonymous_e__Union,
Sp: u64,
Pc: u64,
V: [32]ARM64_NT_NEON128,
Fpcr: u32,
Fpsr: u32,
Bcr: [8]u32,
Bvr: [8]u64,
Wcr: [2]u32,
Wvr: [2]u64,
};type
ARM64_NT_NEON128 {.bycopy.} = object
Anonymous: _Anonymous_e__Struct
D: array[2, float64]
S: array[4, float32]
H: array[8, uint16]
B: array[16, uint8]
ARM64_NT_CONTEXT {.bycopy.} = object
ContextFlags: uint32
Cpsr: uint32
Anonymous: _Anonymous_e__Union
Sp: uint64
Pc: uint64
V: array[32, ARM64_NT_NEON128]
Fpcr: uint32
Fpsr: uint32
Bcr: array[8, uint32]
Bvr: array[8, uint64]
Wcr: array[2, uint32]
Wvr: array[2, uint64]struct ARM64_NT_NEON128
{
_Anonymous_e__Struct Anonymous;
double[2] D;
float[4] S;
ushort[8] H;
ubyte[16] B;
}
struct ARM64_NT_CONTEXT
{
uint ContextFlags;
uint Cpsr;
_Anonymous_e__Union Anonymous;
ulong Sp;
ulong Pc;
ARM64_NT_NEON128[32] V;
uint Fpcr;
uint Fpsr;
uint[8] Bcr;
ulong[8] Bvr;
uint[2] Wcr;
ulong[2] Wvr;
}HSP用 定義
HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; ARM64_NT_CONTEXT サイズ: 912 バイト(x64)
dim st, 228 ; 4byte整数×228(構造体サイズ 912 / 4 切り上げ)
; ContextFlags : DWORD (+0, 4byte) st.0 = 値 / 値 = st.0 (lpoke/lpeek も可)
; Cpsr : DWORD (+4, 4byte) st.1 = 値 / 値 = st.1 (lpoke/lpeek も可)
; Anonymous : _Anonymous_e__Union (+8, 248byte) varptr(st)+8 を基点に操作(248byte:入れ子/配列)
; Sp : ULONGLONG (+256, 8byte) qpoke st,256,値 / qpeek(st,256) ※IronHSPのみ。3.7/3.8は lpoke st,256,下位 : lpoke st,260,上位
; Pc : ULONGLONG (+264, 8byte) qpoke st,264,値 / qpeek(st,264) ※IronHSPのみ。3.7/3.8は lpoke st,264,下位 : lpoke st,268,上位
; V : ARM64_NT_NEON128 (+272, 512byte) varptr(st)+272 を基点に操作(512byte:入れ子/配列)
; Fpcr : DWORD (+784, 4byte) st.196 = 値 / 値 = st.196 (lpoke/lpeek も可)
; Fpsr : DWORD (+788, 4byte) st.197 = 値 / 値 = st.197 (lpoke/lpeek も可)
; Bcr : DWORD (+792, 32byte) varptr(st)+792 を基点に操作(32byte:入れ子/配列)
; Bvr : ULONGLONG (+824, 64byte) varptr(st)+824 を基点に操作(64byte:入れ子/配列)
; Wcr : DWORD (+888, 8byte) varptr(st)+888 を基点に操作(8byte:入れ子/配列)
; Wvr : ULONGLONG (+896, 16byte) varptr(st)+896 を基点に操作(16byte:入れ子/配列)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global ARM64_NT_CONTEXT
#field int ContextFlags
#field int Cpsr
#field byte Anonymous 248
#field int64 Sp
#field int64 Pc
#field byte V 512
#field int Fpcr
#field int Fpsr
#field int Bcr 8
#field int64 Bvr 8
#field int Wcr 2
#field int64 Wvr 2
#endstruct
stdim st, ARM64_NT_CONTEXT ; NSTRUCT 変数を確保
st->ContextFlags = 100
mes "ContextFlags=" + st->ContextFlags
; ※union フィールドは byte 列で確保(NSTRUCT は union 非対応)。必要に応じ手動でアクセス。