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

EnableTraceEx2

関数
フィルターやパラメーターを指定してプロバイダーを有効化または無効化する。
DLLADVAPI32.dll呼出規約winapi対応OSWindows 7 以降

シグネチャ

// ADVAPI32.dll
#include <windows.h>

WIN32_ERROR EnableTraceEx2(
    ULONGLONG TraceId,
    const GUID* ProviderId,
    DWORD ControlCode,
    BYTE Level,
    ULONGLONG MatchAnyKeyword,
    ULONGLONG MatchAllKeyword,
    DWORD Timeout,
    ENABLE_TRACE_PARAMETERS* EnableParameters   // optional
);

パラメーター

名前方向説明
TraceIdULONGLONGinイベントを受け取るトレースセッションのハンドル。
ProviderIdGUID*in構成対象のイベントプロバイダーのプロバイダー ID(コントロール GUID)です。
ControlCodeDWORDin

次のいずれかのコントロールコードを指定できます。

意味
EVENT_CONTROL_CODE_DISABLE_PROVIDER セッションがプロバイダーからイベントを受信しないようにセッション構成を更新します。
EVENT_CONTROL_CODE_ENABLE_PROVIDER セッションがプロバイダーから要求されたイベントを受信するようにセッション構成を更新します。
EVENT_CONTROL_CODE_CAPTURE_STATE プロバイダーに自身の状態情報をログ出力するよう要求します。
LevelBYTEin

プロバイダーに書き込ませるイベントの最大レベルを示す値です。プロバイダーは通常、 イベントのレベルがこの値以下であり、かつ MatchAnyKeywordMatchAllKeyword の条件を満たす場合にイベントを書き込みます。

Microsoft はレベル 1〜5 のセマンティクスを次のように定義しています。値が小さいほど 重大なイベントを示します。Level の各値は、指定したレベルとそれより重大なすべての レベルを有効にします。たとえば TRACE_LEVEL_WARNING を指定すると、 コンシューマーは警告、エラー、および重大イベントを受信します。

意味
TRACE_LEVEL_CRITICAL (1) 異常終了またはターミネートイベント
TRACE_LEVEL_ERROR (2) 深刻なエラーイベント
TRACE_LEVEL_WARNING (3) 割り当て失敗などの警告イベント
TRACE_LEVEL_INFORMATION (4) エラーではない情報イベント
TRACE_LEVEL_VERBOSE (5) 詳細な診断イベント

TRACE_LEVEL 定数は evntrace.h で定義されています。同等の WINMETA_LEVEL 定数は winmeta.h で定義されています。

MatchAnyKeywordULONGLONGinプロバイダーに書き込ませるイベントのカテゴリを決定するキーワードの 64 ビット ビットマスクです。プロバイダーは通常、イベントのキーワードビットがこの値に 設定されたいずれかのビットと一致する場合、またはイベントにキーワードビットが 設定されていない場合に、LevelMatchAllKeyword の条件を満たすことに加えて イベントを書き込みます。
MatchAllKeywordULONGLONGin

プロバイダーに書き込ませるイベントを制限するキーワードの 64 ビットビットマスクです。 プロバイダーは通常、イベントのキーワードビットがこの値に設定されたすべての ビットと一致する場合、またはイベントにキーワードビットが設定されていない場合に、 LevelMatchAnyKeyword の条件を満たすことに加えてイベントを書き込みます。

この値はしばしば 0 に設定されます。

TimeoutDWORDin

Timeout が 0 の場合、この関数はプロバイダーの構成を非同期に開始し、 ただちに返ります(つまり、プロバイダーのコールバックの完了を待たずに返ります)。

それ以外の場合、この関数はプロバイダーの構成を開始し、すべてのプロバイダー コールバックの完了を含め、構成が完了するまで待機を開始します。指定したタイムアウト 以内に構成が完了した場合、この関数は ERROR_SUCCESS を返します。それ以外の場合、 この関数は ERROR_TIMEOUT を返します。

無限に待機するには INFINITE を設定します。

EnableParametersENABLE_TRACE_PARAMETERS*inoptionalプロバイダーを有効にするために使用するトレースパラメーターです。詳細については ENABLE_TRACE_PARAMETERS を参照してください。

戻り値の型: WIN32_ERROR

公式ドキュメント

トレースセッションコントローラーは、ETW イベントの構成方法を設定するために EnableTraceEx2 を呼び出します。

戻り値

関数が成功した場合、戻り値は ERROR_SUCCESS です。

関数が失敗した場合、戻り値は システムエラーコードのいずれかです。以下は 一般的なエラーとその原因です。

解説(Remarks)

イベントトレースコントローラーは、セッションにイベントを書き込むイベント プロバイダーを構成するためにこの関数を呼び出します。たとえば、コントローラーは プロバイダーからのイベント収集を開始したり、プロバイダーから収集するイベントの レベルやキーワードを調整したり、プロバイダーからのイベント収集を停止したりするために この関数を呼び出すことがあります。

プロバイダーの有効化動作は、プロバイダーが使用する API によって異なります。

モダンな有効化システムを使用するプロバイダー(つまり EventRegister を使用する プロバイダー)の場合、ETW はトレースセッションコントローラーが EnableTraceEx2EnableParameters を介して要求できるいくつかの機能をサポートしています。(詳細については EVENT_FILTER_DESCRIPTOR を参照してください。)

メモ

ETW は強力なペイロードフィルタリングと属性フィルタリングをサポートしていますが、 イベントは主にスコープフィルター、またはコントロール GUID、レベル、キーワードに基づいて フィルタリングすべきです。プロバイダーは通常、イベントが生成または ETW に送信される前に、 プロバイダーのコード内で直接コントロール GUID、レベル、キーワードによるフィルタリングを 実行します。ほとんどのプロバイダーでは、レベルまたはキーワードによって無効化された イベントはシステムパフォーマンスにほとんど影響を与えません。同様に、スコープフィルターに よって無効化されたプロバイダーもシステムパフォーマンスにほとんど影響を与えません。 その他の種類のフィルタリング(ペイロード、またはレベルとキーワード以外の属性に基づく フィルタリング)は通常、プロバイダーがイベントを生成して ETW ランタイムに送信した後に 実行されます。つまり、ETW のフィルタリングがそのイベントをどのセッションにも記録すべき でないと判断したとしても、イベントはシステムパフォーマンスに影響を与えます(イベントの 準備と ETW への送信に費やされる CPU 時間)。この種のフィルタリングはトレースデータ量の 削減にのみ有効であり、トレースの CPU オーバーヘッドの削減にはそれほど効果的ではありません。

