ホーム › System.Diagnostics.Debug › XSAVE_AREA
XSAVE_AREA
構造体サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。
フィールド
| フィールド | 型 | サイズ | x64 | x86 | 説明 |
|---|---|---|---|---|---|
| LegacyState | XSAVE_FORMAT | 512 | +0 | +0 | レガシーFXSAVE領域(XSAVE_FORMAT)。 |
| Header | XSAVE_AREA_HEADER | 64 | +512 | +512 | XSAVE領域ヘッダ(XSAVE_AREA_HEADER)。 |
各言語での定義
#include <windows.h>
// M128A (x64 16 / x86 16 バイト)
typedef struct M128A {
ULONGLONG Low;
LONGLONG High;
} M128A;
// XSAVE_FORMAT (x64 512 / x86 512 バイト)
typedef struct XSAVE_FORMAT {
WORD ControlWord;
WORD StatusWord;
BYTE TagWord;
BYTE Reserved1;
WORD ErrorOpcode;
DWORD ErrorOffset;
WORD ErrorSelector;
WORD Reserved2;
DWORD DataOffset;
WORD DataSelector;
WORD Reserved3;
DWORD MxCsr;
DWORD MxCsr_Mask;
M128A FloatRegisters[8];
M128A XmmRegisters[16];
BYTE Reserved4[96];
} XSAVE_FORMAT;
// XSAVE_AREA_HEADER (x64 64 / x86 64 バイト)
typedef struct XSAVE_AREA_HEADER {
ULONGLONG Mask;
ULONGLONG CompactionMask;
ULONGLONG Reserved2[6];
} XSAVE_AREA_HEADER;
// XSAVE_AREA (x64 576 / x86 576 バイト)
typedef struct XSAVE_AREA {
XSAVE_FORMAT LegacyState;
XSAVE_AREA_HEADER Header;
} XSAVE_AREA;using System;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct M128A
{
public ulong Low;
public long High;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct XSAVE_FORMAT
{
public ushort ControlWord;
public ushort StatusWord;
public byte TagWord;
public byte Reserved1;
public ushort ErrorOpcode;
public uint ErrorOffset;
public ushort ErrorSelector;
public ushort Reserved2;
public uint DataOffset;
public ushort DataSelector;
public ushort Reserved3;
public uint MxCsr;
public uint MxCsr_Mask;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] public M128A[] FloatRegisters;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] public M128A[] XmmRegisters;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 96)] public byte[] Reserved4;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct XSAVE_AREA_HEADER
{
public ulong Mask;
public ulong CompactionMask;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)] public ulong[] Reserved2;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct XSAVE_AREA
{
public XSAVE_FORMAT LegacyState;
public XSAVE_AREA_HEADER Header;
}Imports System.Runtime.InteropServices
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure M128A
Public Low As ULong
Public High As Long
End Structure
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure XSAVE_FORMAT
Public ControlWord As UShort
Public StatusWord As UShort
Public TagWord As Byte
Public Reserved1 As Byte
Public ErrorOpcode As UShort
Public ErrorOffset As UInteger
Public ErrorSelector As UShort
Public Reserved2 As UShort
Public DataOffset As UInteger
Public DataSelector As UShort
Public Reserved3 As UShort
Public MxCsr As UInteger
Public MxCsr_Mask As UInteger
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=8)> Public FloatRegisters() As M128A
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=16)> Public XmmRegisters() As M128A
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=96)> Public Reserved4() As Byte
End Structure
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure XSAVE_AREA_HEADER
Public Mask As ULong
Public CompactionMask As ULong
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=6)> Public Reserved2() As ULong
End Structure
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure XSAVE_AREA
Public LegacyState As XSAVE_FORMAT
Public Header As XSAVE_AREA_HEADER
End Structureimport ctypes
from ctypes import wintypes
class M128A(ctypes.Structure):
_fields_ = [
("Low", ctypes.c_ulonglong),
("High", ctypes.c_longlong),
]
class XSAVE_FORMAT(ctypes.Structure):
_fields_ = [
("ControlWord", ctypes.c_ushort),
("StatusWord", ctypes.c_ushort),
("TagWord", ctypes.c_ubyte),
("Reserved1", ctypes.c_ubyte),
("ErrorOpcode", ctypes.c_ushort),
("ErrorOffset", wintypes.DWORD),
("ErrorSelector", ctypes.c_ushort),
("Reserved2", ctypes.c_ushort),
("DataOffset", wintypes.DWORD),
("DataSelector", ctypes.c_ushort),
("Reserved3", ctypes.c_ushort),
("MxCsr", wintypes.DWORD),
("MxCsr_Mask", wintypes.DWORD),
("FloatRegisters", M128A * 8),
("XmmRegisters", M128A * 16),
("Reserved4", ctypes.c_ubyte * 96),
]
class XSAVE_AREA_HEADER(ctypes.Structure):
_fields_ = [
("Mask", ctypes.c_ulonglong),
("CompactionMask", ctypes.c_ulonglong),
("Reserved2", ctypes.c_ulonglong * 6),
]
class XSAVE_AREA(ctypes.Structure):
_fields_ = [
("LegacyState", XSAVE_FORMAT),
("Header", XSAVE_AREA_HEADER),
]#[repr(C)]
pub struct M128A {
pub Low: u64,
pub High: i64,
}
#[repr(C)]
pub struct XSAVE_FORMAT {
pub ControlWord: u16,
pub StatusWord: u16,
pub TagWord: u8,
pub Reserved1: u8,
pub ErrorOpcode: u16,
pub ErrorOffset: u32,
pub ErrorSelector: u16,
pub Reserved2: u16,
pub DataOffset: u32,
pub DataSelector: u16,
pub Reserved3: u16,
pub MxCsr: u32,
pub MxCsr_Mask: u32,
pub FloatRegisters: [M128A; 8],
pub XmmRegisters: [M128A; 16],
pub Reserved4: [u8; 96],
}
#[repr(C)]
pub struct XSAVE_AREA_HEADER {
pub Mask: u64,
pub CompactionMask: u64,
pub Reserved2: [u64; 6],
}
#[repr(C)]
pub struct XSAVE_AREA {
pub LegacyState: XSAVE_FORMAT,
pub Header: XSAVE_AREA_HEADER,
}import "golang.org/x/sys/windows"
type M128A struct {
Low uint64
High int64
}
type XSAVE_FORMAT struct {
ControlWord uint16
StatusWord uint16
TagWord byte
Reserved1 byte
ErrorOpcode uint16
ErrorOffset uint32
ErrorSelector uint16
Reserved2 uint16
DataOffset uint32
DataSelector uint16
Reserved3 uint16
MxCsr uint32
MxCsr_Mask uint32
FloatRegisters [8]M128A
XmmRegisters [16]M128A
Reserved4 [96]byte
}
type XSAVE_AREA_HEADER struct {
Mask uint64
CompactionMask uint64
Reserved2 [6]uint64
}
type XSAVE_AREA struct {
LegacyState XSAVE_FORMAT
Header XSAVE_AREA_HEADER
}type
M128A = record
Low: UInt64;
High: Int64;
end;
XSAVE_FORMAT = record
ControlWord: Word;
StatusWord: Word;
TagWord: Byte;
Reserved1: Byte;
ErrorOpcode: Word;
ErrorOffset: DWORD;
ErrorSelector: Word;
Reserved2: Word;
DataOffset: DWORD;
DataSelector: Word;
Reserved3: Word;
MxCsr: DWORD;
MxCsr_Mask: DWORD;
FloatRegisters: array[0..7] of M128A;
XmmRegisters: array[0..15] of M128A;
Reserved4: array[0..95] of Byte;
end;
XSAVE_AREA_HEADER = record
Mask: UInt64;
CompactionMask: UInt64;
Reserved2: array[0..5] of UInt64;
end;
XSAVE_AREA = record
LegacyState: XSAVE_FORMAT;
Header: XSAVE_AREA_HEADER;
end;const M128A = extern struct {
Low: u64,
High: i64,
};
const XSAVE_FORMAT = extern struct {
ControlWord: u16,
StatusWord: u16,
TagWord: u8,
Reserved1: u8,
ErrorOpcode: u16,
ErrorOffset: u32,
ErrorSelector: u16,
Reserved2: u16,
DataOffset: u32,
DataSelector: u16,
Reserved3: u16,
MxCsr: u32,
MxCsr_Mask: u32,
FloatRegisters: [8]M128A,
XmmRegisters: [16]M128A,
Reserved4: [96]u8,
};
const XSAVE_AREA_HEADER = extern struct {
Mask: u64,
CompactionMask: u64,
Reserved2: [6]u64,
};
const XSAVE_AREA = extern struct {
LegacyState: XSAVE_FORMAT,
Header: XSAVE_AREA_HEADER,
};type
M128A {.bycopy.} = object
Low: uint64
High: int64
XSAVE_FORMAT {.bycopy.} = object
ControlWord: uint16
StatusWord: uint16
TagWord: uint8
Reserved1: uint8
ErrorOpcode: uint16
ErrorOffset: uint32
ErrorSelector: uint16
Reserved2: uint16
DataOffset: uint32
DataSelector: uint16
Reserved3: uint16
MxCsr: uint32
MxCsr_Mask: uint32
FloatRegisters: array[8, M128A]
XmmRegisters: array[16, M128A]
Reserved4: array[96, uint8]
XSAVE_AREA_HEADER {.bycopy.} = object
Mask: uint64
CompactionMask: uint64
Reserved2: array[6, uint64]
XSAVE_AREA {.bycopy.} = object
LegacyState: XSAVE_FORMAT
Header: XSAVE_AREA_HEADERstruct M128A
{
ulong Low;
long High;
}
struct XSAVE_FORMAT
{
ushort ControlWord;
ushort StatusWord;
ubyte TagWord;
ubyte Reserved1;
ushort ErrorOpcode;
uint ErrorOffset;
ushort ErrorSelector;
ushort Reserved2;
uint DataOffset;
ushort DataSelector;
ushort Reserved3;
uint MxCsr;
uint MxCsr_Mask;
M128A[8] FloatRegisters;
M128A[16] XmmRegisters;
ubyte[96] Reserved4;
}
struct XSAVE_AREA_HEADER
{
ulong Mask;
ulong CompactionMask;
ulong[6] Reserved2;
}
struct XSAVE_AREA
{
XSAVE_FORMAT LegacyState;
XSAVE_AREA_HEADER Header;
}HSP用 定義
HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; XSAVE_AREA サイズ: 576 バイト(x64)
dim st, 144 ; 4byte整数×144(構造体サイズ 576 / 4 切り上げ)
; LegacyState : XSAVE_FORMAT (+0, 512byte) varptr(st)+0 を基点に操作(512byte:入れ子/配列)
; Header : XSAVE_AREA_HEADER (+512, 64byte) varptr(st)+512 を基点に操作(64byte:入れ子/配列)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
; ※GUID・入れ子構造体はデフォルト型でないため、依存する #defstruct を先に定義(下記に同梱)。
#defstruct global M128A
#field int64 Low
#field int64 High
#endstruct
#defstruct global XSAVE_FORMAT
#field short ControlWord
#field short StatusWord
#field byte TagWord
#field byte Reserved1
#field short ErrorOpcode
#field int ErrorOffset
#field short ErrorSelector
#field short Reserved2
#field int DataOffset
#field short DataSelector
#field short Reserved3
#field int MxCsr
#field int MxCsr_Mask
#field M128A FloatRegisters 8
#field M128A XmmRegisters 16
#field byte Reserved4 96
#endstruct
#defstruct global XSAVE_AREA_HEADER
#field int64 Mask
#field int64 CompactionMask
#field int64 Reserved2 6
#endstruct
#defstruct global XSAVE_AREA
#field XSAVE_FORMAT LegacyState
#field XSAVE_AREA_HEADER Header
#endstruct
stdim st, XSAVE_AREA ; NSTRUCT 変数を確保