Partager via


Mise à jour d’une session de suivi des événements

Pour mettre à jour les propriétés d’une session de suivi d’événements, appelez la fonction ControlTrace à l’aide du code de contrôle EVENT_TRACE_CONTROL_UPDATE . Vous pouvez spécifier la session à mettre à jour à l’aide d’un handle de session obtenu à partir d’un appel antérieur à StartTrace ou d’un nom de session. Les propriétés de la session de suivi des événements sont mises à jour à l’aide des valeurs spécifiées dans la structure EVENT_TRACE_PROPERTIES . Vous ne pouvez mettre à jour qu’un sous-ensemble des propriétés. Pour obtenir la liste des propriétés que vous pouvez mettre à jour, consultez le paramètre Properties de la fonction ControlTrace .

Si l’appel ControlTrace réussit, la structure EVENT_TRACE_PROPERTIES est mise à jour pour refléter les nouvelles valeurs de propriété. La structure contiendra également les nouvelles statistiques d’exécution pour la session de suivi d’événements.

L’exemple suivant montre comment mettre à jour la session de suivi des événements du noyau. L’exemple interroge les valeurs de propriété actuelles et met à jour la structure avant de mettre à jour la session.

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

Configuration et démarrage d’une session d’enregistreur d’événements privés

Configuration et démarrage d’une session SystemTraceProvider

Configuration et démarrage d’une session AutoLogger

Configuration et démarrage d’une session de suivi d’événements

Configuration et démarrage de la session d’enregistreur d’événements du noyau NT