EnableTraceEx2 が呼び出されるたびに、そのセッションにおけるプロバイダーのフィルターは、 EnableTraceEx2 関数に渡されたパラメーターによって定義された新しいパラメーターに 置き換えられます。単一の EnableTraceEx2 呼び出しで渡された複数のフィルターは加算的な 効果で組み合わせることができますが、後続の呼び出しで渡されたフィルターは前のフィルター セットを置き換えます。

フィルタリングを無効にして、これによりログセッション内のすべてのプロバイダー/イベントを 有効にするには、FilterDescCount メンバーを 0 に設定した ENABLE_TRACE_PARAMETERS 構造体を指す EnableParameters パラメーターを指定して EnableTraceEx2 を呼び出します。

EnableTraceEx2 関数に渡される各フィルターは、 EVENT_FILTER_DESCRIPTOR 内の Type メンバーによって指定されます。EVENT_FILTER_DESCRIPTOR 構造体の配列は、 EnableTraceEx2 関数の EnableParameters パラメーターに渡される ENABLE_TRACE_PARAMETERS 構造体で渡されます。

各種類のフィルター(特定の Type メンバー)は、EnableTraceEx2 関数の呼び出しに 1 回だけ出現できます。一部のフィルター種類では、単一のフィルターに複数の条件を含める ことができます。EnableTraceEx2 の呼び出しに含めることができるフィルターの最大数は MAX_EVENT_FILTERS_COUNT(Evntprov.h ヘッダーファイルで定義。値は Windows SDK の 将来のバージョンで変更される可能性があります)で設定されています。

各フィルター種類には、 EVENT_FILTER_DESCRIPTOR 構造体の特定の Type メンバーに基づく独自のサイズまたはエンティティの制限があります。 以下のリストはこれらの制限を示しています。

キーワードはイベントのカテゴリを定義します。たとえば、プロバイダーが InitializationKeyword = 0x1(キーワードビット 0)、FileOperationKeyword = 0x2 (キーワードビット 1)、CalculationKeyword = 0x4(キーワードビット 2)を定義している場合、 MatchAnyKeyword を (InitializationKeyword | CalculationKeyword) = 5 に設定すると、 初期化イベントと計算イベントを受信し、ファイルイベントは受信しません。

モダンな(マニフェストベースまたは TraceLogging)プロバイダーとともに 使用する場合、MatchAnyKeyword の値 0MatchAnyKeyword の値 0xFFFFFFFFFFFFFFFF と同じように扱われます。つまり、すべてのイベントキーワードを 有効にします。ただし、この動作はレガシーな (MOF または TMF ベースの WPP)プロバイダーには 適用されません。レガシープロバイダーからすべてのイベントキーワードを有効にするには、 MatchAnyKeyword0xFFFFFFFF に設定します。レガシーとモダンの両方のプロバイダーから すべてのイベントキーワードを有効にするには、MatchAnyKeyword0xFFFFFFFFFFFFFFFF に 設定します。

イベントのキーワードが 0 の場合、プロバイダーは MatchAnyKeyword および MatchAllKeyword マスクに関係なくイベントをセッションに書き込みます。(この動作は EVENT_ENABLE_PROPERTY_IGNORE_KEYWORD_0 フラグを使用することで無効にできます。)

プロバイダーグループを有効にすることを示すには、EnableParametersEnableProperty メンバーで EVENT_ENABLE_PROPERTY_PROVIDER_GROUP フラグを使用します。

EnableTraceEx2 を呼び出すとき、プロバイダーはすでに登録されている場合とそうでない 場合があります。プロバイダーがすでに登録されている場合、ETW はプロバイダーのコールバック 関数(存在する場合)を呼び出し、セッションはイベントの受信を開始します。プロバイダーが まだ登録されていない場合、ETW はプロバイダーが登録された直後にプロバイダーのコールバック 関数(存在する場合)を呼び出し、その後セッションはイベントの受信を開始します。 プロバイダーがまだ登録されていない場合、プロバイダーのコールバック関数はソース ID を 受信しません。

プロバイダーが登録され、すでにセッションに対して有効になっている場合、再度 EnableTraceEx2 を呼び出すことで、LevelMatchAnyKeywordMatchAllKeyword パラメーター、および EnableParametersEnablePropertyEnableFilterDesc メンバーを更新できます。

Windows 8.1、Windows Server 2012 R2、およびそれ以降では、ロガーセッション内の特定の 条件に対してフィルタリングを行うために、イベントペイロード、スコープ、およびスタックウォーク フィルターを EnableTraceEx2 関数および ENABLE_TRACE_PARAMETERSEVENT_FILTER_DESCRIPTOR 構造体で使用できます。イベントペイロードフィルターの詳細については、 TdhCreatePayloadFilter および TdhAggregatePayloadFilters 関数と、ENABLE_TRACE_PARAMETERSEVENT_FILTER_DESCRIPTOR、および PAYLOAD_FILTER_PREDICATE 構造体を参照してください。

特別なシステムトレースプロバイダーイベントは、EnableTraceEx2 によって有効化または 無効化することはできません。これらは、トレースが StartTrace によって最初に開始される ときに、EVENT_TRACE_PROPERTIESEnableFlags フィールドを介してのみ有効にできます。

Windows 11 以降では、 システムトレースプロバイダーイベントを EnableTraceEx2 を使用して有効にできます

