Atualizando uma sessão de rastreamento de eventos
Para atualizar as propriedades de uma sessão de rastreamento de eventos, chame a função ControlTrace usando o código de controle EVENT_TRACE_CONTROL_UPDATE . Você pode especificar a sessão a ser atualizada usando um identificador de sessão obtido de uma chamada anterior para StartTrace ou um nome de sessão. As propriedades da sessão de rastreamento de eventos são atualizadas usando os valores especificados na estrutura EVENT_TRACE_PROPERTIES . Você pode atualizar apenas um subconjunto das propriedades. Para obter uma lista das propriedades que você pode atualizar, consulte o parâmetro Propriedades da função ControlTrace .
Se a chamada ControlTrace for bem-sucedida, a estrutura EVENT_TRACE_PROPERTIES será atualizada para refletir os novos valores de propriedade. A estrutura também conterá as novas estatísticas de execução para a sessão de rastreamento de eventos.
O exemplo a seguir mostra como atualizar a sessão de rastreamento de eventos do kernel. O exemplo consulta os valores de propriedade atuais e atualiza a estrutura antes de atualizar a sessão.
#include <windows.h>
#include <stdio.h>
#include <wmistr.h>
#include <evntrace.h>
#define MAX_SESSION_NAME_LEN 1024
#define MAX_LOGFILE_PATH_LEN 1024
void wmain(void)
{
ULONG status = ERROR_SUCCESS;
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.
// This example specifies the maximum size for the session name
// and log file name.
BufferSize = sizeof(EVENT_TRACE_PROPERTIES) +
(MAX_SESSION_NAME_LEN * sizeof(WCHAR)) +
(MAX_LOGFILE_PATH_LEN * sizeof(WCHAR));
pSessionProperties = (EVENT_TRACE_PROPERTIES*) malloc(BufferSize);
if (NULL == pSessionProperties)
{
wprintf(L"Unable to allocate %d bytes for properties structure.\n", BufferSize);
goto cleanup;
}
ZeroMemory(pSessionProperties, BufferSize);
pSessionProperties->Wnode.BufferSize = BufferSize;
// Query for the kernel trace session's current property values.
status = ControlTrace((TRACEHANDLE)NULL, KERNEL_LOGGER_NAME, pSessionProperties, EVENT_TRACE_CONTROL_QUERY);
if (ERROR_SUCCESS != status)
{
if (ERROR_WMI_INSTANCE_NOT_FOUND == status)
{
wprintf(L"The Kernel Logger is not running.\n");
}
else
{
wprintf(L"ControlTrace(query) failed with %lu\n", status);
}
goto cleanup;
}
// Update the enable flags to also enable the Process and Thread providers.
pSessionProperties->LogFileNameOffset = 0; // Zero tells ETW not to update the file name
pSessionProperties->Wnode.Flags = WNODE_FLAG_TRACED_GUID;
pSessionProperties->EnableFlags |= EVENT_TRACE_FLAG_PROCESS | EVENT_TRACE_FLAG_THREAD;
// Update the session's properties.
status = ControlTrace((TRACEHANDLE)NULL, KERNEL_LOGGER_NAME, pSessionProperties, EVENT_TRACE_CONTROL_UPDATE);
if (ERROR_SUCCESS != status)
{
wprintf(L"ControlTrace(update) failed with %lu.\n", status);
goto cleanup;
}
wprintf(L"\nUpdated session");
cleanup:
if (pSessionProperties)
{
free(pSessionProperties);
pSessionProperties = NULL;
}
}
Tópicos relacionados