NDIS LWF 驱动程序导致网络堆栈中的 WFP 驱动程序出现问题?

Posted

技术标签:

【中文标题】NDIS LWF 驱动程序导致网络堆栈中的 WFP 驱动程序出现问题?【英文标题】:NDIS LWF driver causing issues for WFP drivers in the network stack? 【发布时间】:2021-12-01 20:23:10 【问题描述】:

我编写了一个 NDIS LWF 驱动程序,它收集发送/接收数据包,并将它们发送给用户服务,用户服务标记那些是 OK,然后我们指示/发送那些标记为 OK 的数据包。请注意,我们首先在 LWF 回调中使用 NdisFSendNetBufferListComplete(在发送的情况下)和 NdisFIndicateREceiveNetBufferLists(在接收的情况下),然后我们将数据包发送给用户,最后我们发送/指示那些标记为 OK。

但我注意到,这导致 Windows 10 的任务管理器在进程选项卡中显示每个进程的网络使用率为 0%,即使它们不是 0%。当我关闭驱动程序时,它会得到修复。

但奇怪的是,他在性能->以太网选项卡和资源监控程序中都没有出现,而且它们都显示了实际的网络使用情况。

那么是什么原因造成的,为什么资源监视器和网络选项卡仍然可以看到网络使用情况?我认为这与资源监视器可能使用 NDIS 过滤器和进程选项卡中的网络使用情况正在使用 WFP 的事实有关,但我不确定。

【问题讨论】:

【参考方案1】:

您的司机是否致电NdisCopySendNetBufferListInfoNdisCopyRecieveNetBufferListInfo

确实使用 WFP 标注来跟踪每个应用的记帐。网络堆栈顶部有一个 WFP 标注,将应用程序标识附加到每个 NET_BUFFER_LIST。在网络堆栈的底部(最靠近硬件)还有另一个 WFP 标注,它执行实际的字节计数并对每个应用程序的网络消耗进行计费。

如果您只是克隆 NET_BUFFER_LIST,默认情况下不会复制附加到 NET_BUFFER_LIST 的应用程序标识。您还需要调用NdisCopySendNetBufferListInfoNdisCopyRecieveNetBufferListInfo 之一来复制该元数据。

巧合的是,昨天还有另一个 NDIS 问题,我为此写了相同的答案;)。所以与其把它全部写出来,你可以参考我在这里写的:Send doesn't work properly in my NDIS modifying filter driver

【讨论】:

嗨,杰弗里,感谢您的回答。不,我复制 NET_BUFFERS 的方式是读取其内容,然后将其复制到内部结构的成员中,然后我重新创建 NET_BUFFER,如果用户模式服务将其发送回给我并且不丢弃它。那么您认为这是导致问题的原因吗?因为在这种情况下,我只是在复制数据包内容,并且不能使用 NdisCopyRecieveNetBufferListInfo,因为复制的目标不是 NET_‌BUFFER。我该如何手动执行该 API 正在执行的操作?例如在我的内部结构中添加一些“信息”成员? 请注意,我所说的内容是指数据包的内容。如果这确实导致了这个问题,那么为什么资源监视器仍然可以看到进程的网络使用情况?另请注意,我无法将整个 NET_‌‌BUFFER 结构发送给用户服务,因为它的结构非常大,而且我自己的内部结构效率更高,因为我只存储数据包内容和有关 NET_‌BUFFER 的更多信息。跨度> 我刚刚意识到还有一个更大的问题。由于我使用的是 NdisFSendNetBufferListComplete/NdisFIndicateREceiveNetBufferLists,即使我将原始 NET_‌َBUFFERS 存储在某个地方,当用户将它们发回时我也无法重用它们(我正在完成它,因为我需要等待用户服务对数据包的决定,它发送返回那些正常的数据包)。那么我现在的解决方案是什么? NdisCopySendNetBufferListInfo 是保留元数据的唯一方法。您需要尽快实现新的 NBL,这样您就有了保存该元数据的地方。您可以立即分配克隆 NBL,并将其用作不透明容器来保存所有元数据,但仍向您的用户模式进程显示您自己的精简数据包描述符。如果用户态进程允许发送数据包,则使用您之前分配的 NBL 发送它。

以上是关于NDIS LWF 驱动程序导致网络堆栈中的 WFP 驱动程序出现问题?的主要内容,如果未能解决你的问题,请参考以下文章

安装程序无法自动安装网络自检wfp驱动程序

汉澳sinox通过ndis执行windows驱动程序

WFP之WFP简介

Windows WFP 驱动程序:在 ClassifyFn 回调中处理数据包时出现 BSOD

RAS 和 NDIS 拨号模式

Learning Without Forgetting 笔记及实现