最大 8 つのトレースセッションが、同じモダンな (マニフェストベースまたは TraceLogging)プロバイダーを有効にして そこからイベントを受信できます。ただし、レガシー(MOF、TMF ベースの WPP)プロバイダーを 有効にできるトレースセッションは 1 つだけです。複数のセッションがレガシープロバイダーを 有効にしようとすると、2 つ目のセッションが同じプロバイダーを有効にした時点で、最初の セッションはイベントの受信を停止します。たとえば、セッション A がレガシープロバイダーを 有効にし、その後セッション B が同じプロバイダーを有効にした場合、セッション B のみがその プロバイダーからイベントを受信します。

プロバイダーは、セッションがプロバイダーを無効にするまでそのセッションに対して有効なまま です。セッションを開始したアプリケーションがプロバイダーを無効にせずに終了した場合、 プロバイダーは有効なままになります。

マニフェストベースのプロバイダーを有効にするために使用されたレベルとキーワードを確認するには、 次のいずれかのコマンドを使用します。

クラシックプロバイダーの場合、サポートする重大度レベルや有効化フラグを文書化し、 潜在的なコントローラーが利用できるようにするのはプロバイダーの責任です。プロバイダーが どのコントローラーからでも有効にされることを望む場合、プロバイダーは重大度レベルおよび 有効化フラグとして 0 を受け入れ、0 を既定のログ記録(それがどのようなものであれ)を実行する 要求として解釈すべきです。

EnableTraceEx2 を使用してクラシックプロバイダーを有効にする場合、次の変換が行われます。

次の例は、TdhCreatePayloadFilter および TdhAggregatePayloadFilters 関数を使用してロガーセッション内の特定の条件をフィルタリングする、ペイロードフィルター を使用した EnableTraceEx2 の使用例を示しています。

#define INITGUID
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
#include <strsafe.h>
#include <evntrace.h>
#include <tdh.h>

#define MAXIMUM_SESSION_NAME 1024

#define PATH_TO_MANIFEST_FILE L"c:\\ExampleManifest.man"

//
// The following definitions would be found in the include file generated by
// message compiler from the manifest file.
//

// Provider Example-Provider Event Count 2
EXTERN_C __declspec(selectany) const GUID EXAMPLE_PROVIDER = {0x37a59b93, 0xbb25, 0x4cee, {0x97, 0xaa, 0x8b, 0x6a, 0xcd, 0xc, 0x4d, 0xf8}};

//
// Event Descriptors
//
EXTERN_C __declspec(selectany) const EVENT_DESCRIPTOR Example_Event_1 = { 0x1, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0 };
#define Example_Event_1_value 0x1
EXTERN_C __declspec(selectany) const EVENT_DESCRIPTOR Example_Event_2 = { 0x2, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0 };
#define Example_Event_2_value 0x2

//
// (End of snippet from include file)
//

// Allocate an EVENT_TRACE_PROPERTIES structure and set the needed logging session properties
PEVENT_TRACE_PROPERTIES AllocateTraceProperties(
    _In_opt_ PCWSTR LoggerName,
    _In_opt_ PCWSTR LogFileName
)
{
    PEVENT_TRACE_PROPERTIES TraceProperties = NULL;
    ULONG BufferSize;

    BufferSize = sizeof(EVENT_TRACE_PROPERTIES) +
        (MAXIMUM_SESSION_NAME + MAX_PATH) * sizeof(WCHAR);

    TraceProperties = (PEVENT_TRACE_PROPERTIES)malloc(BufferSize);
    if (TraceProperties == NULL) {
        printf("Unable to allocate %d bytes for properties structure.\n", BufferSize);
        goto Exit;
    }

    //
    // Set the session properties.
    //
    ZeroMemory(TraceProperties, BufferSize);
    TraceProperties->Wnode.BufferSize = BufferSize;
    TraceProperties->Wnode.Flags = WNODE_FLAG_TRACED_GUID;
    TraceProperties->LoggerNameOffset = sizeof(EVENT_TRACE_PROPERTIES);
    TraceProperties->LogFileNameOffset = sizeof(EVENT_TRACE_PROPERTIES) +
        (MAXIMUM_SESSION_NAME * sizeof(WCHAR));

    if (LoggerName != NULL) {
        StringCchCopyW((LPWSTR)((PCHAR)TraceProperties + TraceProperties->LoggerNameOffset),
            MAXIMUM_SESSION_NAME,
            LoggerName);
    }

    if (LogFileName != NULL) {
        StringCchCopyW((LPWSTR)((PCHAR)TraceProperties + TraceProperties->LogFileNameOffset),
            MAX_PATH,
            LogFileName);
    }

Exit:
    return TraceProperties;
}

// Free the EVENT_TRACE_PROPERTIES structure previously allocated
VOID FreeTraceProperties(
    _In_ PEVENT_TRACE_PROPERTIES TraceProperties
)
{
    free(TraceProperties);
    return;
}

// Set the values needed in a PAYLOAD_FILTER_PREDICATE for a single payload filter
FORCEINLINE VOID PayloadPredicateCreate(
    _Out_ PAYLOAD_FILTER_PREDICATE* Predicate,
    _In_ PCWSTR FieldName,
    USHORT CompareOp,
    PCWSTR Value
)
{
    Predicate->FieldName = (PWSTR)FieldName;
    Predicate->CompareOp = CompareOp;
    Predicate->Value = (PWSTR)Value;
    return;
}

