Win32 API 日本語リファレンス
ホームSecurity.DiagnosticDataQuery › DIAGNOSTIC_DATA_RECORD

DIAGNOSTIC_DATA_RECORD

構造体
サイズx64: 104 バイト / x86: 72 バイト

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

フィールド

フィールドサイズx64x86説明
rowIdLONGLONG8+0+0診断データレコードを一意に識別する行ID。
timestampULONGLONG8+8+8イベント発生時刻。Windowsファイル時刻形式の符号なし64ビット値。
eventKeywordsULONGLONG8+16+16イベントの分類を示すキーワードビットマスク。
fullEventNameLPWSTR8/4+24+24イベントの完全修飾名文字列。
providerGroupGuidLPWSTR8/4+32+28イベントプロバイダグループを識別するGUID文字列。
producerNameLPWSTR8/4+40+32イベントを生成したプロデューサー名文字列。
privacyTagsINT*8/4+48+36イベントに付与されたプライバシータグID配列へのポインタ。
privacyTagCountDWORD4+56+40privacyTags配列の要素数。
categoryIdsINT*8/4+64+44イベントが属するカテゴリID配列へのポインタ。
categoryIdCountDWORD4+72+48categoryIds配列の要素数。
isCoreDataBOOL4+76+52コア(基本)データかどうかを示す真偽値。
extra1LPWSTR8/4+80+56拡張用予備文字列フィールド1。NULL可。
extra2LPWSTR8/4+88+60拡張用予備文字列フィールド2。NULL可。
extra3LPWSTR8/4+96+64拡張用予備文字列フィールド3。NULL可。

各言語での定義

#include <windows.h>

