我有兴趣让自定义 ETW 事件显示Start Time和End Time,就像一些默认的 Windows 事件一样,以便以甘特图形式呈现它,如下所示:
我已经破解了Bruce Dawson 的演示清单和多提供程序文件,以将开始时间和结束时间字段添加到事件模板之一。
但是,我什至无法将该字段识别为时间字段。
我按照Microsoft 规范中的描述为事件有效负载编写模板,如下所示
<data inType="win:FILETIME" outType="xs:dateTime" name="Start Time" />
<data inType="win:FILETIME" outType="xs:dateTime" name="End Time" />
并相应地转换我的 QueryPerformanceCounter 变量:
//start is LARGE_INTEGER
//end is LARGE_INTEGER
FILETIME ftStart;
ftStart.dwLowDateTime = start.LowPart;
ftStart.dwHighDateTime = start.HighPart;
FILETIME ftEnd;
ftEnd.dwLowDateTime = end.LowPart;
ftEnd.dwHighDateTime = end.HighPart;
WPA 在相关字段中显示“无法解析数据”:
然后我查看Microsoft WPA 文档:
如果图形是甘特图,则移动到图形元素区域的每一列都必须仅包含时间戳值。甘特图中水平条中的一个标记代表一个时间戳值。
因此,我查看并看到时间戳只是 LARGE_INT,所以我回到原始格式并像这样编写清单:
<data inType="win:UInt64" outType="win:ETWTIME" name="Start Time" />
<data inType="win:UInt64" outType="win:ETWTIME" name="End Time" />
然后数据以大量纳秒而不是时间的形式呈现。而且我无法将任一字段选择为“开始时间”或“结束时间”。
我究竟做错了什么?