ホーム › System.Diagnostics.Debug › WHEA_XPF_MC_BANK_DESCRIPTOR
WHEA_XPF_MC_BANK_DESCRIPTOR
構造体サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。
フィールド
| フィールド | 型 | サイズ | x64 | x86 | 説明 |
|---|---|---|---|---|---|
| BankNumber | BYTE | 1 | +0 | +0 | マシンチェックバンクの番号を示す。 |
| ClearOnInitialization | BOOLEAN | 1 | +1 | +1 | 初期化時にバンクをクリアするかを示すフラグ。 |
| StatusDataFormat | BYTE | 1 | +2 | +2 | ステータスデータの形式を示す。 |
| Flags | XPF_MC_BANK_FLAGS | 1 | +3 | +3 | バンクの属性フラグ(XPF_MC_BANK_FLAGS)を示す。 |
| ControlMsr | DWORD | 4 | +4 | +4 | 制御 MSR のレジスタ番号を示す。 |
| StatusMsr | DWORD | 4 | +8 | +8 | ステータス MSR のレジスタ番号を示す。 |
| AddressMsr | DWORD | 4 | +12 | +12 | アドレス MSR のレジスタ番号を示す。 |
| MiscMsr | DWORD | 4 | +16 | +16 | Misc MSR のレジスタ番号を示す。 |
| ControlData | ULONGLONG | 8 | +20 | +20 | 制御 MSR に設定するデータ値を示す。 |
各言語での定義
#include <windows.h>
// XPF_MC_BANK_FLAGS (x64 1 / x86 1 バイト)
typedef struct XPF_MC_BANK_FLAGS {
_Anonymous_e__Struct Anonymous;
BYTE AsUCHAR;
} XPF_MC_BANK_FLAGS;
// WHEA_XPF_MC_BANK_DESCRIPTOR (x64 28 / x86 28 バイト)
#pragma pack(push, 1)
typedef struct WHEA_XPF_MC_BANK_DESCRIPTOR {
BYTE BankNumber;
BOOLEAN ClearOnInitialization;
BYTE StatusDataFormat;
XPF_MC_BANK_FLAGS Flags;
DWORD ControlMsr;
DWORD StatusMsr;
DWORD AddressMsr;
DWORD MiscMsr;
ULONGLONG ControlData;
} WHEA_XPF_MC_BANK_DESCRIPTOR;
#pragma pack(pop)using System;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct XPF_MC_BANK_FLAGS
{
public _Anonymous_e__Struct Anonymous;
public byte AsUCHAR;
}
[StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Unicode)]
public struct WHEA_XPF_MC_BANK_DESCRIPTOR
{
public byte BankNumber;
[MarshalAs(UnmanagedType.U1)] public bool ClearOnInitialization;
public byte StatusDataFormat;
public XPF_MC_BANK_FLAGS Flags;
public uint ControlMsr;
public uint StatusMsr;
public uint AddressMsr;
public uint MiscMsr;
public ulong ControlData;
}Imports System.Runtime.InteropServices
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure XPF_MC_BANK_FLAGS
Public Anonymous As _Anonymous_e__Struct
Public AsUCHAR As Byte
End Structure
<StructLayout(LayoutKind.Sequential, Pack:=1, CharSet:=CharSet.Unicode)>
Public Structure WHEA_XPF_MC_BANK_DESCRIPTOR
Public BankNumber As Byte
<MarshalAs(UnmanagedType.U1)> Public ClearOnInitialization As Boolean
Public StatusDataFormat As Byte
Public Flags As XPF_MC_BANK_FLAGS
Public ControlMsr As UInteger
Public StatusMsr As UInteger
Public AddressMsr As UInteger
Public MiscMsr As UInteger
Public ControlData As ULong
End Structureimport ctypes
from ctypes import wintypes
class XPF_MC_BANK_FLAGS(ctypes.Structure):
_fields_ = [
("Anonymous", _Anonymous_e__Struct),
("AsUCHAR", ctypes.c_ubyte),
]
class WHEA_XPF_MC_BANK_DESCRIPTOR(ctypes.Structure):
_pack_ = 1
_fields_ = [
("BankNumber", ctypes.c_ubyte),
("ClearOnInitialization", ctypes.c_byte),
("StatusDataFormat", ctypes.c_ubyte),
("Flags", XPF_MC_BANK_FLAGS),
("ControlMsr", wintypes.DWORD),
("StatusMsr", wintypes.DWORD),
("AddressMsr", wintypes.DWORD),
("MiscMsr", wintypes.DWORD),
("ControlData", ctypes.c_ulonglong),
]#[repr(C)]
pub struct XPF_MC_BANK_FLAGS {
pub Anonymous: _Anonymous_e__Struct,
pub AsUCHAR: u8,
}
#[repr(C, packed(1))]
pub struct WHEA_XPF_MC_BANK_DESCRIPTOR {
pub BankNumber: u8,
pub ClearOnInitialization: u8,
pub StatusDataFormat: u8,
pub Flags: XPF_MC_BANK_FLAGS,
pub ControlMsr: u32,
pub StatusMsr: u32,
pub AddressMsr: u32,
pub MiscMsr: u32,
pub ControlData: u64,
}import "golang.org/x/sys/windows"
type XPF_MC_BANK_FLAGS struct {
Anonymous _Anonymous_e__Struct
AsUCHAR byte
}
type WHEA_XPF_MC_BANK_DESCRIPTOR struct {
BankNumber byte
ClearOnInitialization byte
StatusDataFormat byte
Flags XPF_MC_BANK_FLAGS
ControlMsr uint32
StatusMsr uint32
AddressMsr uint32
MiscMsr uint32
ControlData uint64
}type
XPF_MC_BANK_FLAGS = record
Anonymous: _Anonymous_e__Struct;
AsUCHAR: Byte;
end;
WHEA_XPF_MC_BANK_DESCRIPTOR = packed record
BankNumber: Byte;
ClearOnInitialization: ByteBool;
StatusDataFormat: Byte;
Flags: XPF_MC_BANK_FLAGS;
ControlMsr: DWORD;
StatusMsr: DWORD;
AddressMsr: DWORD;
MiscMsr: DWORD;
ControlData: UInt64;
end;const XPF_MC_BANK_FLAGS = extern struct {
Anonymous: _Anonymous_e__Struct,
AsUCHAR: u8,
};
const WHEA_XPF_MC_BANK_DESCRIPTOR = extern struct {
BankNumber: u8,
ClearOnInitialization: u8,
StatusDataFormat: u8,
Flags: XPF_MC_BANK_FLAGS,
ControlMsr: u32,
StatusMsr: u32,
AddressMsr: u32,
MiscMsr: u32,
ControlData: u64,
};type
XPF_MC_BANK_FLAGS {.bycopy.} = object
Anonymous: _Anonymous_e__Struct
AsUCHAR: uint8
WHEA_XPF_MC_BANK_DESCRIPTOR {.packed.} = object
BankNumber: uint8
ClearOnInitialization: uint8
StatusDataFormat: uint8
Flags: XPF_MC_BANK_FLAGS
ControlMsr: uint32
StatusMsr: uint32
AddressMsr: uint32
MiscMsr: uint32
ControlData: uint64struct XPF_MC_BANK_FLAGS
{
_Anonymous_e__Struct Anonymous;
ubyte AsUCHAR;
}
align(1)
struct WHEA_XPF_MC_BANK_DESCRIPTOR
{
ubyte BankNumber;
ubyte ClearOnInitialization;
ubyte StatusDataFormat;
XPF_MC_BANK_FLAGS Flags;
uint ControlMsr;
uint StatusMsr;
uint AddressMsr;
uint MiscMsr;
ulong ControlData;
}HSP用 定義
HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; WHEA_XPF_MC_BANK_DESCRIPTOR サイズ: 28 バイト(x64)
dim st, 7 ; 4byte整数×7(構造体サイズ 28 / 4 切り上げ)
; BankNumber : BYTE (+0, 1byte) poke st,0,値 / 値 = peek(st,0)
; ClearOnInitialization : BOOLEAN (+1, 1byte) poke st,1,値 / 値 = peek(st,1)
; StatusDataFormat : BYTE (+2, 1byte) poke st,2,値 / 値 = peek(st,2)
; Flags : XPF_MC_BANK_FLAGS (+3, 1byte) varptr(st)+3 を基点に操作(1byte:入れ子/配列)
; ControlMsr : DWORD (+4, 4byte) st.1 = 値 / 値 = st.1 (lpoke/lpeek も可)
; StatusMsr : DWORD (+8, 4byte) st.2 = 値 / 値 = st.2 (lpoke/lpeek も可)
; AddressMsr : DWORD (+12, 4byte) st.3 = 値 / 値 = st.3 (lpoke/lpeek も可)
; MiscMsr : DWORD (+16, 4byte) st.4 = 値 / 値 = st.4 (lpoke/lpeek も可)
; ControlData : ULONGLONG (+20, 8byte) qpoke st,20,値 / qpeek(st,20) ※IronHSPのみ。3.7/3.8は lpoke st,20,下位 : lpoke st,24,上位
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global WHEA_XPF_MC_BANK_DESCRIPTOR, pack=1
#field byte BankNumber
#field bool1 ClearOnInitialization
#field byte StatusDataFormat
#field byte Flags 1
#field int ControlMsr
#field int StatusMsr
#field int AddressMsr
#field int MiscMsr
#field int64 ControlData
#endstruct
stdim st, WHEA_XPF_MC_BANK_DESCRIPTOR ; NSTRUCT 変数を確保
st->BankNumber = 100
mes "BankNumber=" + st->BankNumber
; ※union フィールドは byte 列で確保(NSTRUCT は union 非対応)。必要に応じ手動でアクセス。