Partager via


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

La session NT Kernel Logger est une session de suivi d’événements qui enregistre un ensemble prédéfini d’événements de noyau. Vous n’appelez pas la fonction EnableTrace pour activer les fournisseurs de noyau. Au lieu de cela, vous utilisez le membre EnableFlags de EVENT_TRACE_PROPERTIES structure pour spécifier les événements de noyau que vous souhaitez recevoir. La fonction StartTrace utilise les indicateurs d’activation que vous spécifiez pour activer les fournisseurs de noyau.

Il n’existe qu’une seule session de l’enregistreur d’événements du noyau NT. Si la session est déjà utilisée, la fonction StartTrace retourne ERROR_ALREADY_EXISTS.

Pour plus d’informations sur le démarrage d’une session de suivi d’événements, consultez Configuration et démarrage d’une session de suivi d’événements.

Pour plus d’informations sur le démarrage d’une session d’enregistreur d’événements privé, consultez Configuration et démarrage d’une session d’enregistreur d’événements privés.

Pour plus d’informations sur le démarrage d’une session d’enregistreur d’événements globaux, consultez Configuration et démarrage de la session d’enregistreur d’événements globaux.

Pour plus d’informations sur le démarrage d’une session AutoLogger, consultez Configuration et démarrage d’une session de journal automatique.

L’exemple suivant montre comment configurer et démarrer une session NT Kernel Logger qui collecte les événements du noyau TCP/IP réseau et les écrit dans un fichier circulaire de 5 Mo.

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

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 de journal automatique

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

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