ETW主要包括3个component:Controller, Provider, and Consumer.
Controller的主要任务有两个:
一是,用StartTrace在内存中创建一个event trace session。刚创建时,这个session是没有跟任何provider关联的,也就不会任何数据被写到这个session的buffer中,,当然这一步也是可以完成关联的,那就是把StartTrace的参数Wnode.Guid member of Properties设置为provider id.问题:(Wnode.Guid什么时候应该设置,应该设置为什么值??)
二是,启动(API: EnableTrace)和停止(API: ControlTrace)Provider(它是使用Provider的GUID来区分不同的provider的)。Controller的第二个任务就是为了避免额外的开销,Provider不会一直都在工作,只有当被Enable的时候,才开始工作(注:其实这么说是不正确的,Provider其实是不必受Controller控制的,它可以随时随地发送trace,只要它知道那个event trace session的句柄,这完全取决于Provider具体是怎么写的。但在实际操作上,Provider都是根据Controller的Enable/Disable信号来启动和停止tracing的。)
第二个是Consumer,Consumer主要做这几件事:
1. 用OpenTrace打开和event trace session之间的通道。
2. 设计event trace callback,你可以设计一个generic的callback用来handle所有的event trace,不管是不是你感兴趣的。你也可以为特定的event trace设计callback,专门处理你关心的trace。Generic的callback实在OpenTrace的时候在参数中指定的,而特定的callback可以用SetTraceCallback来注册。
3. 调用ProcessTrace,开始处理Trace。