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

ARM64_NT_CONTEXT

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

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

フィールド

フィールドサイズx64x86説明
ContextFlagsDWORD4+0+0有効なレジスタ群を示すビットマスク。
CpsrDWORD4+4+4現在プログラム状態レジスタ(CPSR)。
Anonymous_Anonymous_e__Union248+8+8汎用レジスタX0-X28とFP/LR/SPを格納する無名共用体。
SpULONGLONG8+256+256スタックポインタ(SP)。
PcULONGLONG8+264+264プログラムカウンタ(PC)。
VARM64_NT_NEON128512+272+272NEON/浮動小数点ベクタレジスタV0-V31。
FpcrDWORD4+784+784浮動小数点制御レジスタ。
FpsrDWORD4+788+788浮動小数点状態レジスタ。
BcrDWORD32+792+792ブレークポイント制御レジスタ配列。
BvrULONGLONG64+824+824ブレークポイント値レジスタ配列。
WcrDWORD8+888+888ウォッチポイント制御レジスタ配列。
WvrULONGLONG16+896+896ウォッチポイント値レジスタ配列。

共用体: _Anonymous_e__Union x64 248B / x86 248B

フィールドサイズx64x86説明
Anonymous_Anonymous_e__Struct8/4+0+0汎用レジスタX0-X28とFP/LR/SPを格納する無名共用体。
XULONGLONG248+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 Structure
import 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 非対応)。必要に応じ手動でアクセス。