Share via


Actualización de una sesión de seguimiento de eventos

Para actualizar las propiedades de una sesión de seguimiento de eventos, llame a la función ControlTrace mediante el código de control EVENT_TRACE_CONTROL_UPDATE . Puede especificar la sesión que se va a actualizar mediante un identificador de sesión obtenido de una llamada anterior a StartTrace o un nombre de sesión. Las propiedades de la sesión de seguimiento de eventos se actualizan con los valores especificados en la estructura EVENT_TRACE_PROPERTIES . Solo puede actualizar un subconjunto de las propiedades. Para obtener una lista de las propiedades que puede actualizar, consulte el parámetro Properties de la función ControlTrace .

Si la llamada a ControlTrace se realiza correctamente, la estructura de EVENT_TRACE_PROPERTIES se actualiza para reflejar los nuevos valores de propiedad. La estructura también contendrá las nuevas estadísticas de ejecución para la sesión de seguimiento de eventos.

En el ejemplo siguiente se muestra cómo actualizar la sesión de seguimiento de eventos de kernel. En el ejemplo se consultan los valores de propiedad actuales y se actualiza la estructura antes de actualizar la sesión.

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

Configuración e inicio de una sesión de registrador privado

Configuración e inicio de una sesión de SystemTraceProvider

Configuración e inicio de una sesión de AutoLogger

Configuración e inicio de una sesión de seguimiento de eventos

Configuración e inicio de la sesión del registrador de kernel de NT