我有一个 ETL 文件,我正在尝试使用 OpenTrace 解析它,并在收到回调 EventRecordCallback 时使用 TdhGetEventInformation 获取信息。
但是,对于我需要的提供者,它总是返回 1168(未找到)。它工作的唯一方法是使用 TdhLoadManifest 加载清单,这样我就可以获得所有信息。但我不明白 WPA 和 PerfView 如何为我的提供者获取所有事件,即使我没有提供清单......
我发现 TDH.dll 有一些 PerfView 使用的未记录函数,例如 TdhGetAllEventsInformation,我尝试通过使用 LoadLibraryEx 加载 DLL 来使用此函数,该函数再次返回 1168..
以下代码主要来自 Microsoft 示例:
DWORD status = ERROR_SUCCESS;
DWORD BufferSize = 0;
status = TdhGetEventInformation(pEvent, 0, nullptr, pInfo, &BufferSize);
if (1168 == status)
return status; // THIS
if (ERROR_INSUFFICIENT_BUFFER == status)
{
pInfo = (TRACE_EVENT_INFO*)malloc(BufferSize);
ZeroMemory(pInfo, BufferSize);
if (pInfo == NULL)
{
LogPrintError(L"Failed to allocate memory for event info (size=%lu).\n", BufferSize);
status = ERROR_OUTOFMEMORY;
goto cleanup;
}
// Retrieve the event metadata.
status = TdhGetEventInformation(pEvent, 0, NULL, pInfo, &BufferSize);
}
我真的很想知道 PerfView 如何在没有清单的情况下获取这些信息。到目前为止,我看到他们使用 TdhGetAllEventsInformation 但我一直收到 1168,我错过了什么?
谢谢。