ホーム › System.Diagnostics.Debug › WHEA_XPF_CMC_DESCRIPTOR
WHEA_XPF_CMC_DESCRIPTOR
構造体サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。
フィールド
| フィールド | 型 | サイズ | x64 | x86 | 説明 |
|---|---|---|---|---|---|
| Type | WORD | 2 | +0 | +0 | エラーソースの種別を示す。 |
| Enabled | BOOLEAN | 1 | +2 | +2 | 訂正済みマシンチェック(CMC)処理が有効かを示すフラグ。 |
| NumberOfBanks | BYTE | 1 | +3 | +3 | マシンチェックバンクの数を示す。 |
| Reserved | DWORD | 4 | +4 | +4 | 予約フィールド。使用しない。 |
| Notify | WHEA_NOTIFICATION_DESCRIPTOR | 16/8 | +8 | +8 | CMC の通知方法を示す記述子(WHEA_NOTIFICATION_DESCRIPTOR)。 |
| Banks | WHEA_XPF_MC_BANK_DESCRIPTOR | 896 | +24 | +16 | WHEA_XPF_MC_BANK_DESCRIPTOR 配列の先頭。各バンクの設定を保持する。 |
各言語での定義
#include <windows.h>
// WHEA_NOTIFICATION_FLAGS (x64 2 / x86 2 バイト)
#pragma pack(push, 1)
typedef struct WHEA_NOTIFICATION_FLAGS {
_Anonymous_e__Struct Anonymous;
WORD AsUSHORT;
} WHEA_NOTIFICATION_FLAGS;
#pragma pack(pop)
// WHEA_NOTIFICATION_DESCRIPTOR (x64 16 / x86 8 バイト)
typedef struct WHEA_NOTIFICATION_DESCRIPTOR {
BYTE Type;
BYTE Length;
WHEA_NOTIFICATION_FLAGS Flags;
_u_e__Union u;
} WHEA_NOTIFICATION_DESCRIPTOR;
// 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)
// WHEA_XPF_CMC_DESCRIPTOR (x64 920 / x86 912 バイト)
#pragma pack(push, 1)
typedef struct WHEA_XPF_CMC_DESCRIPTOR {
WORD Type;
BOOLEAN Enabled;
BYTE NumberOfBanks;
DWORD Reserved;
WHEA_NOTIFICATION_DESCRIPTOR Notify;
WHEA_XPF_MC_BANK_DESCRIPTOR Banks[32];
} WHEA_XPF_CMC_DESCRIPTOR;
#pragma pack(pop)using System;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Unicode)]
public struct WHEA_NOTIFICATION_FLAGS
{
public _Anonymous_e__Struct Anonymous;
public ushort AsUSHORT;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct WHEA_NOTIFICATION_DESCRIPTOR
{
public byte Type;
public byte Length;
public WHEA_NOTIFICATION_FLAGS Flags;
public _u_e__Union u;
}
[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;
}
[StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Unicode)]
public struct WHEA_XPF_CMC_DESCRIPTOR
{
public ushort Type;
[MarshalAs(UnmanagedType.U1)] public bool Enabled;
public byte NumberOfBanks;
public uint Reserved;
public WHEA_NOTIFICATION_DESCRIPTOR Notify;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)] public WHEA_XPF_MC_BANK_DESCRIPTOR[] Banks;
}Imports System.Runtime.InteropServices
<StructLayout(LayoutKind.Sequential, Pack:=1, CharSet:=CharSet.Unicode)>
Public Structure WHEA_NOTIFICATION_FLAGS
Public Anonymous As _Anonymous_e__Struct
Public AsUSHORT As UShort
End Structure
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure WHEA_NOTIFICATION_DESCRIPTOR
Public Type As Byte
Public Length As Byte
Public Flags As WHEA_NOTIFICATION_FLAGS
Public u As _u_e__Union
End Structure
<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
<StructLayout(LayoutKind.Sequential, Pack:=1, CharSet:=CharSet.Unicode)>
Public Structure WHEA_XPF_CMC_DESCRIPTOR
Public Type As UShort
<MarshalAs(UnmanagedType.U1)> Public Enabled As Boolean
Public NumberOfBanks As Byte
Public Reserved As UInteger
Public Notify As WHEA_NOTIFICATION_DESCRIPTOR
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=32)> Public Banks() As WHEA_XPF_MC_BANK_DESCRIPTOR
End Structureimport ctypes
from ctypes import wintypes
class WHEA_NOTIFICATION_FLAGS(ctypes.Structure):
_pack_ = 1
_fields_ = [
("Anonymous", _Anonymous_e__Struct),
("AsUSHORT", ctypes.c_ushort),
]
class WHEA_NOTIFICATION_DESCRIPTOR(ctypes.Structure):
_fields_ = [
("Type", ctypes.c_ubyte),
("Length", ctypes.c_ubyte),
("Flags", WHEA_NOTIFICATION_FLAGS),
("u", _u_e__Union),
]
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),
]
class WHEA_XPF_CMC_DESCRIPTOR(ctypes.Structure):
_pack_ = 1
_fields_ = [
("Type", ctypes.c_ushort),
("Enabled", ctypes.c_byte),
("NumberOfBanks", ctypes.c_ubyte),
("Reserved", wintypes.DWORD),
("Notify", WHEA_NOTIFICATION_DESCRIPTOR),
("Banks", WHEA_XPF_MC_BANK_DESCRIPTOR * 32),
]#[repr(C, packed(1))]
pub struct WHEA_NOTIFICATION_FLAGS {
pub Anonymous: _Anonymous_e__Struct,
pub AsUSHORT: u16,
}
#[repr(C)]
pub struct WHEA_NOTIFICATION_DESCRIPTOR {
pub Type: u8,
pub Length: u8,
pub Flags: WHEA_NOTIFICATION_FLAGS,
pub u: _u_e__Union,
}
#[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,
}
#[repr(C, packed(1))]
pub struct WHEA_XPF_CMC_DESCRIPTOR {
pub Type: u16,
pub Enabled: u8,
pub NumberOfBanks: u8,
pub Reserved: u32,
pub Notify: WHEA_NOTIFICATION_DESCRIPTOR,
pub Banks: [WHEA_XPF_MC_BANK_DESCRIPTOR; 32],
}import "golang.org/x/sys/windows"
type WHEA_NOTIFICATION_FLAGS struct {
Anonymous _Anonymous_e__Struct
AsUSHORT uint16
}
type WHEA_NOTIFICATION_DESCRIPTOR struct {
Type byte
Length byte
Flags WHEA_NOTIFICATION_FLAGS
u _u_e__Union
}
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 WHEA_XPF_CMC_DESCRIPTOR struct {
Type uint16
Enabled byte
NumberOfBanks byte
Reserved uint32
Notify WHEA_NOTIFICATION_DESCRIPTOR
Banks [32]WHEA_XPF_MC_BANK_DESCRIPTOR
}type
WHEA_NOTIFICATION_FLAGS = packed record
Anonymous: _Anonymous_e__Struct;
AsUSHORT: Word;
end;
WHEA_NOTIFICATION_DESCRIPTOR = record
Type: Byte;
Length: Byte;
Flags: WHEA_NOTIFICATION_FLAGS;
u: _u_e__Union;
end;
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;
WHEA_XPF_CMC_DESCRIPTOR = packed record
Type: Word;
Enabled: ByteBool;
NumberOfBanks: Byte;
Reserved: DWORD;
Notify: WHEA_NOTIFICATION_DESCRIPTOR;
Banks: array[0..31] of WHEA_XPF_MC_BANK_DESCRIPTOR;
end;const WHEA_NOTIFICATION_FLAGS = extern struct {
Anonymous: _Anonymous_e__Struct,
AsUSHORT: u16,
};
const WHEA_NOTIFICATION_DESCRIPTOR = extern struct {
Type: u8,
Length: u8,
Flags: WHEA_NOTIFICATION_FLAGS,
u: _u_e__Union,
};
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,
};
const WHEA_XPF_CMC_DESCRIPTOR = extern struct {
Type: u16,
Enabled: u8,
NumberOfBanks: u8,
Reserved: u32,
Notify: WHEA_NOTIFICATION_DESCRIPTOR,
Banks: [32]WHEA_XPF_MC_BANK_DESCRIPTOR,
};type
WHEA_NOTIFICATION_FLAGS {.packed.} = object
Anonymous: _Anonymous_e__Struct
AsUSHORT: uint16
WHEA_NOTIFICATION_DESCRIPTOR {.bycopy.} = object
Type: uint8
Length: uint8
Flags: WHEA_NOTIFICATION_FLAGS
u: _u_e__Union
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
WHEA_XPF_CMC_DESCRIPTOR {.packed.} = object
Type: uint16
Enabled: uint8
NumberOfBanks: uint8
Reserved: uint32
Notify: WHEA_NOTIFICATION_DESCRIPTOR
Banks: array[32, WHEA_XPF_MC_BANK_DESCRIPTOR]align(1)
struct WHEA_NOTIFICATION_FLAGS
{
_Anonymous_e__Struct Anonymous;
ushort AsUSHORT;
}
struct WHEA_NOTIFICATION_DESCRIPTOR
{
ubyte Type;
ubyte Length;
WHEA_NOTIFICATION_FLAGS Flags;
_u_e__Union u;
}
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;
}
align(1)
struct WHEA_XPF_CMC_DESCRIPTOR
{
ushort Type;
ubyte Enabled;
ubyte NumberOfBanks;
uint Reserved;
WHEA_NOTIFICATION_DESCRIPTOR Notify;
WHEA_XPF_MC_BANK_DESCRIPTOR[32] Banks;
}HSP用 定義
HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; WHEA_XPF_CMC_DESCRIPTOR サイズ: 912 バイト(x86)
dim st, 228 ; 4byte整数×228(構造体サイズ 912 / 4 切り上げ)
; Type : WORD (+0, 2byte) wpoke st,0,値 / 値 = wpeek(st,0)
; Enabled : BOOLEAN (+2, 1byte) poke st,2,値 / 値 = peek(st,2)
; NumberOfBanks : BYTE (+3, 1byte) poke st,3,値 / 値 = peek(st,3)
; Reserved : DWORD (+4, 4byte) st.1 = 値 / 値 = st.1 (lpoke/lpeek も可)
; Notify : WHEA_NOTIFICATION_DESCRIPTOR (+8, 8byte) varptr(st)+8 を基点に操作(8byte:入れ子/配列)
; Banks : WHEA_XPF_MC_BANK_DESCRIPTOR (+16, 896byte) varptr(st)+16 を基点に操作(896byte:入れ子/配列)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; WHEA_XPF_CMC_DESCRIPTOR サイズ: 920 バイト(x64)
dim st, 230 ; 4byte整数×230(構造体サイズ 920 / 4 切り上げ)
; Type : WORD (+0, 2byte) wpoke st,0,値 / 値 = wpeek(st,0)
; Enabled : BOOLEAN (+2, 1byte) poke st,2,値 / 値 = peek(st,2)
; NumberOfBanks : BYTE (+3, 1byte) poke st,3,値 / 値 = peek(st,3)
; Reserved : DWORD (+4, 4byte) st.1 = 値 / 値 = st.1 (lpoke/lpeek も可)
; Notify : WHEA_NOTIFICATION_DESCRIPTOR (+8, 16byte) varptr(st)+8 を基点に操作(16byte:入れ子/配列)
; Banks : WHEA_XPF_MC_BANK_DESCRIPTOR (+24, 896byte) varptr(st)+24 を基点に操作(896byte:入れ子/配列)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
; ※GUID・入れ子構造体はデフォルト型でないため、依存する #defstruct を先に定義(下記に同梱)。
#defstruct global WHEA_NOTIFICATION_DESCRIPTOR
#field byte Type
#field byte Length
#field byte Flags 2
#field byte u 8
#endstruct
#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
#defstruct global WHEA_XPF_CMC_DESCRIPTOR, pack=1
#field short Type
#field bool1 Enabled
#field byte NumberOfBanks
#field int Reserved
#field WHEA_NOTIFICATION_DESCRIPTOR Notify
#field WHEA_XPF_MC_BANK_DESCRIPTOR Banks 32
#endstruct
stdim st, WHEA_XPF_CMC_DESCRIPTOR ; NSTRUCT 変数を確保
st->Type = 100
mes "Type=" + st->Type