Skip to content

Instantly share code, notes, and snippets.

@renanalencar
Created December 20, 2023 11:18
Show Gist options
  • Save renanalencar/511d8ed2010a1c4b42a938d3b8c84583 to your computer and use it in GitHub Desktop.
Save renanalencar/511d8ed2010a1c4b42a938d3b8c84583 to your computer and use it in GitHub Desktop.
Como escrever logs ETW (Event Trace for Windows) em arquivo ETL (Event Trace Log) em C++.
#include <windows.h>
#include <evntprov.h>
#include <stdio.h>
// Define o GUID para o provedor de eventos customizado
DEFINE_GUID(MyProviderId,
0x12345678, 0x1234, 0x5678, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF);
// Manipulador para a sessão de rastreamento
TRACEHANDLE g_hSession;
// Função para registrar eventos
void LogEvent(const wchar_t* message) {
EVENT_TRACE_HEADER traceHeader = { 0 };
traceHeader.Size = sizeof(EVENT_TRACE_HEADER);
traceHeader.Flags = WNODE_FLAG_TRACED_GUID;
EVENT_INSTANCE_INFO instanceInfo = { 0 };
instanceInfo.Size = sizeof(EVENT_INSTANCE_INFO);
// Cria um evento
TraceEvent(g_hSession, (PEVENT_TRACE_HEADER)&traceHeader);
EventWrite(MyProviderId, // GUID do provedor
&instanceInfo, // informações adicionais do evento
1, // número de eventos
&traceHeader, // cabeçalho do evento
sizeof(message), // tamanho do dado adicional
&message); // dado adicional (neste caso, a mensagem)
}
int main() {
// Configuração da sessão de rastreamento
EVENT_TRACE_PROPERTIES traceProperties = { 0 };
traceProperties.Wnode.BufferSize = sizeof(EVENT_TRACE_PROPERTIES);
traceProperties.Wnode.Flags = WNODE_FLAG_TRACED_GUID;
traceProperties.Wnode.ClientContext = 1; // Use this context to specify the log file
traceProperties.LogFileMode = EVENT_TRACE_FILE_MODE_SEQUENTIAL;
// Defina o nome do arquivo ETL
wcsncpy_s(traceProperties.LogFileName, MAX_PATH, L"MyTrace.etl", MAX_PATH);
// Inicialização da sessão de rastreamento
ULONG status = StartTrace(&g_hSession, L"MyTraceSession", &traceProperties);
if (status != ERROR_SUCCESS) {
printf("Falha ao iniciar a sessão de rastreamento (%lu)\n", status);
return 1;
}
// Registro do provedor de eventos
status = EventRegister(&MyProviderId, NULL, NULL, &g_hSession);
if (status != ERROR_SUCCESS) {
printf("Falha ao registrar o provedor de eventos (%lu)\n", status);
return 1;
}
// Log de eventos de exemplo
LogEvent(L"Log de evento de exemplo 1");
LogEvent(L"Log de evento de exemplo 2");
// Encerramento da sessão de rastreamento
status = ControlTrace(g_hSession, L"MyTraceSession", &traceProperties, EVENT_TRACE_CONTROL_STOP);
if (status != ERROR_SUCCESS) {
printf("Falha ao encerrar a sessão de rastreamento (%lu)\n", status);
return 1;
}
// Encerramento do provedor de eventos
EventUnregister();
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment