ホーム › System.Diagnostics.Debug › WHEA_DEVICE_DRIVER_DESCRIPTOR
WHEA_DEVICE_DRIVER_DESCRIPTOR
構造体サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。
フィールド
| フィールド | 型 | サイズ | x64 | x86 | 説明 |
|---|---|---|---|---|---|
| Type | WORD | 2 | +0 | +0 | エラーソースの種別を示す。 |
| Enabled | BOOLEAN | 1 | +2 | +2 | デバイスドライバエラーソースが有効かを示すフラグ。 |
| Reserved | BYTE | 1 | +3 | +3 | 予約フィールド。使用しない。 |
| SourceGuid | GUID | 16 | +4 | +4 | エラーソースを一意に識別する GUID を示す。 |
| LogTag | WORD | 2 | +20 | +20 | ログ識別用のタグ値を示す。 |
| Reserved2 | WORD | 2 | +22 | +22 | 予約フィールド。使用しない。 |
| PacketLength | DWORD | 4 | +24 | +24 | エラーパケット1個のバイト長を示す。 |
| PacketCount | DWORD | 4 | +28 | +28 | エラーパケットの個数を示す。 |
| PacketBuffer | BYTE* | 8/4 | +32 | +32 | エラーパケットを格納するバッファを指すポインタ。 |
| Config | WHEA_ERROR_SOURCE_CONFIGURATION_DD | 24/12 | +40 | +36 | ドライバ向けエラーソース構成(WHEA_ERROR_SOURCE_CONFIGURATION_DD)を保持する。 |
| CreatorId | GUID | 16 | +64 | +48 | エラーレコード作成者を識別する GUID を示す。 |
| PartitionId | GUID | 16 | +80 | +64 | パーティションを識別する GUID を示す。 |
| MaxSectionDataLength | DWORD | 4 | +96 | +80 | 1セクションあたりの最大データ長(バイト)を示す。 |
| MaxSectionsPerRecord | DWORD | 4 | +100 | +84 | 1レコードあたりの最大セクション数を示す。 |
| PacketStateBuffer | BYTE* | 8/4 | +104 | +88 | 各パケットの状態を格納するバッファを指すポインタ。 |
| OpenHandles | INT | 4 | +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 Structureimport 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: int32align(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