int __cdecl wmain()
{
    UINT i;
    PVOID EventFilters[2];
    EVENT_FILTER_DESCRIPTOR FilterDescriptor;
    UINT PredicateCount;
    PAYLOAD_FILTER_PREDICATE Predicates[3];
    ULONG FilterCount;
    ULONG Status = ERROR_SUCCESS;
    TRACEHANDLE SessionHandle = 0;
    PEVENT_TRACE_PROPERTIES TraceProperties;
    BOOLEAN TraceStarted = FALSE;
    PCWSTR LoggerName = L"MyTrace";
    ENABLE_TRACE_PARAMETERS EnableParameters;

    ZeroMemory(EventFilters, sizeof(EventFilters));
    ZeroMemory(Predicates, sizeof(Predicates));
    TraceProperties = NULL;
    FilterCount = 0;

    //
    // Load the manifest for the provider
    //
    Status = TdhLoadManifest((PWSTR)PATH_TO_MANIFEST_FILE);
    if (Status != ERROR_SUCCESS) {
        printf("TdhCreatePayloadFilter() failed with %lu\n", Status);
        goto Exit;
    }

    //
    // Create predicates that match the following high-level expression:
    //
    // INCLUDE Example_Event_1 IF
    //     Example_Event_1.Initiator == "User" AND
    //     7 <= Example_Event_1.Level <= 16
    //
    PredicateCount = 0;

    PayloadPredicateCreate(
        &Predicates[PredicateCount++],
        (PWSTR)L"Initiator",
        PAYLOADFIELD_IS,
        (PWSTR)L"User");

    PayloadPredicateCreate(
        &Predicates[PredicateCount++],
        L"Level",
        PAYLOADFIELD_BETWEEN,
        L"7,16");

    Status = TdhCreatePayloadFilter(
        &EXAMPLE_PROVIDER,
        &Example_Event_1,
        FALSE,      // Match all predicates (AND)
        PredicateCount,
        Predicates,
        &EventFilters[FilterCount++]);
    if (Status != ERROR_SUCCESS) {
        printf("TdhCreatePayloadFilter() failed with %lu\n", Status);
        goto Exit;
    }

    //
    // Create predicates that match the following high-level expression:
    // INCLUDE Example_Event_2 IF
    //      Example_Event_2.Title CONTAINS "UNI" OR
    //      Example_Event_2.InstanceId == {0E95CFBC-58D4-44BA-BE40-E63A853536DF} OR
    //      Example_Event_2.ErrorCode != 0      //
    PredicateCount = 0;

    PayloadPredicateCreate(
        &Predicates[PredicateCount++],
        L"Title",
        PAYLOADFIELD_CONTAINS,
        L"UNI");

    PayloadPredicateCreate(
        &Predicates[PredicateCount++],
        L"InstanceId",
        PAYLOADFIELD_IS,
        L" {0E95CFBC-58D4-44BA-BE40-E63A853536DF}");

    PayloadPredicateCreate(
        &Predicates[PredicateCount++],
        L"ErrorCode",
        PAYLOADFIELD_NE,
        L"0");

    Status = TdhCreatePayloadFilter(
        &EXAMPLE_PROVIDER,
        &Example_Event_2,
        FALSE,      // Match any predicates (OR)
        PredicateCount,
        Predicates,
        &EventFilters[FilterCount++]);
    if (Status != ERROR_SUCCESS) {
        printf("TdhCreatePayloadFilter() failed with %lu\n", Status);
        goto Exit;
    }

    //
    // Combine the interim filters into a final filter descriptor.
    //
    Status = TdhAggregatePayloadFilters(
        FilterCount,
        EventFilters,
        NULL,
        &FilterDescriptor);
    if (Status != ERROR_SUCCESS) {
        printf("TdhAggregatePayloadFilters() failed with %lu\n", Status);
        goto Exit;
    }

    //
    // Clean up the interim filters
    //
    for (i = 0; i < FilterCount; i++) {

        Status = TdhDeletePayloadFilter(&EventFilters[i]);
        if (Status != ERROR_SUCCESS) {
            printf("TdhDeletePayloadFilter() failed with %lu\n", Status);
            goto Exit;
        }
    }

    //
    // Create a new trace session
    //
    //
    // Allocate EVENT_TRACE_PROPERTIES structure and perform some
    // basic initialization.
    //
    // N.B. LoggerName will be populated during StartTrace call.
    //
    TraceProperties = AllocateTraceProperties(NULL, L"SystemTrace.etl");
    if (TraceProperties == NULL) {
        Status = ERROR_OUTOFMEMORY;
        goto Exit;
    }

    TraceProperties->LogFileMode = EVENT_TRACE_FILE_MODE_SEQUENTIAL | EVENT_TRACE_SYSTEM_LOGGER_MODE;
    TraceProperties->MaximumFileSize = 100; // Limit file size to 100MB max
    TraceProperties->BufferSize = 512; // Use 512KB trace buffers
    TraceProperties->MinimumBuffers = 8;
    TraceProperties->MaximumBuffers = 64;

    Status = StartTraceW(&SessionHandle, LoggerName, TraceProperties);
    if (Status != ERROR_SUCCESS) {
        printf("StartTrace() failed with %lu\n", Status);
        goto Exit;
    }

    TraceStarted = TRUE;

    //
    // Enable the provider to a trace session with filtering enabled on the
    // provider
    //
    ZeroMemory(&EnableParameters, sizeof(EnableParameters));
    EnableParameters.Version = ENABLE_TRACE_PARAMETERS_VERSION_2;
    EnableParameters.EnableFilterDesc = &FilterDescriptor;
    EnableParameters.FilterDescCount = 1;

    Status = EnableTraceEx2(
        SessionHandle,
        &EXAMPLE_PROVIDER,
        EVENT_CONTROL_CODE_ENABLE_PROVIDER,
        TRACE_LEVEL_VERBOSE,
        0,
        0,
        0,
        &EnableParameters);
    if (Status != ERROR_SUCCESS) {
        printf("EnableTraceEx2() failed with %lu\n", Status);
        goto Exit;
    }

    //
    // Clean up the payload descriptor
    //
    Status = TdhCleanupPayloadEventFilterDescriptor(&FilterDescriptor);
    if (Status != ERROR_SUCCESS) {
        printf("TdhCleanupPayloadEventFilterDescriptor() failed with %lu\n", Status);
        goto Exit;
    }

    //
    // Collect trace for 30 seconds
    //
    Sleep(30 * 1000);

Exit:

    //
    // Stop tracing.
    //
    if (TraceStarted != FALSE) {
        Status = ControlTraceW(SessionHandle, NULL, TraceProperties, EVENT_TRACE_CONTROL_STOP);
        if (Status != ERROR_SUCCESS) {
            printf("StopTrace() failed with %lu\n", Status);
        }
    }

    if (TraceProperties != NULL) {
        FreeTraceProperties(TraceProperties);
    }

    TdhUnloadManifest((PWSTR)PATH_TO_MANIFEST_FILE);

    return Status;
}
出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

