TraceEventInstance
関数シグネチャ
// ADVAPI32.dll
#include <windows.h>
DWORD TraceEventInstance(
ULONGLONG TraceHandle,
EVENT_INSTANCE_HEADER* EventTrace,
EVENT_INSTANCE_INFO* InstInfo,
EVENT_INSTANCE_INFO* ParentInstInfo // optional
);パラメーター
| 名前 | 型 | 方向 | 説明 |
|---|---|---|---|
| TraceHandle | ULONGLONG | in | イベントインスタンスを記録するイベントトレースセッションへのハンドルです。プロバイダーは、ControlCallback の実装内で GetTraceLoggerHandle 関数を呼び出すことでこのハンドルを取得します。 |
| EventTrace | EVENT_INSTANCE_HEADER* | in | EVENT_INSTANCE_HEADER 構造体へのポインターです。イベント固有のデータを構造体に付加することもできます。ログに記録できるイベントの最大サイズは 64K です。EVENT_INSTANCE_HEADER 構造体の次のメンバーには値を指定する必要があります。
プロバイダーが提供する情報の複雑さに応じて、次のメンバーにも値を指定することを検討してください。
関連するイベント間の階層関係をトレースするには、ParentRegHandle メンバーも設定します。 |
| InstInfo | EVENT_INSTANCE_INFO* | in | EVENT_INSTANCE_INFO 構造体へのポインターです。この構造体には、このイベントトレースクラスの登録ハンドルとインスタンス識別子が含まれます。構造体を初期化するには CreateTraceInstanceId 関数を使用します。 |
| ParentInstInfo | EVENT_INSTANCE_INFO* | inoptional | EVENT_INSTANCE_INFO 構造体へのポインターです。この構造体には、親イベントトレースクラスの登録ハンドルとそのインスタンス識別子が含まれます。構造体を初期化するには CreateTraceInstanceId 関数を使用します。階層関係をトレースしない場合は NULL を設定します。 |
戻り値の型: DWORD
公式ドキュメント
RegisterTraceGuids ベース(「クラシック」)のイベントプロバイダーは、
戻り値
関数が成功した場合、戻り値は ERROR_SUCCESS です。
関数が失敗した場合、戻り値は システムエラーコード のいずれかになります。以下は一般的なエラーとその原因です。
-
EVENT_INSTANCE_HEADER の Flags メンバーに WNODE_FLAG_TRACED_GUID が含まれていません。
-
関数呼び出しを完了するのに十分なメモリがありませんでした。このエラーコードの原因については、後述の「解説」セクションで説明します。
-
次のいずれかが該当します。
- EventTrace が NULL です。
- pInstInfo が NULL です。
- pInstInfo のメンバーが NULL です。
- TraceHandle が NULL です。
- EVENT_INSTANCE_HEADER の Size メンバーが正しくありません。
-
TraceHandle が無効であるか、NT Kernel Logger セッションのハンドルを指定しています。
-
書き込み可能な空きバッファーがセッションに残っていませんでした。これは、ディスクサブシステムが過負荷であるか、バッファー数が少なすぎるために、イベントレートが高いときに発生することがあります。TraceEvent は、より多くのバッファーが利用可能になるまでブロックするのではなく、イベントを破棄します。
Windows 2000 および Windows XP: サポートされていません。
-
バッファープールが最大サイズに達していないにもかかわらず、追加のバッファーを割り当てるのに十分な利用可能なメモリがなく、イベントを受け取れるバッファーもないため、イベントが破棄されます。
-
単一のイベントのデータが複数のバッファーにまたがることはできません。トレースイベントは、イベントトレースセッションのバッファーのサイズから EVENT_INSTANCE_HEADER 構造体のサイズを引いたサイズに制限されます。
解説(Remarks)
MOF ベースの ETW プロバイダーがこの関数を呼び出します。
ほとんどの開発者はこの関数を呼び出しません。この API は MOF ベースの ETW をサポートしていますが、MOF ベースの ETW は非推奨であり、マニフェストベースの ETW の使用が推奨されます。さらに、ほとんどの MOF ベースのプロバイダーは、ETW API を直接呼び出すのではなく、MC.exe によって生成されたラッパー関数を使用します。
プロバイダーがこの関数を呼び出す前に、プロバイダーは次の処理を行う必要があります。
- 自身とイベントトレースクラスを登録するために、RegisterTraceGuids 関数を呼び出す必要があります。
- 登録済みのイベントトレースクラスのインスタンス識別子を作成するために、CreateTraceInstanceId 関数を呼び出す必要があります。
- 有効化されている必要があります。コントローラーは EnableTrace 関数を呼び出してプロバイダーを有効化します。
イベントは、ログファイルに書き込まれるか、リアルタイムでイベントトレースコンシューマーに送信されるか、またはその両方が行われます。イベントの送信先は、StartTrace に渡される EVENT_TRACE_PROPERTIES 構造体の LogFileMode メンバーによって定義されます。
トレースイベントは、発生した順序で書き込まれます。
関連性のないイベントをトレースするには、TraceEvent 関数を使用します。
Windows XP: 正しく動作しません。
例
CreateTraceInstanceId と TraceEventInstance を使用して関連するイベントのセットを生成する例については、Tracing Event Instances を参照してください。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
各言語での呼び出し定義
// ADVAPI32.dll
#include <windows.h>
DWORD TraceEventInstance(
ULONGLONG TraceHandle,
EVENT_INSTANCE_HEADER* EventTrace,
EVENT_INSTANCE_INFO* InstInfo,
EVENT_INSTANCE_INFO* ParentInstInfo // optional
);[DllImport("ADVAPI32.dll", ExactSpelling = true)]
static extern uint TraceEventInstance(
ulong TraceHandle, // ULONGLONG
IntPtr EventTrace, // EVENT_INSTANCE_HEADER*
IntPtr InstInfo, // EVENT_INSTANCE_INFO*
IntPtr ParentInstInfo // EVENT_INSTANCE_INFO* optional
);<DllImport("ADVAPI32.dll", ExactSpelling:=True)>
Public Shared Function TraceEventInstance(
TraceHandle As ULong, ' ULONGLONG
EventTrace As IntPtr, ' EVENT_INSTANCE_HEADER*
InstInfo As IntPtr, ' EVENT_INSTANCE_INFO*
ParentInstInfo As IntPtr ' EVENT_INSTANCE_INFO* optional
) As UInteger
End Function' TraceHandle : ULONGLONG
' EventTrace : EVENT_INSTANCE_HEADER*
' InstInfo : EVENT_INSTANCE_INFO*
' ParentInstInfo : EVENT_INSTANCE_INFO* optional
Declare PtrSafe Function TraceEventInstance Lib "advapi32" ( _
ByVal TraceHandle As LongLong, _
ByVal EventTrace As LongPtr, _
ByVal InstInfo As LongPtr, _
ByVal ParentInstInfo As LongPtr) As Long
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。import ctypes
from ctypes import wintypes
TraceEventInstance = ctypes.windll.advapi32.TraceEventInstance
TraceEventInstance.restype = wintypes.DWORD
TraceEventInstance.argtypes = [
ctypes.c_ulonglong, # TraceHandle : ULONGLONG
ctypes.c_void_p, # EventTrace : EVENT_INSTANCE_HEADER*
ctypes.c_void_p, # InstInfo : EVENT_INSTANCE_INFO*
ctypes.c_void_p, # ParentInstInfo : EVENT_INSTANCE_INFO* optional
]require 'fiddle'
require 'fiddle/import'
lib = Fiddle.dlopen('ADVAPI32.dll')
TraceEventInstance = Fiddle::Function.new(
lib['TraceEventInstance'],
[
-Fiddle::TYPE_LONG_LONG, # TraceHandle : ULONGLONG
Fiddle::TYPE_VOIDP, # EventTrace : EVENT_INSTANCE_HEADER*
Fiddle::TYPE_VOIDP, # InstInfo : EVENT_INSTANCE_INFO*
Fiddle::TYPE_VOIDP, # ParentInstInfo : EVENT_INSTANCE_INFO* optional
],
-Fiddle::TYPE_INT)#[link(name = "advapi32")]
extern "system" {
fn TraceEventInstance(
TraceHandle: u64, // ULONGLONG
EventTrace: *mut EVENT_INSTANCE_HEADER, // EVENT_INSTANCE_HEADER*
InstInfo: *mut EVENT_INSTANCE_INFO, // EVENT_INSTANCE_INFO*
ParentInstInfo: *mut EVENT_INSTANCE_INFO // EVENT_INSTANCE_INFO* optional
) -> u32;
}
// crates: windows-sys provides ready-made bindings for this API.$sig = @"
[DllImport("ADVAPI32.dll")]
public static extern uint TraceEventInstance(ulong TraceHandle, IntPtr EventTrace, IntPtr InstInfo, IntPtr ParentInstInfo);
"@
$api = Add-Type -MemberDefinition $sig -Name 'ADVAPI32_TraceEventInstance' -Namespace Win32 -PassThru
# $api::TraceEventInstance(TraceHandle, EventTrace, InstInfo, ParentInstInfo)#uselib "ADVAPI32.dll"
#func global TraceEventInstance "TraceEventInstance" sptr, sptr, sptr, sptr
; TraceEventInstance TraceHandle, varptr(EventTrace), varptr(InstInfo), varptr(ParentInstInfo) ; 戻り値は stat
; TraceHandle : ULONGLONG -> "sptr"
; EventTrace : EVENT_INSTANCE_HEADER* -> "sptr"
; InstInfo : EVENT_INSTANCE_INFO* -> "sptr"
; ParentInstInfo : EVENT_INSTANCE_INFO* optional -> "sptr"
; ※HSP3.7は int64 引数(64bit値渡し)に非対応です。
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。#uselib "ADVAPI32.dll" #cfunc global TraceEventInstance "TraceEventInstance" int64, var, var, var ; res = TraceEventInstance(TraceHandle, EventTrace, InstInfo, ParentInstInfo) ; TraceHandle : ULONGLONG -> "int64" ; EventTrace : EVENT_INSTANCE_HEADER* -> "var" ; InstInfo : EVENT_INSTANCE_INFO* -> "var" ; ParentInstInfo : EVENT_INSTANCE_INFO* optional -> "var" ; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。 ; ※int64 引数の DLL 値渡しは x64 ランタイム(hsp3_64)のみ対応(x86 は未対応)。#uselib "ADVAPI32.dll" #cfunc global TraceEventInstance "TraceEventInstance" int64, sptr, sptr, sptr ; res = TraceEventInstance(TraceHandle, varptr(EventTrace), varptr(InstInfo), varptr(ParentInstInfo)) ; TraceHandle : ULONGLONG -> "int64" ; EventTrace : EVENT_INSTANCE_HEADER* -> "sptr" ; InstInfo : EVENT_INSTANCE_INFO* -> "sptr" ; ParentInstInfo : EVENT_INSTANCE_INFO* optional -> "sptr" ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※int64 引数の DLL 値渡しは x64 ランタイム(hsp3_64)のみ対応(x86 は未対応)。
; DWORD TraceEventInstance(ULONGLONG TraceHandle, EVENT_INSTANCE_HEADER* EventTrace, EVENT_INSTANCE_INFO* InstInfo, EVENT_INSTANCE_INFO* ParentInstInfo) #uselib "ADVAPI32.dll" #cfunc global TraceEventInstance "TraceEventInstance" int64, var, var, var ; res = TraceEventInstance(TraceHandle, EventTrace, InstInfo, ParentInstInfo) ; TraceHandle : ULONGLONG -> "int64" ; EventTrace : EVENT_INSTANCE_HEADER* -> "var" ; InstInfo : EVENT_INSTANCE_INFO* -> "var" ; ParentInstInfo : EVENT_INSTANCE_INFO* optional -> "var" ; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。; DWORD TraceEventInstance(ULONGLONG TraceHandle, EVENT_INSTANCE_HEADER* EventTrace, EVENT_INSTANCE_INFO* InstInfo, EVENT_INSTANCE_INFO* ParentInstInfo) #uselib "ADVAPI32.dll" #cfunc global TraceEventInstance "TraceEventInstance" int64, intptr, intptr, intptr ; res = TraceEventInstance(TraceHandle, varptr(EventTrace), varptr(InstInfo), varptr(ParentInstInfo)) ; TraceHandle : ULONGLONG -> "int64" ; EventTrace : EVENT_INSTANCE_HEADER* -> "intptr" ; InstInfo : EVENT_INSTANCE_INFO* -> "intptr" ; ParentInstInfo : EVENT_INSTANCE_INFO* optional -> "intptr" ; ※出力/バッファ引数はポインタ方式(token=intptr / 呼び出しは varptr(変数))。
import (
"golang.org/x/sys/windows"
"unsafe"
)
var (
advapi32 = windows.NewLazySystemDLL("ADVAPI32.dll")
procTraceEventInstance = advapi32.NewProc("TraceEventInstance")
)
// TraceHandle (ULONGLONG), EventTrace (EVENT_INSTANCE_HEADER*), InstInfo (EVENT_INSTANCE_INFO*), ParentInstInfo (EVENT_INSTANCE_INFO* optional)
r1, _, err := procTraceEventInstance.Call(
uintptr(TraceHandle),
uintptr(EventTrace),
uintptr(InstInfo),
uintptr(ParentInstInfo),
)
_ = err // syscall.Errno (valid when the call sets last-error)
_ = r1 // DWORDfunction TraceEventInstance(
TraceHandle: UInt64; // ULONGLONG
EventTrace: Pointer; // EVENT_INSTANCE_HEADER*
InstInfo: Pointer; // EVENT_INSTANCE_INFO*
ParentInstInfo: Pointer // EVENT_INSTANCE_INFO* optional
): DWORD; stdcall;
external 'ADVAPI32.dll' name 'TraceEventInstance';result := DllCall("ADVAPI32\TraceEventInstance"
, "Int64", TraceHandle ; ULONGLONG
, "Ptr", EventTrace ; EVENT_INSTANCE_HEADER*
, "Ptr", InstInfo ; EVENT_INSTANCE_INFO*
, "Ptr", ParentInstInfo ; EVENT_INSTANCE_INFO* optional
, "UInt") ; return: DWORD●TraceEventInstance(TraceHandle, EventTrace, InstInfo, ParentInstInfo) = DLL("ADVAPI32.dll", "dword TraceEventInstance(qword, void*, void*, void*)")
# 呼び出し: TraceEventInstance(TraceHandle, EventTrace, InstInfo, ParentInstInfo)
# TraceHandle : ULONGLONG -> "qword"
# EventTrace : EVENT_INSTANCE_HEADER* -> "void*"
# InstInfo : EVENT_INSTANCE_INFO* -> "void*"
# ParentInstInfo : EVENT_INSTANCE_INFO* optional -> "void*"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。const std = @import("std");
extern "advapi32" fn TraceEventInstance(
TraceHandle: u64, // ULONGLONG
EventTrace: [*c]EVENT_INSTANCE_HEADER, // EVENT_INSTANCE_HEADER*
InstInfo: [*c]EVENT_INSTANCE_INFO, // EVENT_INSTANCE_INFO*
ParentInstInfo: [*c]EVENT_INSTANCE_INFO // EVENT_INSTANCE_INFO* optional
) callconv(std.os.windows.WINAPI) u32;proc TraceEventInstance(
TraceHandle: uint64, # ULONGLONG
EventTrace: ptr EVENT_INSTANCE_HEADER, # EVENT_INSTANCE_HEADER*
InstInfo: ptr EVENT_INSTANCE_INFO, # EVENT_INSTANCE_INFO*
ParentInstInfo: ptr EVENT_INSTANCE_INFO # EVENT_INSTANCE_INFO* optional
): uint32 {.importc: "TraceEventInstance", stdcall, dynlib: "ADVAPI32.dll".}pragma(lib, "advapi32");
extern(Windows)
uint TraceEventInstance(
ulong TraceHandle, // ULONGLONG
EVENT_INSTANCE_HEADER* EventTrace, // EVENT_INSTANCE_HEADER*
EVENT_INSTANCE_INFO* InstInfo, // EVENT_INSTANCE_INFO*
EVENT_INSTANCE_INFO* ParentInstInfo // EVENT_INSTANCE_INFO* optional
);ccall((:TraceEventInstance, "ADVAPI32.dll"), stdcall, UInt32,
(UInt64, Ptr{EVENT_INSTANCE_HEADER}, Ptr{EVENT_INSTANCE_INFO}, Ptr{EVENT_INSTANCE_INFO}),
TraceHandle, EventTrace, InstInfo, ParentInstInfo)
# TraceHandle : ULONGLONG -> UInt64
# EventTrace : EVENT_INSTANCE_HEADER* -> Ptr{EVENT_INSTANCE_HEADER}
# InstInfo : EVENT_INSTANCE_INFO* -> Ptr{EVENT_INSTANCE_INFO}
# ParentInstInfo : EVENT_INSTANCE_INFO* optional -> Ptr{EVENT_INSTANCE_INFO}
# stdcall は 32bit のみ意味を持つ(x64 では無視)。local ffi = require("ffi")
ffi.cdef[[
uint32_t TraceEventInstance(
uint64_t TraceHandle,
void* EventTrace,
void* InstInfo,
void* ParentInstInfo);
]]
local advapi32 = ffi.load("advapi32")
-- advapi32.TraceEventInstance(TraceHandle, EventTrace, InstInfo, ParentInstInfo)
-- TraceHandle : ULONGLONG
-- EventTrace : EVENT_INSTANCE_HEADER*
-- InstInfo : EVENT_INSTANCE_INFO*
-- ParentInstInfo : EVENT_INSTANCE_INFO* optional
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。const koffi = require('koffi');
const lib = koffi.load('ADVAPI32.dll');
const TraceEventInstance = lib.func('__stdcall', 'TraceEventInstance', 'uint32_t', ['uint64_t', 'void *', 'void *', 'void *']);
// TraceEventInstance(TraceHandle, EventTrace, InstInfo, ParentInstInfo)
// TraceHandle : ULONGLONG -> 'uint64_t'
// EventTrace : EVENT_INSTANCE_HEADER* -> 'void *'
// InstInfo : EVENT_INSTANCE_INFO* -> 'void *'
// ParentInstInfo : EVENT_INSTANCE_INFO* optional -> 'void *'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。const lib = Deno.dlopen("ADVAPI32.dll", {
TraceEventInstance: { parameters: ["u64", "pointer", "pointer", "pointer"], result: "u32" },
});
// lib.symbols.TraceEventInstance(TraceHandle, EventTrace, InstInfo, ParentInstInfo)
// TraceHandle : ULONGLONG -> "u64"
// EventTrace : EVENT_INSTANCE_HEADER* -> "pointer"
// InstInfo : EVENT_INSTANCE_INFO* -> "pointer"
// ParentInstInfo : EVENT_INSTANCE_INFO* optional -> "pointer"
// 文字列引数は "buffer"(NUL 終端のバイト列を Uint8Array で渡す)。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。<?php
$ffi = FFI::cdef(<<<C
uint32_t TraceEventInstance(
uint64_t TraceHandle,
void* EventTrace,
void* InstInfo,
void* ParentInstInfo);
C, "ADVAPI32.dll");
// $ffi->TraceEventInstance(TraceHandle, EventTrace, InstInfo, ParentInstInfo);
// TraceHandle : ULONGLONG
// EventTrace : EVENT_INSTANCE_HEADER*
// InstInfo : EVENT_INSTANCE_INFO*
// ParentInstInfo : EVENT_INSTANCE_INFO* optional
// 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
// WINAPI(stdcall): x64 では呼出規約が統一されるため問題なし。x86 では __stdcall 対応のラッパが必要な場合あり。import com.sun.jna.*;
import com.sun.jna.ptr.*;
import com.sun.jna.win32.StdCallLibrary;
import com.sun.jna.win32.W32APIOptions;
public interface Advapi32 extends StdCallLibrary {
Advapi32 INSTANCE = Native.load("advapi32", Advapi32.class);
int TraceEventInstance(
long TraceHandle, // ULONGLONG
Pointer EventTrace, // EVENT_INSTANCE_HEADER*
Pointer InstInfo, // EVENT_INSTANCE_INFO*
Pointer ParentInstInfo // EVENT_INSTANCE_INFO* optional
);
}@[Link("advapi32")]
lib LibADVAPI32
fun TraceEventInstance = TraceEventInstance(
TraceHandle : UInt64, # ULONGLONG
EventTrace : EVENT_INSTANCE_HEADER*, # EVENT_INSTANCE_HEADER*
InstInfo : EVENT_INSTANCE_INFO*, # EVENT_INSTANCE_INFO*
ParentInstInfo : EVENT_INSTANCE_INFO* # EVENT_INSTANCE_INFO* optional
) : UInt32
end
# 構造体/GUID/enum は lib 内に対応する型定義が必要。
# 呼出規約: x64 は規約統一のため OK。x86(32bit)は WINAPI=stdcall だが Crystal の fun に stdcall 付与構文がなく非対応。import 'dart:ffi';
import 'package:ffi/ffi.dart';
typedef TraceEventInstanceNative = Uint32 Function(Uint64, Pointer<Void>, Pointer<Void>, Pointer<Void>);
typedef TraceEventInstanceDart = int Function(int, Pointer<Void>, Pointer<Void>, Pointer<Void>);
final TraceEventInstance = DynamicLibrary.open('ADVAPI32.dll')
.lookupFunction<TraceEventInstanceNative, TraceEventInstanceDart>('TraceEventInstance');
// TraceHandle : ULONGLONG -> Uint64
// EventTrace : EVENT_INSTANCE_HEADER* -> Pointer<Void>
// InstInfo : EVENT_INSTANCE_INFO* -> Pointer<Void>
// ParentInstInfo : EVENT_INSTANCE_INFO* optional -> Pointer<Void>
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。{$mode objfpc}{$H+}
function TraceEventInstance(
TraceHandle: UInt64; // ULONGLONG
EventTrace: Pointer; // EVENT_INSTANCE_HEADER*
InstInfo: Pointer; // EVENT_INSTANCE_INFO*
ParentInstInfo: Pointer // EVENT_INSTANCE_INFO* optional
): DWORD; stdcall;
external 'ADVAPI32.dll' name 'TraceEventInstance';import Foreign
import Foreign.C.Types
import Foreign.C.String
foreign import stdcall safe "TraceEventInstance"
c_TraceEventInstance :: Word64 -> Ptr () -> Ptr () -> Ptr () -> IO Word32
-- TraceHandle : ULONGLONG -> Word64
-- EventTrace : EVENT_INSTANCE_HEADER* -> Ptr ()
-- InstInfo : EVENT_INSTANCE_INFO* -> Ptr ()
-- ParentInstInfo : EVENT_INSTANCE_INFO* optional -> Ptr ()
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。open Ctypes
open Foreign
let traceeventinstance =
foreign "TraceEventInstance"
(uint64_t @-> (ptr void) @-> (ptr void) @-> (ptr void) @-> returning uint32_t)
(* TraceHandle : ULONGLONG -> uint64_t *)
(* EventTrace : EVENT_INSTANCE_HEADER* -> (ptr void) *)
(* InstInfo : EVENT_INSTANCE_INFO* -> (ptr void) *)
(* ParentInstInfo : EVENT_INSTANCE_INFO* optional -> (ptr void) *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)(cffi:define-foreign-library advapi32 (t "ADVAPI32.dll"))
(cffi:use-foreign-library advapi32)
(cffi:defcfun ("TraceEventInstance" trace-event-instance :convention :stdcall) :uint32
(trace-handle :uint64) ; ULONGLONG
(event-trace :pointer) ; EVENT_INSTANCE_HEADER*
(inst-info :pointer) ; EVENT_INSTANCE_INFO*
(parent-inst-info :pointer)) ; EVENT_INSTANCE_INFO* optional
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。use Win32::API;
my $TraceEventInstance = Win32::API::More->new('ADVAPI32',
'DWORD TraceEventInstance(UINT64 TraceHandle, LPVOID EventTrace, LPVOID InstInfo, LPVOID ParentInstInfo)');
# my $ret = $TraceEventInstance->Call($TraceHandle, $EventTrace, $InstInfo, $ParentInstInfo);
# TraceHandle : ULONGLONG -> UINT64
# EventTrace : EVENT_INSTANCE_HEADER* -> LPVOID
# InstInfo : EVENT_INSTANCE_INFO* -> LPVOID
# ParentInstInfo : EVENT_INSTANCE_INFO* optional -> LPVOID
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。