De NT-kernelloggersessie configureren en starten
De NT Kernel Logger-sessie is een sessie voor gebeurtenistracering waarmee een vooraf gedefinieerde set kernelgebeurtenissen wordt vastgelegd. U roept de functie EnableTrace niet aan om de kernelproviders in te schakelen. In plaats daarvan gebruikt u de EnableFlags lid van EVENT_TRACE_PROPERTIES structuur om de kernel-gebeurtenissen op te geven die u wilt ontvangen. De functie StartTrace gebruikt de inschakelende vlaggen die u opgeeft om de kernelproviders in te schakelen.
Er is slechts één NT Kernel Logger-sessie. Als de sessie al in gebruik is, retourneert de functie StartTrace ERROR_ALREADY_EXISTS.
Zie Een sessie voor gebeurtenistracering configureren en startenvoor meer informatie over het starten van een sessie voor gebeurtenistracering.
Zie Een privéloggersessie configureren en startenvoor meer informatie over het starten van een privéloggersessie.
Zie De algemene logboekregistratiesessie configureren en startenvoor meer informatie over het starten van een globale logboekregistratiesessie.
Zie Een AutoLogger-sessie configureren en startenvoor meer informatie over het starten van een AutoLogger-sessie.
In het volgende voorbeeld ziet u hoe u een NT Kernel Logger-sessie configureert en start die netwerk-TCP/IP-kernelgebeurtenissen verzamelt en schrijft naar een 5 MB-kringbestand.
#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);
}
Verwante onderwerpen