Condividi tramite


Aggiornamento di una sessione di traccia eventi

Per aggiornare le proprietà di una sessione di traccia eventi, chiamare la funzione ControlTrace usando il codice del controllo EVENT_TRACE_CONTROL_UPDATE . È possibile specificare la sessione da aggiornare usando un handle di sessione ottenuto da una chiamata precedente a StartTrace o un nome di sessione. Le proprietà della sessione di traccia eventi vengono aggiornate utilizzando i valori specificati nella struttura EVENT_TRACE_PROPERTIES . È possibile aggiornare solo un subset delle proprietà. Per un elenco delle proprietà che è possibile aggiornare, vedere il parametro Properties della funzione ControlTrace .

Se la chiamata ControlTrace ha esito positivo, la struttura EVENT_TRACE_PROPERTIES viene aggiornata in modo da riflettere i nuovi valori della proprietà. La struttura conterrà anche le nuove statistiche di esecuzione per la sessione di traccia eventi.

Nell'esempio seguente viene illustrato come aggiornare la sessione di traccia eventi del kernel. Nell'esempio vengono eseguite query per i valori delle proprietà correnti e viene aggiornata la struttura prima di aggiornare la sessione.

#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;
    }
}

Configurazione e avvio di una sessione di logger privato

Configurazione e avvio di una sessione SystemTraceProvider

Configurazione e avvio di una sessione autoLogger

Configurazione e avvio di una sessione di traccia eventi

Configurazione e avvio della sessione del logger del kernel NT