各言語での呼び出し定義

// ADVAPI32.dll
#include <windows.h>

WIN32_ERROR EnableTraceEx2(
    ULONGLONG TraceId,
    const GUID* ProviderId,
    DWORD ControlCode,
    BYTE Level,
    ULONGLONG MatchAnyKeyword,
    ULONGLONG MatchAllKeyword,
    DWORD Timeout,
    ENABLE_TRACE_PARAMETERS* EnableParameters   // optional
);
[DllImport("ADVAPI32.dll", ExactSpelling = true)]
static extern uint EnableTraceEx2(
    ulong TraceId,   // ULONGLONG
    ref Guid ProviderId,   // GUID*
    uint ControlCode,   // DWORD
    byte Level,   // BYTE
    ulong MatchAnyKeyword,   // ULONGLONG
    ulong MatchAllKeyword,   // ULONGLONG
    uint Timeout,   // DWORD
    IntPtr EnableParameters   // ENABLE_TRACE_PARAMETERS* optional
);
<DllImport("ADVAPI32.dll", ExactSpelling:=True)>
Public Shared Function EnableTraceEx2(
    TraceId As ULong,   ' ULONGLONG
    ByRef ProviderId As Guid,   ' GUID*
    ControlCode As UInteger,   ' DWORD
    Level As Byte,   ' BYTE
    MatchAnyKeyword As ULong,   ' ULONGLONG
    MatchAllKeyword As ULong,   ' ULONGLONG
    Timeout As UInteger,   ' DWORD
    EnableParameters As IntPtr   ' ENABLE_TRACE_PARAMETERS* optional
) As UInteger
End Function
' TraceId : ULONGLONG
' ProviderId : GUID*
' ControlCode : DWORD
' Level : BYTE
' MatchAnyKeyword : ULONGLONG
' MatchAllKeyword : ULONGLONG
' Timeout : DWORD
' EnableParameters : ENABLE_TRACE_PARAMETERS* optional
Declare PtrSafe Function EnableTraceEx2 Lib "advapi32" ( _
    ByVal TraceId As LongLong, _
    ByVal ProviderId As LongPtr, _
    ByVal ControlCode As Long, _
    ByVal Level As Byte, _
    ByVal MatchAnyKeyword As LongLong, _
    ByVal MatchAllKeyword As LongLong, _
    ByVal Timeout As Long, _
    ByVal EnableParameters As LongPtr) As Long
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。
import ctypes
from ctypes import wintypes

EnableTraceEx2 = ctypes.windll.advapi32.EnableTraceEx2
EnableTraceEx2.restype = wintypes.DWORD
EnableTraceEx2.argtypes = [
    ctypes.c_ulonglong,  # TraceId : ULONGLONG
    ctypes.c_void_p,  # ProviderId : GUID*
    wintypes.DWORD,  # ControlCode : DWORD
    ctypes.c_ubyte,  # Level : BYTE
    ctypes.c_ulonglong,  # MatchAnyKeyword : ULONGLONG
    ctypes.c_ulonglong,  # MatchAllKeyword : ULONGLONG
    wintypes.DWORD,  # Timeout : DWORD
    ctypes.c_void_p,  # EnableParameters : ENABLE_TRACE_PARAMETERS* optional
]
require 'fiddle'
require 'fiddle/import'

lib = Fiddle.dlopen('ADVAPI32.dll')
EnableTraceEx2 = Fiddle::Function.new(
  lib['EnableTraceEx2'],
  [
    -Fiddle::TYPE_LONG_LONG,  # TraceId : ULONGLONG
    Fiddle::TYPE_VOIDP,  # ProviderId : GUID*
    -Fiddle::TYPE_INT,  # ControlCode : DWORD
    -Fiddle::TYPE_CHAR,  # Level : BYTE
    -Fiddle::TYPE_LONG_LONG,  # MatchAnyKeyword : ULONGLONG
    -Fiddle::TYPE_LONG_LONG,  # MatchAllKeyword : ULONGLONG
    -Fiddle::TYPE_INT,  # Timeout : DWORD
    Fiddle::TYPE_VOIDP,  # EnableParameters : ENABLE_TRACE_PARAMETERS* optional
  ],
  -Fiddle::TYPE_INT)
