如何从Microsoft-Windows-NDIS-PacketCapture提供程序使用实时ETW事件?

更大的问题是如何使用实时ETWnetworking堆栈事件,但我对Microsoft-Windows-NDIS-PacketCapture提供者特别感兴趣。 所有其他networking堆栈提供程序部分工作,但NDIS-PacketCapture(NDIS-PC)根本不工作,所以这可能是我可以问的最简单的问题。

我使用下面的代码作为基础,修改很less,它实时工作: http : //msdn.microsoft.com/en-us/library/windows/desktop/ee441325(v=vs.85)的.aspx

我所做的更改是:

  1. 在做任何事情之前,调用StartTrace启动NDIS-PC会话。 在属性struct EVENT_TRACE_PROPERTIES中,设置LogFileMode = EVENT_TRACE_REAL_TIME_MODE,LogFileNameOffset = 0,Wnode.Guid =我制作的随机GUID。

  2. 调用状态= EnableTraceEx2(hSession,&Current_Guid,EVENT_CONTROL_CODE_ENABLE_PROVIDER,TRACE_LEVEL_VERBOSE,0,0,0,NULL); 其中hSession是使用StartTrace和Current_Guid开始的会话

    {0x2ED6006E,0x4729,0x4609,{0xB4,0x23,0x3E,0xE7,0xBC,0xD6,0x78,0xEF}};

  3. 然后用LoggerName =一些宽string调用OpenTrace,LogFileName = NULL,LogFileMode = EVENT_TRACE_REAL_TIME_MODE;

  4. 最后在上面刚刚打开的跟踪句柄上调用ProcessTrace。

  5. 同样,将所有其他内容与MSDN示例中提供的相同

使用相同的代码与提供程序的单个更改,如微软Windows Winsock AFD或微软Windows TCPIP 让我调用我定义的loggingcallback(但是,我仍然无法检索属性,但我不会进一步深入,但要保持这个概率尽可能简单)。 当我使用NDIS-PC时,我得到0callback。 我已经尝试使用ControlTrace手动刷新没有任何成功。 我也试着定义“EventCallback”,而不是“EventRecordCallback”,没有成功。

我查看了这个过程中涉及到的所有数据结构,并在每个提供者之间进行了比较,他们看起来都是正确的。 我查看了函数和返回数据结构的所有返回值,而且他们在我尝试的提供者之间看起来也是一样的。

我已经通过调用“logman”My Trace Session 04“-ets”来查看会话属性,它对于NDIS-PC和TCPIP看起来是相同的:

C:\ windows \ system32> logman“我的跟踪会话04”-ets

名称:我的跟踪会议04状态:
运行根path:%systemdrive%\ PerfLogs \ Admin Segment:
closures时间表:开

名称:我的跟踪会话04 \我的跟踪会话04types:
追踪追加:closures循环:closures覆盖:
关缓冲区大小:64个缓冲区丢失:0个缓冲区写入:0个缓冲区刷新定时器:1个时钟types:性能文件模式:实时

提供程序:名称:Microsoft-Windows-NDIS-PacketCapture提供程序指导:{2ED6006E-4729-4609-B423-3EE7BCD678EF}级别:
5(win:Verbose)关键字:0x0关键字:
0xffffffffffffffff(Ethernet802.3,WirelessWAN,Tunnel,Nativ e802.11,PacketStart,PacketEnd,ut:SendPath,ut:接收path,ut:L3ConnectPath,ut:L2C onnectPath,ut:closurespath,ut:authentication,ut:configuration,ut:全局,ut:丢弃,ut:PiiPresent,ut:数据包,ut:地址,ut:StdTemplateHint,ut:StateTransition,win:Res ponseTime,Microsoft-Windows-NDIS-PacketCapture / Diagnostic,0x2,0x4,0x8,0x10,0x20 ,0x40,0x80,0x100,0x400,0x800,0x1000,0x2000,0x4000,0x20000,0x40000,0x80000,0x10000,0,0×200000,0x400000,0x800000,0x1000000,0x2000000,0x4000000,0x8000000,0x10000000,0x20000000,0x400000000000,0x800000000000,0x2000000000000, 0x4000000000000,0x80000 00000000,0×10000000000000,0x20000000000000,0x40000000000000,0x80000000000000,0x100000000000000,0x200000000000000,0x400000000000000x800000000000000,0x1000000000000000,0x2000000000000000,0x4000000000000000)属性:0filtertypes:0

命令成功完成。

我也尝试使用logman手动启动会话,只是在代码中打开它来处理,但是这对我也不起作用。 我也试图只写入一个ETL文件,这也不起作用。 还有更多的东西我尝试过,但没有任何工作。

我已经吞噬了与实时ETW消耗(MSDN,谷歌search,Stackoverflow等)有关的互联网上的一切,我还没有看到一个完整的实时ETW事件消耗的例子 。 所有示例都显示ETL文件中的事件消耗,或者将logging的事件导出到ETL文件,然后只是进行一些参数更改以实现实时消耗。 我相信我上面总结的代码更改反映了这些更改。

我在使用VS2010 SP1创build32位控制台应用程序的Win7旗舰版。 我也尝试创build64位应用程序没有改善。

Follwing两个post是相关的,但是当我尝试/强制执行时对我没有任何影响。 在实时模式下,代码将会话名称复制到属性的结尾,并且日志文件偏移量无论如何都需要为0。 我不认为我有任何alignment问题,所有其他供应商工作得很好:

Windows ETW:内核使用者未收到EventCallback或BufferCallback事件 Windows ETW:StartTrace失败,错误87(ERROR_INVALID_PARAMETER)

我觉得我错过了一些微不足道的东西,这应该正常的。 我会很感激任何帮助。

如果你看看“netsh trace”命令在内部做了什么,你会看到他们将一个NDIS轻量级过滤器驱动程序附加到各种网络接口上。 只有使用此过滤器,您才能从此提供商那里获得活动。 这个设施的细节是无证的,可能会改变。 netsh trace命令的所有逻辑都在nettrace.dll中实现,您可以在Microsoft公共符号的帮助下进行反向工程。 具体而言,CInboxCapture类具有确定驱动程序是否已启动的代码,将其绑定到适当的网络接口并启动它。 如果以nettrace.dll的方式启动捕获过滤器驱动程序,您将获得您的数据包捕获事件。

祝你好运。

对于它的价值,我确实找到了一个实时ETW消费者的例子(这个例子是针对IIS web服务器的): http : //blogs.iis.net/eokim/archive/2009/05/15/consume-iis -etw-tracing.aspx

这是一个注释的c ++示例应用程序,它演示了同时进行数据包捕获和内核事件的实时ETW会话。

https://github.com/packetzero/etwrealtime

而不是运行netsh跟踪启动等,你可以试试这个:

net start ndiscap 

当运行netsh跟踪等,它会为你做这个,我认为这是缺少的一部分,被注入ndis捕获数据包(即etw提供者)的轻量级过滤器驱动程序没有运行和发射事件。

完成后,您可以使用以下命令停止它:

 net stop ndiscap