Compartir a través de


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

La sesión del registrador de kernel de NT es una sesión de seguimiento de eventos que registra un conjunto predefinido de eventos de kernel. No se llama a la función EnableTrace para habilitar los proveedores de kernel. En su lugar, use el miembro EnableFlags de EVENT_TRACE_PROPERTIES estructura para especificar los eventos de kernel que desea recibir. La función StartTrace usa las marcas de habilitación que especifique para habilitar los proveedores de kernel.

Solo hay una sesión de registrador de kernel de NT. Si la sesión ya está en uso, la función StartTrace devuelve ERROR_ALREADY_EXISTS.

Para obtener más información sobre cómo iniciar una sesión de seguimiento de eventos, consulte Configuración e inicio de una sesión de seguimiento de eventos.

Para obtener más información sobre cómo iniciar una sesión de registrador privado, consulte Configuración e inicio de una sesión de registrador privado.

Para obtener más información sobre cómo iniciar una sesión de registrador global, consulte Configuring and Starting the Global Logger Session.

Para obtener más información sobre cómo iniciar una sesión de AutoLogger, consulte Configuring and Starting an AutoLogger Session.

En el ejemplo siguiente se muestra cómo configurar e iniciar una sesión de registrador de kernel nt que recopila eventos de kernel TCP/IP de red y los escribe en un archivo circular de 5 MB.

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

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

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