#[link(name = "advapi32")]
extern "system" {
    fn EnableTraceEx2(
        TraceId: u64,  // ULONGLONG
        ProviderId: *const GUID,  // GUID*
        ControlCode: u32,  // DWORD
        Level: u8,  // BYTE
        MatchAnyKeyword: u64,  // ULONGLONG
        MatchAllKeyword: u64,  // ULONGLONG
        Timeout: u32,  // DWORD
        EnableParameters: *mut ENABLE_TRACE_PARAMETERS  // ENABLE_TRACE_PARAMETERS* optional
    ) -> u32;
}
// crates: windows-sys provides ready-made bindings for this API.
$sig = @"
[DllImport("ADVAPI32.dll")]
public static extern uint EnableTraceEx2(ulong TraceId, ref Guid ProviderId, uint ControlCode, byte Level, ulong MatchAnyKeyword, ulong MatchAllKeyword, uint Timeout, IntPtr EnableParameters);
"@
$api = Add-Type -MemberDefinition $sig -Name 'ADVAPI32_EnableTraceEx2' -Namespace Win32 -PassThru
# $api::EnableTraceEx2(TraceId, ProviderId, ControlCode, Level, MatchAnyKeyword, MatchAllKeyword, Timeout, EnableParameters)
#uselib "ADVAPI32.dll"
#func global EnableTraceEx2 "EnableTraceEx2" sptr, sptr, sptr, sptr, sptr, sptr, sptr, sptr
; EnableTraceEx2 TraceId, varptr(ProviderId), ControlCode, Level, MatchAnyKeyword, MatchAllKeyword, Timeout, varptr(EnableParameters)   ; 戻り値は stat
; TraceId : ULONGLONG -> "sptr"
; ProviderId : GUID* -> "sptr"
; ControlCode : DWORD -> "sptr"
; Level : BYTE -> "sptr"
; MatchAnyKeyword : ULONGLONG -> "sptr"
; MatchAllKeyword : ULONGLONG -> "sptr"
; Timeout : DWORD -> "sptr"
; EnableParameters : ENABLE_TRACE_PARAMETERS* optional -> "sptr"
; ※HSP3.7は int64 引数(64bit値渡し)に非対応です。
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。
出力引数:
#uselib "ADVAPI32.dll"
#cfunc global EnableTraceEx2 "EnableTraceEx2" int64, var, int, int, int64, int64, int, var
; res = EnableTraceEx2(TraceId, ProviderId, ControlCode, Level, MatchAnyKeyword, MatchAllKeyword, Timeout, EnableParameters)
; TraceId : ULONGLONG -> "int64"
; ProviderId : GUID* -> "var"
; ControlCode : DWORD -> "int"
; Level : BYTE -> "int"
; MatchAnyKeyword : ULONGLONG -> "int64"
; MatchAllKeyword : ULONGLONG -> "int64"
; Timeout : DWORD -> "int"
; EnableParameters : ENABLE_TRACE_PARAMETERS* optional -> "var"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
; ※int64 引数の DLL 値渡しは x64 ランタイム(hsp3_64)のみ対応(x86 は未対応)。
出力引数:
; WIN32_ERROR EnableTraceEx2(ULONGLONG TraceId, GUID* ProviderId, DWORD ControlCode, BYTE Level, ULONGLONG MatchAnyKeyword, ULONGLONG MatchAllKeyword, DWORD Timeout, ENABLE_TRACE_PARAMETERS* EnableParameters)
#uselib "ADVAPI32.dll"
#cfunc global EnableTraceEx2 "EnableTraceEx2" int64, var, int, int, int64, int64, int, var
; res = EnableTraceEx2(TraceId, ProviderId, ControlCode, Level, MatchAnyKeyword, MatchAllKeyword, Timeout, EnableParameters)
; TraceId : ULONGLONG -> "int64"
; ProviderId : GUID* -> "var"
; ControlCode : DWORD -> "int"
; Level : BYTE -> "int"
; MatchAnyKeyword : ULONGLONG -> "int64"
; MatchAllKeyword : ULONGLONG -> "int64"
; Timeout : DWORD -> "int"
; EnableParameters : ENABLE_TRACE_PARAMETERS* optional -> "var"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
import (
	"golang.org/x/sys/windows"
	"unsafe"
)

var (
	advapi32 = windows.NewLazySystemDLL("ADVAPI32.dll")
	procEnableTraceEx2 = advapi32.NewProc("EnableTraceEx2")
)

// TraceId (ULONGLONG), ProviderId (GUID*), ControlCode (DWORD), Level (BYTE), MatchAnyKeyword (ULONGLONG), MatchAllKeyword (ULONGLONG), Timeout (DWORD), EnableParameters (ENABLE_TRACE_PARAMETERS* optional)
r1, _, err := procEnableTraceEx2.Call(
	uintptr(TraceId),
	uintptr(ProviderId),
	uintptr(ControlCode),
	uintptr(Level),
	uintptr(MatchAnyKeyword),
	uintptr(MatchAllKeyword),
	uintptr(Timeout),
	uintptr(EnableParameters),
)
_ = err  // syscall.Errno (valid when the call sets last-error)
_ = r1   // WIN32_ERROR
function EnableTraceEx2(
  TraceId: UInt64;   // ULONGLONG
  ProviderId: PGUID;   // GUID*
  ControlCode: DWORD;   // DWORD
  Level: Byte;   // BYTE
  MatchAnyKeyword: UInt64;   // ULONGLONG
  MatchAllKeyword: UInt64;   // ULONGLONG
  Timeout: DWORD;   // DWORD
  EnableParameters: Pointer   // ENABLE_TRACE_PARAMETERS* optional
): DWORD; stdcall;
  external 'ADVAPI32.dll' name 'EnableTraceEx2';
result := DllCall("ADVAPI32\EnableTraceEx2"
    , "Int64", TraceId   ; ULONGLONG
    , "Ptr", ProviderId   ; GUID*
    , "UInt", ControlCode   ; DWORD
    , "UChar", Level   ; BYTE
    , "Int64", MatchAnyKeyword   ; ULONGLONG
    , "Int64", MatchAllKeyword   ; ULONGLONG
    , "UInt", Timeout   ; DWORD
    , "Ptr", EnableParameters   ; ENABLE_TRACE_PARAMETERS* optional
    , "UInt")   ; return: WIN32_ERROR
●EnableTraceEx2(TraceId, ProviderId, ControlCode, Level, MatchAnyKeyword, MatchAllKeyword, Timeout, EnableParameters) = DLL("ADVAPI32.dll", "dword EnableTraceEx2(qword, void*, dword, byte, qword, qword, dword, void*)")
# 呼び出し: EnableTraceEx2(TraceId, ProviderId, ControlCode, Level, MatchAnyKeyword, MatchAllKeyword, Timeout, EnableParameters)
# TraceId : ULONGLONG -> "qword"
# ProviderId : GUID* -> "void*"
# ControlCode : DWORD -> "dword"
# Level : BYTE -> "byte"
# MatchAnyKeyword : ULONGLONG -> "qword"
# MatchAllKeyword : ULONGLONG -> "qword"
# Timeout : DWORD -> "dword"
# EnableParameters : ENABLE_TRACE_PARAMETERS* optional -> "void*"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。
const std = @import("std");

