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

WHEA_DEVICE_DRIVER_DESCRIPTOR

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

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

フィールド

フィールドサイズx64x86説明
TypeWORD2+0+0エラーソースの種別を示す。
EnabledBOOLEAN1+2+2デバイスドライバエラーソースが有効かを示すフラグ。
ReservedBYTE1+3+3予約フィールド。使用しない。
SourceGuidGUID16+4+4エラーソースを一意に識別する GUID を示す。
LogTagWORD2+20+20ログ識別用のタグ値を示す。
Reserved2WORD2+22+22予約フィールド。使用しない。
PacketLengthDWORD4+24+24エラーパケット1個のバイト長を示す。
PacketCountDWORD4+28+28エラーパケットの個数を示す。
PacketBufferBYTE*8/4+32+32エラーパケットを格納するバッファを指すポインタ。
ConfigWHEA_ERROR_SOURCE_CONFIGURATION_DD24/12+40+36ドライバ向けエラーソース構成(WHEA_ERROR_SOURCE_CONFIGURATION_DD)を保持する。
CreatorIdGUID16+64+48エラーレコード作成者を識別する GUID を示す。
PartitionIdGUID16+80+64パーティションを識別する GUID を示す。
MaxSectionDataLengthDWORD4+96+801セクションあたりの最大データ長(バイト)を示す。
MaxSectionsPerRecordDWORD4+100+841レコードあたりの最大セクション数を示す。
PacketStateBufferBYTE*8/4+104+88各パケットの状態を格納するバッファを指すポインタ。
OpenHandlesINT4+112+92現在開かれているハンドル数を示す。

各言語での定義

#include <windows.h>

// WHEA_ERROR_SOURCE_CONFIGURATION_DD  (x64 24 / x86 12 バイト)
#pragma pack(push, 1)
typedef struct WHEA_ERROR_SOURCE_CONFIGURATION_DD {
    WHEA_ERROR_SOURCE_INITIALIZE_DEVICE_DRIVER Initialize;
    WHEA_ERROR_SOURCE_UNINITIALIZE_DEVICE_DRIVER Uninitialize;
    WHEA_ERROR_SOURCE_CORRECT_DEVICE_DRIVER Correct;
} WHEA_ERROR_SOURCE_CONFIGURATION_DD;
#pragma pack(pop)

// WHEA_DEVICE_DRIVER_DESCRIPTOR  (x64 116 / x86 96 バイト)
#pragma pack(push, 1)
typedef struct WHEA_DEVICE_DRIVER_DESCRIPTOR {
    WORD Type;
    BOOLEAN Enabled;
    BYTE Reserved;
    GUID SourceGuid;
    WORD LogTag;
    WORD Reserved2;
    DWORD PacketLength;
    DWORD PacketCount;
    BYTE* PacketBuffer;
    WHEA_ERROR_SOURCE_CONFIGURATION_DD Config;
    GUID CreatorId;
    GUID PartitionId;
    DWORD MaxSectionDataLength;
    DWORD MaxSectionsPerRecord;
    BYTE* PacketStateBuffer;
    INT OpenHandles;
} WHEA_DEVICE_DRIVER_DESCRIPTOR;
#pragma pack(pop)
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Unicode)]
public struct WHEA_ERROR_SOURCE_CONFIGURATION_DD
{
    public IntPtr Initialize;
    public IntPtr Uninitialize;
    public IntPtr Correct;
}

[StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Unicode)]
public struct WHEA_DEVICE_DRIVER_DESCRIPTOR
{
    public ushort Type;
    [MarshalAs(UnmanagedType.U1)] public bool Enabled;
    public byte Reserved;
    public Guid SourceGuid;
    public ushort LogTag;
    public ushort Reserved2;
    public uint PacketLength;
    public uint PacketCount;
    public IntPtr PacketBuffer;
    public WHEA_ERROR_SOURCE_CONFIGURATION_DD Config;
    public Guid CreatorId;
    public Guid PartitionId;
    public uint MaxSectionDataLength;
    public uint MaxSectionsPerRecord;
    public IntPtr PacketStateBuffer;
    public int OpenHandles;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, Pack:=1, CharSet:=CharSet.Unicode)>
Public Structure WHEA_ERROR_SOURCE_CONFIGURATION_DD
    Public Initialize As IntPtr
    Public Uninitialize As IntPtr
    Public Correct As IntPtr
End Structure

