Partager via


Configuration et démarrage de la session de l’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 la structure EVENT_TRACE_PROPERTIES pour spécifier les événements du 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 d’enregistreur d’événements de 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és, 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 Global Logger, consultez Configuration et démarrage de la session Global Logger.

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

L’exemple suivant montre comment configurer et démarrer une session NT Kernel Logger qui collecte les événements de 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 enregistreur privé

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

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