extern "advapi32" fn EnableTraceEx2(
    TraceId: u64, // ULONGLONG
    ProviderId: [*c]GUID, // GUID*
    ControlCode: u32, // DWORD
    Level: u8, // BYTE
    MatchAnyKeyword: u64, // ULONGLONG
    MatchAllKeyword: u64, // ULONGLONG
    Timeout: u32, // DWORD
    EnableParameters: [*c]ENABLE_TRACE_PARAMETERS // ENABLE_TRACE_PARAMETERS* optional
) callconv(std.os.windows.WINAPI) u32;
proc EnableTraceEx2(
    TraceId: uint64,  # ULONGLONG
    ProviderId: ptr GUID,  # GUID*
    ControlCode: uint32,  # DWORD
    Level: uint8,  # BYTE
    MatchAnyKeyword: uint64,  # ULONGLONG
    MatchAllKeyword: uint64,  # ULONGLONG
    Timeout: uint32,  # DWORD
    EnableParameters: ptr ENABLE_TRACE_PARAMETERS  # ENABLE_TRACE_PARAMETERS* optional
): uint32 {.importc: "EnableTraceEx2", stdcall, dynlib: "ADVAPI32.dll".}
pragma(lib, "advapi32");
extern(Windows)
uint EnableTraceEx2(
    ulong TraceId,   // ULONGLONG
    GUID* ProviderId,   // GUID*
    uint ControlCode,   // DWORD
    ubyte Level,   // BYTE
    ulong MatchAnyKeyword,   // ULONGLONG
    ulong MatchAllKeyword,   // ULONGLONG
    uint Timeout,   // DWORD
    ENABLE_TRACE_PARAMETERS* EnableParameters   // ENABLE_TRACE_PARAMETERS* optional
);
ccall((:EnableTraceEx2, "ADVAPI32.dll"), stdcall, UInt32,
      (UInt64, Ptr{GUID}, UInt32, UInt8, UInt64, UInt64, UInt32, Ptr{ENABLE_TRACE_PARAMETERS}),
      TraceId, ProviderId, ControlCode, Level, MatchAnyKeyword, MatchAllKeyword, Timeout, EnableParameters)
# TraceId : ULONGLONG -> UInt64
# ProviderId : GUID* -> Ptr{GUID}
# ControlCode : DWORD -> UInt32
# Level : BYTE -> UInt8
# MatchAnyKeyword : ULONGLONG -> UInt64
# MatchAllKeyword : ULONGLONG -> UInt64
# Timeout : DWORD -> UInt32
# EnableParameters : ENABLE_TRACE_PARAMETERS* optional -> Ptr{ENABLE_TRACE_PARAMETERS}
# stdcall は 32bit のみ意味を持つ(x64 では無視)。
local ffi = require("ffi")
ffi.cdef[[
uint32_t EnableTraceEx2(
    uint64_t TraceId,
    void* ProviderId,
    uint32_t ControlCode,
    uint8_t Level,
    uint64_t MatchAnyKeyword,
    uint64_t MatchAllKeyword,
    uint32_t Timeout,
    void* EnableParameters);
]]
local advapi32 = ffi.load("advapi32")
-- advapi32.EnableTraceEx2(TraceId, ProviderId, ControlCode, Level, MatchAnyKeyword, MatchAllKeyword, Timeout, EnableParameters)
-- TraceId : ULONGLONG
-- ProviderId : GUID*
-- ControlCode : DWORD
-- Level : BYTE
-- MatchAnyKeyword : ULONGLONG
-- MatchAllKeyword : ULONGLONG
-- Timeout : DWORD
-- EnableParameters : ENABLE_TRACE_PARAMETERS* optional
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
const koffi = require('koffi');
const lib = koffi.load('ADVAPI32.dll');
const EnableTraceEx2 = lib.func('__stdcall', 'EnableTraceEx2', 'uint32_t', ['uint64_t', 'void *', 'uint32_t', 'uint8_t', 'uint64_t', 'uint64_t', 'uint32_t', 'void *']);
// EnableTraceEx2(TraceId, ProviderId, ControlCode, Level, MatchAnyKeyword, MatchAllKeyword, Timeout, EnableParameters)
// TraceId : ULONGLONG -> 'uint64_t'
// ProviderId : GUID* -> 'void *'
// ControlCode : DWORD -> 'uint32_t'
// Level : BYTE -> 'uint8_t'
// MatchAnyKeyword : ULONGLONG -> 'uint64_t'
// MatchAllKeyword : ULONGLONG -> 'uint64_t'
// Timeout : DWORD -> 'uint32_t'
// EnableParameters : ENABLE_TRACE_PARAMETERS* optional -> 'void *'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。
const lib = Deno.dlopen("ADVAPI32.dll", {
  EnableTraceEx2: { parameters: ["u64", "pointer", "u32", "u8", "u64", "u64", "u32", "pointer"], result: "u32" },
});
// lib.symbols.EnableTraceEx2(TraceId, ProviderId, ControlCode, Level, MatchAnyKeyword, MatchAllKeyword, Timeout, EnableParameters)
// TraceId : ULONGLONG -> "u64"
// ProviderId : GUID* -> "pointer"
// ControlCode : DWORD -> "u32"
// Level : BYTE -> "u8"
// MatchAnyKeyword : ULONGLONG -> "u64"
// MatchAllKeyword : ULONGLONG -> "u64"
// Timeout : DWORD -> "u32"
// EnableParameters : ENABLE_TRACE_PARAMETERS* optional -> "pointer"
// 文字列引数は "buffer"(NUL 終端のバイト列を Uint8Array で渡す)。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。
<?php
$ffi = FFI::cdef(<<<C
uint32_t EnableTraceEx2(
    uint64_t TraceId,
    void* ProviderId,
    uint32_t ControlCode,
    uint8_t Level,
    uint64_t MatchAnyKeyword,
    uint64_t MatchAllKeyword,
    uint32_t Timeout,
    void* EnableParameters);
C, "ADVAPI32.dll");
// $ffi->EnableTraceEx2(TraceId, ProviderId, ControlCode, Level, MatchAnyKeyword, MatchAllKeyword, Timeout, EnableParameters);
// TraceId : ULONGLONG
// ProviderId : GUID*
// ControlCode : DWORD
// Level : BYTE
// MatchAnyKeyword : ULONGLONG
// MatchAllKeyword : ULONGLONG
// Timeout : DWORD
// EnableParameters : ENABLE_TRACE_PARAMETERS* 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 EnableTraceEx2(
        long TraceId,   // ULONGLONG
        Pointer ProviderId,   // GUID*
        int ControlCode,   // DWORD
        byte Level,   // BYTE
        long MatchAnyKeyword,   // ULONGLONG
        long MatchAllKeyword,   // ULONGLONG
        int Timeout,   // DWORD
        Pointer EnableParameters   // ENABLE_TRACE_PARAMETERS* optional
    );
}
@[Link("advapi32")]
lib LibADVAPI32
  fun EnableTraceEx2 = EnableTraceEx2(
    TraceId : UInt64,   # ULONGLONG
    ProviderId : GUID*,   # GUID*
    ControlCode : UInt32,   # DWORD
    Level : UInt8,   # BYTE
    MatchAnyKeyword : UInt64,   # ULONGLONG
    MatchAllKeyword : UInt64,   # ULONGLONG
    Timeout : UInt32,   # DWORD
    EnableParameters : ENABLE_TRACE_PARAMETERS*   # ENABLE_TRACE_PARAMETERS* optional
  ) : UInt32