// DIAGNOSTIC_DATA_RECORD  (x64 104 / x86 72 バイト)
typedef struct DIAGNOSTIC_DATA_RECORD {
    LONGLONG rowId;
    ULONGLONG timestamp;
    ULONGLONG eventKeywords;
    LPWSTR fullEventName;
    LPWSTR providerGroupGuid;
    LPWSTR producerName;
    INT* privacyTags;
    DWORD privacyTagCount;
    INT* categoryIds;
    DWORD categoryIdCount;
    BOOL isCoreData;
    LPWSTR extra1;
    LPWSTR extra2;
    LPWSTR extra3;
} DIAGNOSTIC_DATA_RECORD;
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct DIAGNOSTIC_DATA_RECORD
{
    public long rowId;
    public ulong timestamp;
    public ulong eventKeywords;
    public IntPtr fullEventName;
    public IntPtr providerGroupGuid;
    public IntPtr producerName;
    public IntPtr privacyTags;
    public uint privacyTagCount;
    public IntPtr categoryIds;
    public uint categoryIdCount;
    [MarshalAs(UnmanagedType.Bool)] public bool isCoreData;
    public IntPtr extra1;
    public IntPtr extra2;
    public IntPtr extra3;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure DIAGNOSTIC_DATA_RECORD
    Public rowId As Long
    Public timestamp As ULong
    Public eventKeywords As ULong
    Public fullEventName As IntPtr
    Public providerGroupGuid As IntPtr
    Public producerName As IntPtr
    Public privacyTags As IntPtr
    Public privacyTagCount As UInteger
    Public categoryIds As IntPtr
    Public categoryIdCount As UInteger
    <MarshalAs(UnmanagedType.Bool)> Public isCoreData As Boolean
    Public extra1 As IntPtr
    Public extra2 As IntPtr
    Public extra3 As IntPtr
End Structure
import ctypes
from ctypes import wintypes

class DIAGNOSTIC_DATA_RECORD(ctypes.Structure):
    _fields_ = [
        ("rowId", ctypes.c_longlong),
        ("timestamp", ctypes.c_ulonglong),
        ("eventKeywords", ctypes.c_ulonglong),
        ("fullEventName", ctypes.c_void_p),
        ("providerGroupGuid", ctypes.c_void_p),
        ("producerName", ctypes.c_void_p),
        ("privacyTags", ctypes.c_void_p),
        ("privacyTagCount", wintypes.DWORD),
        ("categoryIds", ctypes.c_void_p),
        ("categoryIdCount", wintypes.DWORD),
        ("isCoreData", wintypes.BOOL),
        ("extra1", ctypes.c_void_p),
        ("extra2", ctypes.c_void_p),
        ("extra3", ctypes.c_void_p),
    ]
#[repr(C)]
pub struct DIAGNOSTIC_DATA_RECORD {
    pub rowId: i64,
    pub timestamp: u64,
    pub eventKeywords: u64,
    pub fullEventName: *mut core::ffi::c_void,
    pub providerGroupGuid: *mut core::ffi::c_void,
    pub producerName: *mut core::ffi::c_void,
    pub privacyTags: *mut core::ffi::c_void,
    pub privacyTagCount: u32,
    pub categoryIds: *mut core::ffi::c_void,
    pub categoryIdCount: u32,
    pub isCoreData: i32,
    pub extra1: *mut core::ffi::c_void,
    pub extra2: *mut core::ffi::c_void,
    pub extra3: *mut core::ffi::c_void,
}
import "golang.org/x/sys/windows"

type DIAGNOSTIC_DATA_RECORD struct {
	rowId int64
	timestamp uint64
	eventKeywords uint64
	fullEventName uintptr
	providerGroupGuid uintptr
	producerName uintptr
	privacyTags uintptr
	privacyTagCount uint32
	categoryIds uintptr
	categoryIdCount uint32
	isCoreData int32
	extra1 uintptr
	extra2 uintptr
	extra3 uintptr
}
type
  DIAGNOSTIC_DATA_RECORD = record
    rowId: Int64;
    timestamp: UInt64;
    eventKeywords: UInt64;
    fullEventName: Pointer;
    providerGroupGuid: Pointer;
    producerName: Pointer;
    privacyTags: Pointer;
    privacyTagCount: DWORD;
    categoryIds: Pointer;
    categoryIdCount: DWORD;
    isCoreData: BOOL;
    extra1: Pointer;
    extra2: Pointer;
    extra3: Pointer;
  end;
const DIAGNOSTIC_DATA_RECORD = extern struct {
    rowId: i64,
    timestamp: u64,
    eventKeywords: u64,
    fullEventName: ?*anyopaque,
    providerGroupGuid: ?*anyopaque,
    producerName: ?*anyopaque,
    privacyTags: ?*anyopaque,
    privacyTagCount: u32,
    categoryIds: ?*anyopaque,
    categoryIdCount: u32,
    isCoreData: i32,
    extra1: ?*anyopaque,
    extra2: ?*anyopaque,
    extra3: ?*anyopaque,
};
type
  DIAGNOSTIC_DATA_RECORD {.bycopy.} = object
    rowId: int64
    timestamp: uint64
    eventKeywords: uint64
    fullEventName: pointer
    providerGroupGuid: pointer
    producerName: pointer
    privacyTags: pointer
    privacyTagCount: uint32
    categoryIds: pointer
    categoryIdCount: uint32
    isCoreData: int32
    extra1: pointer
    extra2: pointer
    extra3: pointer
struct DIAGNOSTIC_DATA_RECORD
{
    long rowId;
    ulong timestamp;
    ulong eventKeywords;
    void* fullEventName;
    void* providerGroupGuid;
    void* producerName;
    void* privacyTags;
    uint privacyTagCount;
    void* categoryIds;
    uint categoryIdCount;
    int isCoreData;
    void* extra1;
    void* extra2;
    void* extra3;
}

HSP用 定義

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

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; DIAGNOSTIC_DATA_RECORD サイズ: 72 バイト(x86)
dim st, 18    ; 4byte整数×18(構造体サイズ 72 / 4 切り上げ)
; rowId : LONGLONG (+0, 8byte)  qpoke st,0,値 / qpeek(st,0)  ※IronHSPのみ。3.7/3.8は lpoke st,0,下位 : lpoke st,4,上位
; timestamp : ULONGLONG (+8, 8byte)  qpoke st,8,値 / qpeek(st,8)  ※IronHSPのみ。3.7/3.8は lpoke st,8,下位 : lpoke st,12,上位
; eventKeywords : ULONGLONG (+16, 8byte)  qpoke st,16,値 / qpeek(st,16)  ※IronHSPのみ。3.7/3.8は lpoke st,16,下位 : lpoke st,20,上位
; fullEventName : LPWSTR (+24, 4byte)  st.6 = 値  /  値 = st.6   (lpoke/lpeek も可)
; providerGroupGuid : LPWSTR (+28, 4byte)  st.7 = 値  /  値 = st.7   (lpoke/lpeek も可)
; producerName : LPWSTR (+32, 4byte)  st.8 = 値  /  値 = st.8   (lpoke/lpeek も可)
; privacyTags : INT* (+36, 4byte)  st.9 = 値  /  値 = st.9   (lpoke/lpeek も可)
; privacyTagCount : DWORD (+40, 4byte)  st.10 = 値  /  値 = st.10   (lpoke/lpeek も可)
; categoryIds : INT* (+44, 4byte)  st.11 = 値  /  値 = st.11   (lpoke/lpeek も可)
; categoryIdCount : DWORD (+48, 4byte)  st.12 = 値  /  値 = st.12   (lpoke/lpeek も可)
; isCoreData : BOOL (+52, 4byte)  st.13 = 値  /  値 = st.13   (lpoke/lpeek も可)
; extra1 : LPWSTR (+56, 4byte)  st.14 = 値  /  値 = st.14   (lpoke/lpeek も可)
; extra2 : LPWSTR (+60, 4byte)  st.15 = 値  /  値 = st.15   (lpoke/lpeek も可)
; extra3 : LPWSTR (+64, 4byte)  st.16 = 値  /  値 = st.16   (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; DIAGNOSTIC_DATA_RECORD サイズ: 104 バイト(x64)
dim st, 26    ; 4byte整数×26(構造体サイズ 104 / 4 切り上げ)
; rowId : LONGLONG (+0, 8byte)  qpoke st,0,値 / qpeek(st,0)  ※IronHSPのみ。3.7/3.8は lpoke st,0,下位 : lpoke st,4,上位
; timestamp : ULONGLONG (+8, 8byte)  qpoke st,8,値 / qpeek(st,8)  ※IronHSPのみ。3.7/3.8は lpoke st,8,下位 : lpoke st,12,上位
; eventKeywords : ULONGLONG (+16, 8byte)  qpoke st,16,値 / qpeek(st,16)  ※IronHSPのみ。3.7/3.8は lpoke st,16,下位 : lpoke st,20,上位
; fullEventName : LPWSTR (+24, 8byte)  qpoke st,24,値 / qpeek(st,24)  ※IronHSPのみ。3.7/3.8は lpoke st,24,下位 : lpoke st,28,上位
; providerGroupGuid : LPWSTR (+32, 8byte)  qpoke st,32,値 / qpeek(st,32)  ※IronHSPのみ。3.7/3.8は lpoke st,32,下位 : lpoke st,36,上位
; producerName : LPWSTR (+40, 8byte)  qpoke st,40,値 / qpeek(st,40)  ※IronHSPのみ。3.7/3.8は lpoke st,40,下位 : lpoke st,44,上位
; privacyTags : INT* (+48, 8byte)  qpoke st,48,値 / qpeek(st,48)  ※IronHSPのみ。3.7/3.8は lpoke st,48,下位 : lpoke st,52,上位
; privacyTagCount : DWORD (+56, 4byte)  st.14 = 値  /  値 = st.14   (lpoke/lpeek も可)
; categoryIds : INT* (+64, 8byte)  qpoke st,64,値 / qpeek(st,64)  ※IronHSPのみ。3.7/3.8は lpoke st,64,下位 : lpoke st,68,上位
; categoryIdCount : DWORD (+72, 4byte)  st.18 = 値  /  値 = st.18   (lpoke/lpeek も可)
; isCoreData : BOOL (+76, 4byte)  st.19 = 値  /  値 = st.19   (lpoke/lpeek も可)
; extra1 : LPWSTR (+80, 8byte)  qpoke st,80,値 / qpeek(st,80)  ※IronHSPのみ。3.7/3.8は lpoke st,80,下位 : lpoke st,84,上位
; extra2 : LPWSTR (+88, 8byte)  qpoke st,88,値 / qpeek(st,88)  ※IronHSPのみ。3.7/3.8は lpoke st,88,下位 : lpoke st,92,上位
; extra3 : LPWSTR (+96, 8byte)  qpoke st,96,値 / qpeek(st,96)  ※IronHSPのみ。3.7/3.8は lpoke st,96,下位 : lpoke st,100,上位
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global DIAGNOSTIC_DATA_RECORD
    #field int64 rowId
    #field int64 timestamp
    #field int64 eventKeywords
    #field intptr fullEventName
    #field intptr providerGroupGuid
    #field intptr producerName
    #field intptr privacyTags
    #field int privacyTagCount
    #field intptr categoryIds
    #field int categoryIdCount
    #field bool isCoreData
    #field intptr extra1
    #field intptr extra2
    #field intptr extra3
#endstruct

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