ホーム › System.Diagnostics.Debug › WOW64_FLOATING_SAVE_AREA
WOW64_FLOATING_SAVE_AREA
構造体サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。
フィールド
| フィールド | 型 | サイズ | x64 | x86 | 説明 |
|---|---|---|---|---|---|
| ControlWord | DWORD | 4 | +0 | +0 | x87 FPU制御ワード(WOW64/32ビット)。 |
| StatusWord | DWORD | 4 | +4 | +4 | x87 FPU状態ワード。 |
| TagWord | DWORD | 4 | +8 | +8 | x87 FPUタグワード。 |
| ErrorOffset | DWORD | 4 | +12 | +12 | 最後のFPU命令のオフセット。 |
| ErrorSelector | DWORD | 4 | +16 | +16 | 最後のFPU命令のセレクタ。 |
| DataOffset | DWORD | 4 | +20 | +20 | 最後のFPUデータオペランドのオフセット。 |
| DataSelector | DWORD | 4 | +24 | +24 | 最後のFPUデータオペランドのセレクタ。 |
| RegisterArea | BYTE | 80 | +28 | +28 | x87レジスタ(ST0-ST7)を保存するバイト配列。 |
| Cr0NpxState | DWORD | 4 | +108 | +108 | CR0のNPX(数値演算)状態。 |
各言語での定義
#include <windows.h>
// WOW64_FLOATING_SAVE_AREA (x64 112 / x86 112 バイト)
typedef struct WOW64_FLOATING_SAVE_AREA {
DWORD ControlWord;
DWORD StatusWord;
DWORD TagWord;
DWORD ErrorOffset;
DWORD ErrorSelector;
DWORD DataOffset;
DWORD DataSelector;
BYTE RegisterArea[80];
DWORD Cr0NpxState;
} WOW64_FLOATING_SAVE_AREA;using System;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct WOW64_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;
}Imports System.Runtime.InteropServices
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure WOW64_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 Structureimport ctypes
from ctypes import wintypes
class WOW64_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),
]#[repr(C)]
pub struct WOW64_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,
}import "golang.org/x/sys/windows"
type WOW64_FLOATING_SAVE_AREA struct {
ControlWord uint32
StatusWord uint32
TagWord uint32
ErrorOffset uint32
ErrorSelector uint32
DataOffset uint32
DataSelector uint32
RegisterArea [80]byte
Cr0NpxState uint32
}type
WOW64_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;const WOW64_FLOATING_SAVE_AREA = extern struct {
ControlWord: u32,
StatusWord: u32,
TagWord: u32,
ErrorOffset: u32,
ErrorSelector: u32,
DataOffset: u32,
DataSelector: u32,
RegisterArea: [80]u8,
Cr0NpxState: u32,
};type
WOW64_FLOATING_SAVE_AREA {.bycopy.} = object
ControlWord: uint32
StatusWord: uint32
TagWord: uint32
ErrorOffset: uint32
ErrorSelector: uint32
DataOffset: uint32
DataSelector: uint32
RegisterArea: array[80, uint8]
Cr0NpxState: uint32struct WOW64_FLOATING_SAVE_AREA
{
uint ControlWord;
uint StatusWord;
uint TagWord;
uint ErrorOffset;
uint ErrorSelector;
uint DataOffset;
uint DataSelector;
ubyte[80] RegisterArea;
uint Cr0NpxState;
}HSP用 定義
HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; WOW64_FLOATING_SAVE_AREA サイズ: 112 バイト(x64)
dim st, 28 ; 4byte整数×28(構造体サイズ 112 / 4 切り上げ)
; ControlWord : DWORD (+0, 4byte) st.0 = 値 / 値 = st.0 (lpoke/lpeek も可)
; StatusWord : DWORD (+4, 4byte) st.1 = 値 / 値 = st.1 (lpoke/lpeek も可)
; TagWord : DWORD (+8, 4byte) st.2 = 値 / 値 = st.2 (lpoke/lpeek も可)
; ErrorOffset : DWORD (+12, 4byte) st.3 = 値 / 値 = st.3 (lpoke/lpeek も可)
; ErrorSelector : DWORD (+16, 4byte) st.4 = 値 / 値 = st.4 (lpoke/lpeek も可)
; DataOffset : DWORD (+20, 4byte) st.5 = 値 / 値 = st.5 (lpoke/lpeek も可)
; DataSelector : DWORD (+24, 4byte) st.6 = 値 / 値 = st.6 (lpoke/lpeek も可)
; RegisterArea : BYTE (+28, 80byte) varptr(st)+28 を基点に操作(80byte:入れ子/配列)
; Cr0NpxState : DWORD (+108, 4byte) st.27 = 値 / 値 = st.27 (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global WOW64_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
stdim st, WOW64_FLOATING_SAVE_AREA ; NSTRUCT 変数を確保
st->ControlWord = 100
mes "ControlWord=" + st->ControlWord