<StructLayout(LayoutKind.Sequential, Pack:=1, CharSet:=CharSet.Unicode)>
Public Structure WHEA_DEVICE_DRIVER_DESCRIPTOR
    Public Type As UShort
    <MarshalAs(UnmanagedType.U1)> Public Enabled As Boolean
    Public Reserved As Byte
    Public SourceGuid As Guid
    Public LogTag As UShort
    Public Reserved2 As UShort
    Public PacketLength As UInteger
    Public PacketCount As UInteger
    Public PacketBuffer As IntPtr
    Public Config As WHEA_ERROR_SOURCE_CONFIGURATION_DD
    Public CreatorId As Guid
    Public PartitionId As Guid
    Public MaxSectionDataLength As UInteger
    Public MaxSectionsPerRecord As UInteger
    Public PacketStateBuffer As IntPtr
    Public OpenHandles As Integer
End Structure
import ctypes
from ctypes import wintypes

class WHEA_ERROR_SOURCE_CONFIGURATION_DD(ctypes.Structure):
    _pack_ = 1
    _fields_ = [
        ("Initialize", ctypes.c_void_p),
        ("Uninitialize", ctypes.c_void_p),
        ("Correct", ctypes.c_void_p),
    ]

class WHEA_DEVICE_DRIVER_DESCRIPTOR(ctypes.Structure):
    _pack_ = 1
    _fields_ = [
        ("Type", ctypes.c_ushort),
        ("Enabled", ctypes.c_byte),
        ("Reserved", ctypes.c_ubyte),
        ("SourceGuid", GUID),
        ("LogTag", ctypes.c_ushort),
        ("Reserved2", ctypes.c_ushort),
        ("PacketLength", wintypes.DWORD),
        ("PacketCount", wintypes.DWORD),
        ("PacketBuffer", ctypes.c_void_p),
        ("Config", WHEA_ERROR_SOURCE_CONFIGURATION_DD),
        ("CreatorId", GUID),
        ("PartitionId", GUID),
        ("MaxSectionDataLength", wintypes.DWORD),
        ("MaxSectionsPerRecord", wintypes.DWORD),
        ("PacketStateBuffer", ctypes.c_void_p),
        ("OpenHandles", ctypes.c_int),
    ]
#[repr(C, packed(1))]
pub struct WHEA_ERROR_SOURCE_CONFIGURATION_DD {
    pub Initialize: *mut core::ffi::c_void,
    pub Uninitialize: *mut core::ffi::c_void,
    pub Correct: *mut core::ffi::c_void,
}

#[repr(C, packed(1))]
pub struct WHEA_DEVICE_DRIVER_DESCRIPTOR {
    pub Type: u16,
    pub Enabled: u8,
    pub Reserved: u8,
    pub SourceGuid: GUID,
    pub LogTag: u16,
    pub Reserved2: u16,
    pub PacketLength: u32,
    pub PacketCount: u32,
    pub PacketBuffer: *mut core::ffi::c_void,
    pub Config: WHEA_ERROR_SOURCE_CONFIGURATION_DD,
    pub CreatorId: GUID,
    pub PartitionId: GUID,
    pub MaxSectionDataLength: u32,
    pub MaxSectionsPerRecord: u32,
    pub PacketStateBuffer: *mut core::ffi::c_void,
    pub OpenHandles: i32,
}
import "golang.org/x/sys/windows"

type WHEA_ERROR_SOURCE_CONFIGURATION_DD struct {
	Initialize uintptr
	Uninitialize uintptr
	Correct uintptr
}

type WHEA_DEVICE_DRIVER_DESCRIPTOR struct {
	Type uint16
	Enabled byte
	Reserved byte
	SourceGuid windows.GUID
	LogTag uint16
	Reserved2 uint16
	PacketLength uint32
	PacketCount uint32
	PacketBuffer uintptr
	Config WHEA_ERROR_SOURCE_CONFIGURATION_DD
	CreatorId windows.GUID
	PartitionId windows.GUID
	MaxSectionDataLength uint32
	MaxSectionsPerRecord uint32
	PacketStateBuffer uintptr
	OpenHandles int32
}
type
  WHEA_ERROR_SOURCE_CONFIGURATION_DD = packed record
    Initialize: Pointer;
    Uninitialize: Pointer;
    Correct: Pointer;
  end;

  WHEA_DEVICE_DRIVER_DESCRIPTOR = packed record
    Type: Word;
    Enabled: ByteBool;
    Reserved: Byte;
    SourceGuid: TGUID;
    LogTag: Word;
    Reserved2: Word;
    PacketLength: DWORD;
    PacketCount: DWORD;
    PacketBuffer: Pointer;
    Config: WHEA_ERROR_SOURCE_CONFIGURATION_DD;
    CreatorId: TGUID;
    PartitionId: TGUID;
    MaxSectionDataLength: DWORD;
    MaxSectionsPerRecord: DWORD;
    PacketStateBuffer: Pointer;
    OpenHandles: Integer;
  end;
