如何使用来自 Microsoft-Windows-NDIS-PacketCapture 提供程序的实时 ETW 事件?
Posted
技术标签:
【中文标题】如何使用来自 Microsoft-Windows-NDIS-PacketCapture 提供程序的实时 ETW 事件?【英文标题】:How to consume real-time ETW events from the Microsoft-Windows-NDIS-PacketCapture provider? 【发布时间】:2012-03-17 05:28:16 【问题描述】:更大的问题是一般如何使用实时 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 会话 别的。在属性结构 EVENT_TRACE_PROPERTIES 中,设置 LogFileMode = EVENT_TRACE_REAL_TIME_MODE,LogFileNameOffset = 0, 和 Wnode.Guid = 我编造的随机 GUID。
调用状态 = 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 段: 关闭时间表:开启
名称:我的跟踪会话 04\我的跟踪会话 04 类型: 跟踪追加:关闭循环:关闭覆盖: 关闭缓冲区大小:64 个缓冲区丢失:0 个缓冲区写入: 0 缓冲区刷新定时器:1 时钟类型:性能文件模式: 实时
提供者:名称: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:ReceivePath,ut:L3ConnectPath,ut:L2C onnectPath,ut:ClosePath,ut:Authentication,ut:Configuration,ut:Global,ut:Dropped, ut:PiiPresent,ut:Packet,ut:Address,ut:StdTemplateHint,ut:StateTransition,win:Res ponseTime,Microsoft-Windows-NDIS-PacketCapture/诊断,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 文件,但这也不起作用。我尝试了很多其他方法,但没有任何效果。
我已经浏览了 Internet 上与实时 ETW 消费有关的所有内容(MSDN、Google 搜索、*** 等),但我还没有看到一个完整的实时 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)
我觉得我错过了一些小而琐碎的事情,这应该只是工作。如有任何帮助,我将不胜感激。
【问题讨论】:
【参考方案1】:如果您查看“netsh trace”命令在内部执行的操作,您会发现它们将 NDIS 轻量级过滤器驱动程序附加到各种网络接口。只有附加并激活了这个过滤器,你才能从这个提供者那里得到事件。该设施的详细信息未记录在案,可能会发生变化。 netsh 跟踪命令的所有逻辑都在 nettrace.dll 中实现,您可以在 Microsoft 的公共符号的帮助下对其进行逆向工程。具体来说,CInboxCapture 类具有确定驱动程序是否已启动、将其绑定到适当的网络接口并启动它的代码。如果您以 nettrace.dll 的方式启动捕获过滤器驱动程序,您将获得数据包捕获事件。
祝你好运。
【讨论】:
嗨,我已经通过运行“netsh trace start capture=yes”然后运行我的程序来验证这一点。我现在正在接收 NDIS-PC 事件!但是,在我的 EventRecordCallback 函数中,对传入的 PEVENT_RECORD 结构的 TdhGetEventInformation 调用每次都失败并出现 ERROR_NOT_FOUND ...感谢您的帮助! 多亏了这篇文章,我才明白了这一点:social.msdn.microsoft.com/Forums/en-US/etw/thread/… 对此有更多想法(使用 Microsoft-NDIS-PacketCapture 提供程序时没有事件回调)我正在尝试使用这段代码blogs.msdn.microsoft.com/vancem/2013/03/09/…。尝试从外部启动 netsh 跟踪但仍然没有输出?【参考方案2】:不管怎样,我确实找到了一个实时 ETW 消费者的示例(该示例用于 IIS Web 服务器):http://blogs.iis.net/eokim/archive/2009/05/15/consume-iis-etw-tracing.aspx
【讨论】:
【参考方案3】:这是一个带注释的 c++ 示例应用程序,它演示了用于数据包捕获和内核事件的同步实时 ETW 会话。
https://github.com/packetzero/etwrealtime
【讨论】:
【参考方案4】:你可以试试这个,而不是运行 netsh trace start 等:
net start ndiscap
运行 netsh trace 等时,它会为您执行此操作,我认为这是这里缺少的部分,即注入 ndis 以捕获数据包的轻量级过滤器驱动程序(即 etw 提供程序)未运行并发出事件.
完成后,您可以使用以下命令停止它:
net stop ndiscap
【讨论】:
以上是关于如何使用来自 Microsoft-Windows-NDIS-PacketCapture 提供程序的实时 ETW 事件?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用社交框架呈现来自 SKscene 的 UIViewController?
如何知道请求是不是来自缓存或不使用 AFNetworking
如何使用 RestTemplate 在 Spring MVC 应用程序中访问来自(来自 Spring RESTful 服务)的巨大 JSON