end
# 構造体/GUID/enum は lib 内に対応する型定義が必要。
# 呼出規約: x64 は規約統一のため OK。x86(32bit)は WINAPI=stdcall だが Crystal の fun に stdcall 付与構文がなく非対応。
import 'dart:ffi';
import 'package:ffi/ffi.dart';

typedef EnableTraceEx2Native = Uint32 Function(Uint64, Pointer<Void>, Uint32, Uint8, Uint64, Uint64, Uint32, Pointer<Void>);
typedef EnableTraceEx2Dart = int Function(int, Pointer<Void>, int, int, int, int, int, Pointer<Void>);
final EnableTraceEx2 = DynamicLibrary.open('ADVAPI32.dll')
    .lookupFunction<EnableTraceEx2Native, EnableTraceEx2Dart>('EnableTraceEx2');
// TraceId : ULONGLONG -> Uint64
// ProviderId : GUID* -> Pointer<Void>
// ControlCode : DWORD -> Uint32
// Level : BYTE -> Uint8
// MatchAnyKeyword : ULONGLONG -> Uint64
// MatchAllKeyword : ULONGLONG -> Uint64
// Timeout : DWORD -> Uint32
// EnableParameters : ENABLE_TRACE_PARAMETERS* optional -> Pointer<Void>
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。
{$mode objfpc}{$H+}
function EnableTraceEx2(
  TraceId: UInt64;   // ULONGLONG
  ProviderId: PGUID;   // GUID*
  ControlCode: DWORD;   // DWORD
  Level: Byte;   // BYTE
  MatchAnyKeyword: UInt64;   // ULONGLONG
  MatchAllKeyword: UInt64;   // ULONGLONG
  Timeout: DWORD;   // DWORD
  EnableParameters: Pointer   // ENABLE_TRACE_PARAMETERS* optional
): DWORD; stdcall;
  external 'ADVAPI32.dll' name 'EnableTraceEx2';
import Foreign
import Foreign.C.Types
import Foreign.C.String

foreign import stdcall safe "EnableTraceEx2"
  c_EnableTraceEx2 :: Word64 -> Ptr () -> Word32 -> Word8 -> Word64 -> Word64 -> Word32 -> Ptr () -> IO Word32
-- TraceId : ULONGLONG -> Word64
-- ProviderId : GUID* -> Ptr ()
-- ControlCode : DWORD -> Word32
-- Level : BYTE -> Word8
-- MatchAnyKeyword : ULONGLONG -> Word64
-- MatchAllKeyword : ULONGLONG -> Word64
-- Timeout : DWORD -> Word32
-- EnableParameters : ENABLE_TRACE_PARAMETERS* optional -> Ptr ()
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。
open Ctypes
open Foreign

let enabletraceex2 =
  foreign "EnableTraceEx2"
    (uint64_t @-> (ptr void) @-> uint32_t @-> uint8_t @-> uint64_t @-> uint64_t @-> uint32_t @-> (ptr void) @-> returning uint32_t)
(* TraceId : ULONGLONG -> uint64_t *)
(* ProviderId : GUID* -> (ptr void) *)
(* ControlCode : DWORD -> uint32_t *)
(* Level : BYTE -> uint8_t *)
(* MatchAnyKeyword : ULONGLONG -> uint64_t *)
(* MatchAllKeyword : ULONGLONG -> uint64_t *)
(* Timeout : DWORD -> uint32_t *)
(* EnableParameters : ENABLE_TRACE_PARAMETERS* 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 ("EnableTraceEx2" enable-trace-ex2 :convention :stdcall) :uint32
  (trace-id :uint64)   ; ULONGLONG
  (provider-id :pointer)   ; GUID*
  (control-code :uint32)   ; DWORD
  (level :uint8)   ; BYTE
  (match-any-keyword :uint64)   ; ULONGLONG
  (match-all-keyword :uint64)   ; ULONGLONG
  (timeout :uint32)   ; DWORD
  (enable-parameters :pointer))   ; ENABLE_TRACE_PARAMETERS* optional
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。
use Win32::API;
my $EnableTraceEx2 = Win32::API::More->new('ADVAPI32',
    'DWORD EnableTraceEx2(UINT64 TraceId, LPVOID ProviderId, DWORD ControlCode, BYTE Level, UINT64 MatchAnyKeyword, UINT64 MatchAllKeyword, DWORD Timeout, LPVOID EnableParameters)');
# my $ret = $EnableTraceEx2->Call($TraceId, $ProviderId, $ControlCode, $Level, $MatchAnyKeyword, $MatchAllKeyword, $Timeout, $EnableParameters);
# TraceId : ULONGLONG -> UINT64
# ProviderId : GUID* -> LPVOID
# ControlCode : DWORD -> DWORD
# Level : BYTE -> BYTE
# MatchAnyKeyword : ULONGLONG -> UINT64
# MatchAllKeyword : ULONGLONG -> UINT64
# Timeout : DWORD -> DWORD
# EnableParameters : ENABLE_TRACE_PARAMETERS* optional -> LPVOID
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。

関連項目

類似 API
使用する型