访问与使用 TraceLoggingWrite 提供的事件关联的用户数据

Access user data associated with event provided using TraceLoggingWrite

本文关键字:事件 关联 用户数 数据 用户 TraceLoggingWrite 访问      更新时间:2023-10-16

我能够使用此方法从我的应用程序生成跟踪日志记录事件(能够在Windows性能分析器中查看它们(。 发出的事件如下

HRESULT CTracelogger::PublishEvent(void *pData)
{
if (pData)
{
EVENT_H sHEvent = *(static_cast<EVENT_H *>(pData));
TraceLoggingWrite(g_hEventProvider,
"HEvent",
TraceLoggingStruct(5, "HEventData"),
TraceLoggingUInt32(sHEvent.m_eEventType, "eEventType"),
TraceLoggingUInt32(sHEvent.m_uiVersion, "Version"),
TraceLoggingUInt32(sHEvent.m_uiPid, "Pid"),
TraceLoggingUInt32(sHEvent.m_uiSize, "Size"),
TraceLoggingWideString(sHEvent.m_wszHName, "HName")
);
}
return S_OK;
}

我正在尝试通过编写自定义使用者在不同的应用程序中使用相同的事件,使用者正在接收事件(因为正在接收相应的提供程序 GUID 事件(。我正在尝试使用 TdhGetProperty(( 访问与事件关联的用户数据,如此处的文档所示,但如果变量缓冲区大小初始化为 0,函数 TdhGetEventInformation(( 失败并ERROR_NOT_FOUND,如果缓冲区大小初始化为非零值,则失败并显示错误ERROR_INVALID_PARAMETER。

采用上述方法来检索与跟踪日志记录事件关联的数据是否正确? 如果是,那么为什么 TdhGetEventInformation(( 失败了?

VOID WINAPI CEventLogger::EventRecordCallback(PEVENT_RECORD pEvent)
{
DWORD status = ERROR_SUCCESS;
PTRACE_EVENT_INFO pInfo = NULL;
char msgbuf[4096];
DWORD BufferSize = 0;

status = TdhGetEventInformation(pEvent, 0, nullptr, pInfo, &BufferSize);
if (ERROR_INSUFFICIENT_BUFFER == status)
{
pInfo = (TRACE_EVENT_INFO*)malloc(BufferSize);
if (pInfo == NULL)
{
OutputDebugString("Failed to allocate memory for event info");
status = ERROR_OUTOFMEMORY;
return;
}
else
{
OutputDebugString("successful memory allocation");
}
// Retrieve the event metadata.
status = TdhGetEventInformation(pEvent, 0, nullptr, pInfo, &BufferSize);
}
if (ERROR_SUCCESS != status)
{
sprintf_s(msgbuf, "TdhGetEventInformation failed status[%d], buffersize[%d]", status, BufferSize);
OutputDebugString(msgbuf);
}
else
{
sprintf_s(msgbuf, "TdhGetEventInformation successful, buffersize[%d]", BufferSize);
OutputDebugString(msgbuf);
}
}

上面的代码看起来很合理。我的猜测是问题出在您调用OpenTrace上。默认情况下(为了向后兼容非常旧的代码(,OpenTrace 假定您的回调想要接收EVENT_TRACE结构。但是,您的回调希望收到EVENT_RECORD。要告诉 OpenTrace 使用较新的EVENT_RECORD格式,您必须将ProcessTraceMode设置为PROCESS_TRACE_MODE_EVENT_RECORD