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

XSAVE_AREA

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

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

フィールド

フィールドサイズx64x86説明
LegacyStateXSAVE_FORMAT512+0+0レガシーFXSAVE領域(XSAVE_FORMAT)。
HeaderXSAVE_AREA_HEADER64+512+512XSAVE領域ヘッダ(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 Structure
import 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_HEADER
struct 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 変数を確保