C# 在TraceProcessor中公开引导时间

C# 在TraceProcessor中公开引导时间,c#,etw,.net-traceprocessing,C#,Etw,.net Traceprocessing,我看到Microsoft.Windows.EventTracing.Interop.Metadata.NativeTraceLogfileHeader包含引导时间值。这在某些情况下可能有用。是否有可能通过iTraceMatadata接口公开或以其他方式访问 // Microsoft.Windows.EventTracing.Metadata.ITraceMetadata using Microsoft.Windows.EventTracing; public interface ITraceM

我看到Microsoft.Windows.EventTracing.Interop.Metadata.NativeTraceLogfileHeader包含引导时间值。这在某些情况下可能有用。是否有可能通过iTraceMatadata接口公开或以其他方式访问

// Microsoft.Windows.EventTracing.Metadata.ITraceMetadata
using Microsoft.Windows.EventTracing;

public interface ITraceMetadata
{
    Version OSVersion
    bool Is32Bit
    FrequencyValue ProcessorSpeed
    TraceClockType ClockType
    FrequencyValue PerformanceCounterFrequency
    TraceTimestampValue? ReferenceTimestampValue
    FrequencyValue ProcessorUsageTimerFrequency
    TraceTimestamp FirstAnalyzerDisplayedEventTime
    TraceTimestamp LastEventTime
    TraceDuration AnalyzerDisplayedDuration    
    long LostBufferCount
    long LostEventCount
    string TracePath
    DateTimeOffset StartTime    
    DateTimeOffset StopTime    
    int ProcessorCount    
    int KernelEventVersion
}

我将让当前的团队成员回答可以进行哪些更改。从概念上讲,在v1api发布之前,我认为将这些数据添加到itracematadata是有意义的

我不记得将此数据添加到API中的任何其他内容中。我检查了ISystemMetadata,但没有在那里看到它。我所知道的唯一解决方法是使用/IFilteredEventConsumer解析包含此数据的事件的有效负载,我认为它始终是跟踪中的第一个事件,不管该事件具有什么ProviderId/Id;我一时想不起来了

如果我没记错的话,有效载荷就是这个。 但请注意,该事件有32位和64位版本,因为其中的LoggerName/LogFileName指针基于跟踪的位,而不是处理跟踪的机器的位

编辑:

下面是一个通过跟踪头事件获取引导时间的示例exe。我使用的是trace.Use,但IFilteredEventConsumer是等效的

使用Microsoft.Windows.EventTracing; 使用制度; 使用System.Runtime.InteropServices; 班级计划 { 静态整型字符串[]args { 如果参数长度!=1 { Console.Error.WriteLineUsage:GetTraceBootTime.exe; 返回1; } 字符串tracePath=args[0]; 使用ITraceProcessor trace=TraceProcessor.CreatetracePath { DateTime?引导时间=null; Guid eventTraceProviderId=new Guid68fdd900-4a3e-11d1-84f4-0000f80464e3; trace.Usenew[]{eventTraceProviderId},e=> { 如果e.Event.Id!=0 | | e.Event.Version!=2 { 回来 } var数据=e.Event.data; 时间长; 如果e.Event.is32位 { 如果data.Length