const WHEA_ERROR_SOURCE_CONFIGURATION_DD = extern struct {
    Initialize: ?*anyopaque,
    Uninitialize: ?*anyopaque,
    Correct: ?*anyopaque,
};

const WHEA_DEVICE_DRIVER_DESCRIPTOR = extern struct {
    Type: u16,
    Enabled: u8,
    Reserved: u8,
    SourceGuid: GUID,
    LogTag: u16,
    Reserved2: u16,
    PacketLength: u32,
    PacketCount: u32,
    PacketBuffer: ?*anyopaque,
    Config: WHEA_ERROR_SOURCE_CONFIGURATION_DD,
    CreatorId: GUID,
    PartitionId: GUID,
    MaxSectionDataLength: u32,
    MaxSectionsPerRecord: u32,
    PacketStateBuffer: ?*anyopaque,
    OpenHandles: i32,
};
type
  WHEA_ERROR_SOURCE_CONFIGURATION_DD {.packed.} = object
    Initialize: pointer
    Uninitialize: pointer
    Correct: pointer

  WHEA_DEVICE_DRIVER_DESCRIPTOR {.packed.} = object
    Type: uint16
    Enabled: uint8
    Reserved: uint8
    SourceGuid: GUID
    LogTag: uint16
    Reserved2: uint16
    PacketLength: uint32
    PacketCount: uint32
    PacketBuffer: pointer
    Config: WHEA_ERROR_SOURCE_CONFIGURATION_DD
    CreatorId: GUID
    PartitionId: GUID
    MaxSectionDataLength: uint32
    MaxSectionsPerRecord: uint32
    PacketStateBuffer: pointer
    OpenHandles: int32
align(1)
struct WHEA_ERROR_SOURCE_CONFIGURATION_DD
{
    void* Initialize;
    void* Uninitialize;
    void* Correct;
}

align(1)
struct WHEA_DEVICE_DRIVER_DESCRIPTOR
{
    ushort Type;
    ubyte Enabled;
    ubyte Reserved;
    GUID SourceGuid;
    ushort LogTag;
    ushort Reserved2;
    uint PacketLength;
    uint PacketCount;
    void* PacketBuffer;
    WHEA_ERROR_SOURCE_CONFIGURATION_DD Config;
    GUID CreatorId;
    GUID PartitionId;
    uint MaxSectionDataLength;
    uint MaxSectionsPerRecord;
    void* PacketStateBuffer;
    int OpenHandles;
}

HSP用 定義

HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; WHEA_DEVICE_DRIVER_DESCRIPTOR サイズ: 96 バイト(x86)
dim st, 24    ; 4byte整数×24(構造体サイズ 96 / 4 切り上げ)
; Type : WORD (+0, 2byte)  wpoke st,0,値  /  値 = wpeek(st,0)
; Enabled : BOOLEAN (+2, 1byte)  poke st,2,値  /  値 = peek(st,2)
; Reserved : BYTE (+3, 1byte)  poke st,3,値  /  値 = peek(st,3)
; SourceGuid : GUID (+4, 16byte)  varptr(st)+4 を基点に操作(16byte:入れ子/配列)
; LogTag : WORD (+20, 2byte)  wpoke st,20,値  /  値 = wpeek(st,20)
; Reserved2 : WORD (+22, 2byte)  wpoke st,22,値  /  値 = wpeek(st,22)
; PacketLength : DWORD (+24, 4byte)  st.6 = 値  /  値 = st.6   (lpoke/lpeek も可)
; PacketCount : DWORD (+28, 4byte)  st.7 = 値  /  値 = st.7   (lpoke/lpeek も可)
; PacketBuffer : BYTE* (+32, 4byte)  st.8 = 値  /  値 = st.8   (lpoke/lpeek も可)
; Config : WHEA_ERROR_SOURCE_CONFIGURATION_DD (+36, 12byte)  varptr(st)+36 を基点に操作(12byte:入れ子/配列)
; CreatorId : GUID (+48, 16byte)  varptr(st)+48 を基点に操作(16byte:入れ子/配列)
; PartitionId : GUID (+64, 16byte)  varptr(st)+64 を基点に操作(16byte:入れ子/配列)
; MaxSectionDataLength : DWORD (+80, 4byte)  st.20 = 値  /  値 = st.20   (lpoke/lpeek も可)
; MaxSectionsPerRecord : DWORD (+84, 4byte)  st.21 = 値  /  値 = st.21   (lpoke/lpeek も可)
; PacketStateBuffer : BYTE* (+88, 4byte)  st.22 = 値  /  値 = st.22   (lpoke/lpeek も可)
; OpenHandles : INT (+92, 4byte)  st.23 = 値  /  値 = st.23   (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; WHEA_DEVICE_DRIVER_DESCRIPTOR サイズ: 116 バイト(x64)
dim st, 29    ; 4byte整数×29(構造体サイズ 116 / 4 切り上げ)
; Type : WORD (+0, 2byte)  wpoke st,0,値  /  値 = wpeek(st,0)
; Enabled : BOOLEAN (+2, 1byte)  poke st,2,値  /  値 = peek(st,2)
; Reserved : BYTE (+3, 1byte)  poke st,3,値  /  値 = peek(st,3)
; SourceGuid : GUID (+4, 16byte)  varptr(st)+4 を基点に操作(16byte:入れ子/配列)
; LogTag : WORD (+20, 2byte)  wpoke st,20,値  /  値 = wpeek(st,20)
; Reserved2 : WORD (+22, 2byte)  wpoke st,22,値  /  値 = wpeek(st,22)
; PacketLength : DWORD (+24, 4byte)  st.6 = 値  /  値 = st.6   (lpoke/lpeek も可)
; PacketCount : DWORD (+28, 4byte)  st.7 = 値  /  値 = st.7   (lpoke/lpeek も可)
; PacketBuffer : BYTE* (+32, 8byte)  qpoke st,32,値 / qpeek(st,32)  ※IronHSPのみ。3.7/3.8は lpoke st,32,下位 : lpoke st,36,上位
; Config : WHEA_ERROR_SOURCE_CONFIGURATION_DD (+40, 24byte)  varptr(st)+40 を基点に操作(24byte:入れ子/配列)
; CreatorId : GUID (+64, 16byte)  varptr(st)+64 を基点に操作(16byte:入れ子/配列)
; PartitionId : GUID (+80, 16byte)  varptr(st)+80 を基点に操作(16byte:入れ子/配列)
; MaxSectionDataLength : DWORD (+96, 4byte)  st.24 = 値  /  値 = st.24   (lpoke/lpeek も可)
; MaxSectionsPerRecord : DWORD (+100, 4byte)  st.25 = 値  /  値 = st.25   (lpoke/lpeek も可)
; PacketStateBuffer : BYTE* (+104, 8byte)  qpoke st,104,値 / qpeek(st,104)  ※IronHSPのみ。3.7/3.8は lpoke st,104,下位 : lpoke st,108,上位
; OpenHandles : INT (+112, 4byte)  st.28 = 値  /  値 = st.28   (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
; ※GUID・入れ子構造体はデフォルト型でないため、依存する #defstruct を先に定義(下記に同梱)。
#defstruct global GUID, pack=1
    #field int Data1
    #field short Data2
    #field short Data3
    #field byte Data4 8
#endstruct

#defstruct global WHEA_ERROR_SOURCE_CONFIGURATION_DD, pack=1
    #field intptr Initialize
    #field intptr Uninitialize
    #field intptr Correct
#endstruct

#defstruct global WHEA_DEVICE_DRIVER_DESCRIPTOR, pack=1
    #field short Type
    #field bool1 Enabled
    #field byte Reserved
    #field GUID SourceGuid
    #field short LogTag
    #field short Reserved2
    #field int PacketLength
    #field int PacketCount
    #field intptr PacketBuffer
    #field WHEA_ERROR_SOURCE_CONFIGURATION_DD Config
    #field GUID CreatorId
    #field GUID PartitionId
    #field int MaxSectionDataLength
    #field int MaxSectionsPerRecord
    #field intptr PacketStateBuffer
    #field int OpenHandles
#endstruct

stdim st, WHEA_DEVICE_DRIVER_DESCRIPTOR        ; NSTRUCT 変数を確保
st->Type = 100
mes "Type=" + st->Type