1

我有一个 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,我错过了什么?

谢谢。

4

0 回答 0