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

Com*_*Guy 9 windows network-programming etw

更大的问题是如何一般消费实时ETW网络堆栈事件,但我对Microsoft-Windows-NDIS-PacketCapture提供商特别感兴趣.所有其他网络堆栈提供程序部分工作,但NDIS-PacketCapture(NDIS-PC)根本不起作用,所以这可能是我在这里可以提出的最简单的问题.

我使用以下代码作为基础并进行了很少修改以使其实时工作: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. 调用status = 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 =一些宽字符串,LogFileName = NULL和LogFileMode = EVENT_TRACE_REAL_TIME_MODE调用OpenTrace;

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

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

使用相同的代码只需将提供程序更改为其他任何内容(如Microsoft-Windows-Winsock-AFD或Microsoft-Windows-TCPIP),即可调用我已定义的记录回调(但是,我仍然无法检索属性,但我不会进一步深入研究这个问题尽可能简单).当我使用NDIS-PC时,我得到0回调.我已经尝试使用ControlTrace手动刷新而没有任何成功.我也尝试过定义"EventCallback"而不是"EventRecordCallback"但没有成功.

我查看了此过程中涉及的所有数据结构,并在每个提供程序之间进行了比较,它们看起来都正确且相同.我查看了函数和返回数据结构的所有返回值,它们在我尝试过的提供程序之间看起来也是一样的.

我通过调用"logman"我的跟踪会话04"-ets"来查看会话属性,它看起来与NDIS-PC和TCPIP相同:

C:\ windows\system32> logman"My Trace Session 04"-ets

名称:我的跟踪会话04状态:
运行根路径:%systemdrive%\ PerfLogs\Admin Segment:
Off Schedules:On

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

提供者:名称:Microsoft-Windows-NDIS-PacketCapture Provider Guid:{2ED6006E-4729-4609-B423-3EE7BCD678EF}级别:
5(win:Verbose)Keywords所有:0x0 KeywordsAny:
0xffffffffffffffffff(Ethernet802.3,WirelessWAN,Tunnel,Nativ e802) .11,PacketStart,PacketEnd,ut:SendPath,ut:ReceivePath,ut:L3ConnectPath,ut:L2C onnectPath,ut:ClosePath,ut:Authentication,ut:Configuration,ut:Global,ut:Dropped,ut:PiiPresent,ut: Packet,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,0x200000,0x400000,0x800000,0x1000000,0x2000000,0x4000000,0x8000000,0x10000000,0x20000000,0x400000000000,0x800000000000,0x2000000000000,0x4000000000000,0x80000 00000000,0x10000000000000,0x20000000000000,0x40000000000000,0x80000000000000 ,0x1 00000000000000,0x200000000000000,0x400000000000000,0x800000000000000,0x100000000 0000000,0x2000000000000000,0x4000000000000000)Prope rties:0过滤器类型:0

命令成功完成.

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

我已经吞噬了与实时ETW消费(MSDN,谷歌搜索,Stackoverflow等)有关的互联网上的一切,我还没有看到一个完整的实时ETW事件消耗示例.所有示例都显示来自ETL文件的事件消耗或将记录的事件导出到ETL文件,然后只是说要进行一些参数更改以使实时消耗工作.我相信上面总结的代码更改反映了这些变化.

我在Win7 Ultimate上使用VS2010 SP1创建32位控制台应用程序.我也试过创建64位应用程序而没有任何改进.

Follwing两个帖子是相关的,但在我尝试/执行时对我没有任何影响.在实时模式中,代码将会话名称复制到属性结构的末尾,并且日志文件偏移量无论如何都需要为0.我不认为我有任何对齐问题,因为所有其他提供程序工作得很好:

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

我觉得我错过了一些小而微不足道的东西,这应该有用的.我很感激任何帮助.

小智 10

如果您查看"netsh trace"命令在内部执行的操作,您会看到它们将NDIS轻量级过滤器驱动程序附加到各种网络接口.只有附加并激活了此过滤器,您才能从此提供程序获取事件.该设施的详细信息没有记录,可能会有变化.netsh trace命令的所有逻辑都在nettrace.dll中实现,您可以借助Microsoft的公共符号进行反向工程.具体来说,CInboxCapture类具有确定驱动程序是否已启动的代码,将其绑定到适当的网络接口并启动它.如果以nettrace.dll的方式启动捕获筛选器驱动程序,您将获得数据包捕获事件.

祝好运.