更大的问题是如何一般消费实时ETW网络堆栈事件,但我对 Microsoft-Windows-NDIS-PacketCapture提供商特别感兴趣。所有其他网络堆栈提供程序部分工作,但NDIS-PacketCapture(NDIS-PC)根本不起作用,所以这可能是我在这里可以提出的最简单的问题。
我使用以下代码作为基础并进行了很少修改以使其实时工作: http://msdn.microsoft.com/en-us/library/windows/desktop/ee441325(v=vs.85).aspx
我所做的更改是:
在执行任何操作之前,请调用StartTrace以启动NDIS-PC会话 其他。在属性struct EVENT_TRACE_PROPERTIES中,设置 LogFileMode = EVENT_TRACE_REAL_TIME_MODE,LogFileNameOffset = 0, 和Wnode.Guid =我编写的随机GUID。
调用status = EnableTraceEx2(hSession,& Current_Guid, EVENT_CONTROL_CODE_ENABLE_PROVIDER,TRACE_LEVEL_VERBOSE,0,0,0, 空值);其中hSession是使用StartTrace启动的会话 和Current_Guid是
{0x2ED6006E,0x4729,0x4609,{0xB4,0x23,0x3E,0xE7,0xBC,0xD6,0x78,0xEF}};
然后用LoggerName调用OpenTrace =一些宽字符串, LogFileName = NULL,LogFileMode = EVENT_TRACE_REAL_TIME_MODE;
最后在刚刚打开的跟踪句柄上调用ProcessTrace 上方。
同样,将其他所有内容保留为MSDN示例中提供的内容
使用相同的代码只需更改一次提供商,就可以使用其他任何内容,例如Microsoft-Windows-Winsock-AFD或Microsoft-Windows-TCPIP 让我接听电话我定义的记录回调(但是,我仍然无法检索属性,但我还没有进一步深入研究这个问题,尽可能简单)。当我使用NDIS-PC时,我得到0回调。我尝试使用ControlTrace手动刷新但没有任何成功。我也尝试过定义" EventCallback"而不是" EventRecordCallback"没有成功。
我查看了此流程中涉及的所有数据结构,并在每个提供商之间进行了比较,但它们看起来都是正确且相同的。我查看了函数和返回数据结构中的所有返回值,并且我们尝试过的提供程序之间的返回值也相同。
我通过调用" logman" My Trace Session 04"来查看会话属性。 -ets" NDIS-PC和TCPIP看起来相同:
C:\ windows \ system32> logman" My Trace Session 04" -ets
名称:我的跟踪会话04状态:
运行根路径:%systemdrive%\ PerfLogs \ Admin Segment:
关闭时间表:开启名称:我的跟踪会话04 \我的跟踪会话04类型:
跟踪附加:关闭循环:关闭覆盖:
关闭缓冲区大小:64个缓冲区丢失:0缓冲区写入: 0缓冲器冲洗定时器:1时钟类型:性能文件模式: 实时提供商:名称:Microsoft-Windows-NDIS-PacketCapture 提供者指南:{2ED6006E-4729-4609-B423-3EE7BCD678EF}级别:
5(win:Verbose)KeywordsAll:0x0 KeywordsAny:
0xffffffffffffffff(Ethernet802.3,WirelessWAN,Tunnel,Nativ e802.11,PacketStart,PacketEnd,UT:SendPath,UT:ReceivePath,UT:L3ConnectPath,UT:L2C onnectPath,UT:ClosePath,UT:身份验证,UT:配置方面,UT:全球通,UT:落下, UT:PiiPresent,UT:分组,UT:地址,UT:StdTemplateHint,UT:StateTransition,赢:RES ponseTime,微软的Windows编程,网络抓包/诊断,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)属性:0 过滤器类型:0命令成功完成。
我还尝试使用logman手动启动会话,只是在代码中打开它来处理,但这对我来说也不起作用。我也尝试过只写一个ETL文件而且也无法工作。还有很多我尝试过但没有任何工作的东西。
我已经吞噬了与实时ETW消费(MSDN,谷歌搜索,Stackoverflow等)有关的互联网上的一切,而且我还没有看到一个完整的真实例子时间ETW事件消耗。所有示例都显示来自ETL文件的事件消耗或将记录的事件导出到ETL文件,然后只是说要进行一些参数更改以使实时消耗工作。我相信上面总结的代码更改反映了这些变化。
我在Win7 Ultimate上使用VS2010 SP1创建32位控制台应用程序。我也试过创建64位应用程序而没有任何改进。
掌握两个帖子是相关的,但在我尝试/执行时对我没有任何影响。在实时模式中,代码将会话名称复制到属性结构的末尾,并且日志文件偏移量无论如何都需要为0。我不认为我有任何对齐问题,因为所有其他提供商都工作正常:
Windows ETW: Kernel consumer receives no EventCallback or BufferCallback events Windows ETW: StartTrace failing with error 87 (ERROR_INVALID_PARAMETER)
我觉得我错过了一些小而微不足道的事情,这应该只是工作。我很感激任何帮助。
答案 0 :(得分:10)
如果您查看“netsh trace”命令在内部执行的操作,您会看到它们将NDIS轻量级过滤器驱动程序附加到各种网络接口。只有附加并激活此过滤器,您才能从此提供程序获取事件。该设施的详细信息没有记录,可能会有变化。 netsh trace命令的所有逻辑都在nettrace.dll中实现,您可以借助Microsoft的公共符号进行反向工程。具体来说,CInboxCapture类具有确定驱动程序是否已启动的代码,将其绑定到适当的网络接口并启动它。如果以nettrace.dll的方式启动捕获筛选器驱动程序,您将获得数据包捕获事件。
祝你好运。答案 1 :(得分:2)
对于它的价值,我确实找到了一个实时ETW使用者的例子(该示例适用于IIS Web服务器):http://blogs.iis.net/eokim/archive/2009/05/15/consume-iis-etw-tracing.aspx
答案 2 :(得分:1)
这是一个注释的c ++示例应用程序,它演示了数据包捕获和内核事件的同步实时ETW会话。
答案 3 :(得分:0)
您可以尝试这样做,而不是运行netsh trace start等。
net start ndiscap
当运行netsh trace等时,它会为你做这个,我认为这里缺少部分,注入ndis以捕获数据包的轻量级过滤器驱动程序(即etw提供程序)不是跑步和发射事件。
完成后,您可以使用以下命令停止:
net stop ndiscap