Мне нужно начать сеанс регистрации, когда мое приложение запускается. Я написал протоколирование функций init / deinit, файл * .etl создан, но после сессии он пуст. Я использую трассировку WPP (как для ядра, так и для пользовательского пространства). Я не могу понять, что я сделал не так. Я прочитал много статей и документов об этом API, но не смог найти решение.
Я использую флаг VERBOSE для записи всего, что связано с моим приложением, также я определяю guid для сеанса трассировки (ToolSessionGuid) и GUID, связанный с моим приложением (GUID_APP).
Вот моя реализация функций Init / deinit:
void traceLoggerDeinit(TRACEHANDLE* sessionHandle, EVENT_TRACE_PROPERTIES* sessionProperties) {
if (!sessionHandle)
return;
if (*sessionHandle) {
uint64_t retval = EnableTraceEx2(*sessionHandle, (GUID*)&GUID_APP, EVENT_CONTROL_CODE_DISABLE_PROVIDER, TRACE_LEVEL_INFORMATION, 0, 0, 0, NULL);
if (retval != ERROR_SUCCESS)
traceErr("Failed to disable trace, error %llu", retval);
retval = ControlTrace(*sessionHandle, LOGSESSION_NAME, sessionProperties, EVENT_TRACE_CONTROL_STOP);
if (retval != ERROR_SUCCESS)
traceErr("Failed to stop trace, error %llu", retval);
}
sessionHandle = nullptr;
}
uint64_t traceLoggerInit(TRACEHANDLE* sessionHandle, EVENT_TRACE_PROPERTIES* sessionProperties, uint32_t bufferSize)
{
sessionProperties->Wnode.BufferSize = bufferSize;
sessionProperties->Wnode.Flags = WNODE_FLAG_TRACED_GUID;
sessionProperties->Wnode.ClientContext = 1;
sessionProperties->Wnode.Guid = ToolSessionGuid;
sessionProperties->LogFileMode = EVENT_TRACE_FILE_MODE_SEQUENTIAL;
sessionProperties->MaximumFileSize = 1;
sessionProperties->LoggerNameOffset = sizeof(EVENT_TRACE_PROPERTIES);
sessionProperties->LogFileNameOffset = sizeof(EVENT_TRACE_PROPERTIES) + sizeof(LOGSESSION_NAME);
StringCbCopy((wchar_t*)((char*)sessionProperties + sessionProperties->LogFileNameOffset), sizeof(LOGFILE_PATH), LOGFILE_PATH);
uint64_t retval = StartTrace((TRACEHANDLE*)sessionHandle, LOGSESSION_NAME, sessionProperties);
if (retval == ERROR_ALREADY_EXISTS) {
traceErr("Trace logging already enabled. Disabling and enabling again");
return ERROR_ALREADY_EXISTS;
}
if (retval != ERROR_SUCCESS) {
traceErr("StartTrace() failed, error %llu", retval);
return -1;
}
retval = EnableTraceEx2(*sessionHandle, (GUID*)&GUID_APP, EVENT_CONTROL_CODE_ENABLE_PROVIDER, TRACE_LEVEL_VERBOSE, 0, 0, 0, NULL);
if (retval != ERROR_SUCCESS) {
traceErr("EnableTrace() failed, error %llu", retval);
return -1;
}
return 0;
}
В основной функции я инициализирую структуру и дескриптор:
uint32_t size = sizeof(EVENT_TRACE_PROPERTIES) + sizeof(LOGFILE_PATH) + sizeof(LOGSESSION_NAME) + 1024 * sizeof(wchar_t);
TRACEHANDLE sessionHandle = 0;
EVENT_TRACE_PROPERTIES* sessionProperties = (EVENT_TRACE_PROPERTIES*)malloc(size);
if (!sessionProperties) {
traceErr("Unable to allocate %lu bytes for properties structure", size);
return -1;
}
memset(sessionProperties, 0, size);
uint64_t retVal = traceLoggerInit(&sessionHandle, sessionProperties, size);
if (retVal == ERROR_ALREADY_EXISTS) {
traceLoggerDeinit(&sessionHandle, sessionProperties);
retVal = traceLoggerInit(&sessionHandle, sessionProperties, size);
if (retVal != 0) {
traceErr("Failed to enable trace Logging");
traceLoggerDeinit(&sessionHandle, sessionProperties);
free(sessionProperties);
return -1;
}
}
if (retVal != 0) {
traceErr("Failed to enable trace Logging");
traceLoggerDeinit(&sessionHandle, sessionProperties);
free(sessionProperties);
return -1;
}
Затем выполните некоторые действия с трассировкой wpp и закройте сеанс с помощью функции deinit:
Задача ещё не решена.
Других решений пока нет …