NT カーネル ロガー セッションの構成と開始

NT カーネル ロガー セッションは、定義済みのカーネル イベントのセットを記録するイベント トレース セッションです。 カーネル プロバイダーを有効にするために EnableTrace 関数を呼び出す必要はありません。 代わりに、 構造体の EnableFlags メンバー EVENT_TRACE_PROPERTIES 使用して、受信するカーネル イベントを指定します。 StartTrace 関数は、カーネル プロバイダーを有効にするために指定した有効化フラグを使用します。

NT カーネル ロガー セッションは 1 つだけです。 セッションが既に使用されている場合、 StartTrace 関数はERROR_ALREADY_EXISTSを返します。

イベント トレース セッションの開始の詳細については、「イベント トレース セッションの 構成と開始」を参照してください。

プライベート ロガー セッションの開始の詳細については、「プライベート ロガー セッションの 構成と開始」を参照してください。

グローバル ロガー セッションの開始の詳細については、「グローバル ロガー セッションの 構成と開始」を参照してください。

自動ロガー セッションの開始の詳細については、「自動ロガー セッションの 構成と開始」を参照してください。

次の例では、ネットワーク TCP/IP カーネル イベントを収集し、5 MB の循環ファイルに書き込む NT カーネル ロガー セッションを構成して開始する方法を示します。

#define INITGUID  // Include this #define to use SystemTraceControlGuid in Evntrace.h.

#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <strsafe.h>
#include <wmistr.h>
#include <evntrace.h>

#define LOGFILE_PATH L"<FULLPATHTOTHELOGFILE.etl>"

void wmain(void)
{
    ULONG status = ERROR_SUCCESS;
    TRACEHANDLE SessionHandle = 0;
    EVENT_TRACE_PROPERTIES* pSessionProperties = NULL;
    ULONG BufferSize = 0;

    // Allocate memory for the session properties. The memory must
    // be large enough to include the log file name and session name,
    // which get appended to the end of the session properties structure.
    
    BufferSize = sizeof(EVENT_TRACE_PROPERTIES) + sizeof(LOGFILE_PATH) + sizeof(KERNEL_LOGGER_NAME);
    pSessionProperties = (EVENT_TRACE_PROPERTIES*) malloc(BufferSize);    
    if (NULL == pSessionProperties)
    {
        wprintf(L"Unable to allocate %d bytes for properties structure.\n", BufferSize);
        goto cleanup;
    }
    
    // Set the session properties. You only append the log file name
    // to the properties structure; the StartTrace function appends
    // the session name for you.

    ZeroMemory(pSessionProperties, BufferSize);
    pSessionProperties->Wnode.BufferSize = BufferSize;
    pSessionProperties->Wnode.Flags = WNODE_FLAG_TRACED_GUID;
    pSessionProperties->Wnode.ClientContext = 1; //QPC clock resolution
    pSessionProperties->Wnode.Guid = SystemTraceControlGuid; 
    pSessionProperties->EnableFlags = EVENT_TRACE_FLAG_NETWORK_TCPIP;
    pSessionProperties->LogFileMode = EVENT_TRACE_FILE_MODE_CIRCULAR;
    pSessionProperties->MaximumFileSize = 5;  // 5 MB
    pSessionProperties->LoggerNameOffset = sizeof(EVENT_TRACE_PROPERTIES);
    pSessionProperties->LogFileNameOffset = sizeof(EVENT_TRACE_PROPERTIES) + sizeof(KERNEL_LOGGER_NAME); 
    StringCbCopy((LPWSTR)((char*)pSessionProperties + pSessionProperties->LogFileNameOffset), sizeof(LOGFILE_PATH), LOGFILE_PATH);

    // Create the trace session.

    status = StartTrace((PTRACEHANDLE)&SessionHandle, KERNEL_LOGGER_NAME, pSessionProperties);

    if (ERROR_SUCCESS != status)
    {
        if (ERROR_ALREADY_EXISTS == status)
        {
            wprintf(L"The NT Kernel Logger session is already in use.\n");
        }
        else
        {
            wprintf(L"EnableTrace() failed with %lu\n", status);
        }

        goto cleanup;
    }

    wprintf(L"Press any key to end trace session ");
    _getch();

cleanup:

    if (SessionHandle)
    {
        status = ControlTrace(SessionHandle, KERNEL_LOGGER_NAME, pSessionProperties, EVENT_TRACE_CONTROL_STOP);

        if (ERROR_SUCCESS != status)
        {
            wprintf(L"ControlTrace(stop) failed with %lu\n", status);
        }
    }

    if (pSessionProperties)
        free(pSessionProperties);
}

プライベート ロガー セッションの構成と開始

SystemTraceProvider セッションの構成と開始

自動ロガー セッションの構成と開始

イベント トレース セッションの構成と開始

イベント トレース セッションの更新