Freigeben über


Aktualisieren einer Ereignisablaufverfolgungssitzung

Um die Eigenschaften einer Ereignisablaufverfolgungssitzung zu aktualisieren, rufen Sie die ControlTrace-Funktion mithilfe des EVENT_TRACE_CONTROL_UPDATE-Steuerelementcodes auf. Sie können die zu aktualisierende Sitzung mithilfe eines Sitzungshandles angeben, das sie aus einem früheren Aufruf von StartTrace abgerufen hat, oder einen Sitzungsnamen. Die Eigenschaften der Ereignisablaufverfolgungssitzung werden mithilfe der in der EVENT_TRACE_PROPERTIES-Struktur angegebenen Werte aktualisiert. Sie können nur eine Teilmenge der Eigenschaften aktualisieren. Eine Liste der Eigenschaften, die Sie aktualisieren können, finden Sie im Properties-Parameter der ControlTrace-Funktion .

Wenn der ControlTrace-Aufruf erfolgreich ist, wird die EVENT_TRACE_PROPERTIES-Struktur aktualisiert, um die neuen Eigenschaftswerte widerzuspiegeln. Die -Struktur enthält auch die neue Ausführungsstatistik für die Ereignisablaufverfolgungssitzung.

Das folgende Beispiel zeigt, wie die Kernelereignisablaufverfolgungssitzung aktualisiert wird. Im Beispiel werden die aktuellen Eigenschaftswerte abfragt und die Struktur aktualisiert, bevor die Sitzung aktualisiert wird.

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

#define MAX_SESSION_NAME_LEN 1024
#define MAX_LOGFILE_PATH_LEN 1024

void wmain(void)
{
    ULONG status = ERROR_SUCCESS;
    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.
    // This example specifies the maximum size for the session name 
    // and log file name.
    
    BufferSize = sizeof(EVENT_TRACE_PROPERTIES) + 
        (MAX_SESSION_NAME_LEN * sizeof(WCHAR)) + 
        (MAX_LOGFILE_PATH_LEN * sizeof(WCHAR));

    pSessionProperties = (EVENT_TRACE_PROPERTIES*) malloc(BufferSize);    
    if (NULL == pSessionProperties)
    {
        wprintf(L"Unable to allocate %d bytes for properties structure.\n", BufferSize);
        goto cleanup;
    }
    
    ZeroMemory(pSessionProperties, BufferSize);
    pSessionProperties->Wnode.BufferSize = BufferSize;

    // Query for the kernel trace session's current property values.

    status = ControlTrace((TRACEHANDLE)NULL, KERNEL_LOGGER_NAME, pSessionProperties, EVENT_TRACE_CONTROL_QUERY);

    if (ERROR_SUCCESS != status)
    {
        if (ERROR_WMI_INSTANCE_NOT_FOUND == status)
        {
            wprintf(L"The Kernel Logger is not running.\n");
        }
        else
        {
            wprintf(L"ControlTrace(query) failed with %lu\n", status);
        }

        goto cleanup;
    }

    // Update the enable flags to also enable the Process and Thread providers.

    pSessionProperties->LogFileNameOffset = 0;  // Zero tells ETW not to update the file name
    pSessionProperties->Wnode.Flags = WNODE_FLAG_TRACED_GUID;
    pSessionProperties->EnableFlags |= EVENT_TRACE_FLAG_PROCESS | EVENT_TRACE_FLAG_THREAD;

    // Update the session's properties.

    status = ControlTrace((TRACEHANDLE)NULL, KERNEL_LOGGER_NAME, pSessionProperties, EVENT_TRACE_CONTROL_UPDATE);
    if (ERROR_SUCCESS != status)
    {
        wprintf(L"ControlTrace(update) failed with %lu.\n", status);
        goto cleanup;
    }

    wprintf(L"\nUpdated session");

cleanup:

    if (pSessionProperties)
    {
        free(pSessionProperties);
        pSessionProperties = NULL;
    }
}

Konfigurieren und Starten einer privaten Protokollierungssitzung

Konfigurieren und Starten einer SystemTraceProvider-Sitzung

Konfigurieren und Starten einer AutoLogger-Sitzung

Konfigurieren und Starten einer Ereignisablaufverfolgungssitzung

Konfigurieren und Starten der NT-Kernelprotokollierungssitzung