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

WHEA_XPF_MC_BANK_DESCRIPTOR

構造体
サイズx64: 28 バイト / x86: 28 バイトパッキング1

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

フィールド

フィールドサイズx64x86説明
BankNumberBYTE1+0+0マシンチェックバンクの番号を示す。
ClearOnInitializationBOOLEAN1+1+1初期化時にバンクをクリアするかを示すフラグ。
StatusDataFormatBYTE1+2+2ステータスデータの形式を示す。
FlagsXPF_MC_BANK_FLAGS1+3+3バンクの属性フラグ(XPF_MC_BANK_FLAGS)を示す。
ControlMsrDWORD4+4+4制御 MSR のレジスタ番号を示す。
StatusMsrDWORD4+8+8ステータス MSR のレジスタ番号を示す。
AddressMsrDWORD4+12+12アドレス MSR のレジスタ番号を示す。
MiscMsrDWORD4+16+16Misc MSR のレジスタ番号を示す。
ControlDataULONGLONG8+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 Structure
import 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: uint64
struct 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 非対応)。必要に応じ手動でアクセス。