【问题标题】:Why my NDIS filter driver' FilterReceiveNetBufferLists handler is not called?为什么不调用我的 NDIS 过滤器驱动程序的 FilterReceiveNetBufferLists 处理程序?
【发布时间】:2013-08-15 10:23:13
【问题描述】:

每个人。又是我,将 WinPcap 从 NDIS 6 协议移植到 NDIS 6 过滤器的人:) 我遇到了一个错误,让我困了两天。这里是:我安装好npf6x.sys驱动(原名为npf.sys)后,可以通过“net start npf”启动服务。然后我打开了 Wireshark。然后网络出现故障(托盘图标上的感叹号)。经过远程调试,我发现 FilterReceiveNetBufferLists 例程从未被调用过。我相信 RX 链接在这里被破坏了。但是,FilterSendNetBufferLists 被正常调用。我确定 FilterAttach 已成功调用,现在没有调用 FilterUnload。所以过滤器模块应该还在它的位置。但它不能在 RX 路径中工作。然后我点击了Wireshark的“开始”按钮,竟然发现网络已经恢复了。然后我停止当前捕获并单击“接口列表”,网络再次关闭。太奇怪了。

我没有在驱动程序的运行过程中更改处理程序指针。我似乎驱动程序也没有被锁阻塞。谁能告诉我是否有任何情况导致 NDIS 在运行期间不调用过滤器的 FilterReceiveNetBufferLists?

还有关于如何从 NDIS 6 协议移植到 NDIS 6 过滤器的官方文档吗?我只找到了从 NDIS 5 移植到 NDIS 6 的文档。

谢谢。

【问题讨论】:

    标签: c windows driver ndis


    【解决方案1】:

    我们没有关于 LWF->协议的官方文档,因为这不是一个非常常见的过渡。

    很难说是什么导致了网络中断,因为可能有很多原因。最好的方法是使用内核调试器并使用!ndiskd.miniport 开始分析事物。以下是网络出现故障时要查看的一般检查清单:

    • 微型端口是否处于正常状态?检查!ndiskd.miniport 是否将STATE 区域中的所有内容显示为绿色或正常外观。确保数据路径正常(绕过)并且媒体连接状态为已连接。
    • 您的过滤器驱动程序是否已加载到您认为应该加载的位置?检查!ndiskd.miniportBINDINGS 部分是否显示您的过滤器已列出。如果您使用的是新的 Windows 8.1 WDK,还要检查过滤器的绑定是否未“拒绝”。
    • 微型端口的接收过滤器是否允许通常的传入数据包集?检查!ndiskd.miniport -filterdb 是否显示微型端口至少允许进入 DIRECTED 和 MULTICAST 流量。
    • 微型端口是否试图指示流量?在ndis!NdisMIndicateReceiveNetBufferLists 上设置断点,并验证断点是否频繁命中,因为 NIC 将收到的数据包提供给操作系统。
    • TCPIP 是否正在尝试发送流量?如果 TCPIP 不发送流量,则不会收到任何回复。在ndis!NdisSendNetBufferLists 上设置断点以查看 TCPIP 是否正在发送任何流量。如果是,请在微型端口发送处理程序上设置另一个断点(使用!ndiskd.minidriver 查找其MiniportSendNetBufferLists 处理程序)并验证发送数据包是否正在发送到 NIC。
    • 微型端口的接收数据包池是否为空?如果是这样,微型端口将无法再指示任何数据包,因为它已用完 NBL。使用!ndiskd.pendingnbls查看是否还有未归还的NBL。它通常会找到零个或可能一个未决的 NBL;如果您发现它有数百个,则说明您的过滤器中存在 NBL 泄漏。
    • 微型端口是否发现任何问题?检查微型端口统计信息。在 Windows 8 中,使用 PowerShell 中的 Get-NetAdapterStatistics

    如果您是 Windows 内核网络调试的新手,您将很难确定某些事情看起来是好是坏。理想情况下,您应该有另一台可以工作的计算机进行调试,这样您就可以看到“正常”的样子。

    如果您的搜索仍然没有找到任何有用的东西,另一种攻击角度是对您所做的代码更改进行二进制搜索。首先,注释掉您对过滤器的接收路径所做的所有更改,并将其恢复为与示例中的完全相同。这能解决问题吗?如果是这样,请继续。 . . .

    【讨论】:

    • 这里是微型端口信息:Miniport Broadcom NetLink (TM) Gigabit Ethernet Running, BINDINGS: WinPcap NDIS LightWeight Filter-0000 8657a8f0 865ca008 85fc5000,在我输入“!ndiskd.miniport -filterdb”后,我看到了"85eb6b98 875230e0 Broadcom NetLink (TM) 千兆以太网"
    • 我还发现 ndis!NdisMIndicateReceiveNetBufferLists 从未被调用过。当我 ping 出去时,可以调用 ndis!NdisSendNetBufferLists。在 DebugView 中,我看到只有 TX 数据包和 OID 请求,没有 RX 数据包。输入“!ndiskd.minidriver”后,我看到“85eb6b98 - k57nd60x”,我没有看到MiniportSendNetBufferLists处理程序,但我认为这里没有问题,因为我使用另一台计算机永久ping测试机器。
    • 输入“!ndiskd.pendingnbls”后,输出为:PHASE 1/3: Found 23 NBL pool(s)。阶段 2/3:找到 55 个已释放的 NBL。待处理的 NBL 当前持有者 未找到待处理的 NBL。阶段 3/3:在总共 255 个 NBL 中找到 0 个未决 NBL。搜索完成。 (似乎没问题)。测试机是Win7 x86,所以无法执行GetNetAdapterStatistics命令。
    • 经过一些调试,我发现我的驱动程序在发起一些OID请求时会阻塞RX路径。但是我检查并发现这里没有错误。我调用NdisFOidRequest后,它返回NDIS_STATUS_PENDING,然后我的FilterOidRequestComplete被调用,然后进入FilterInternalRequestComplete,NdisSetEvent在里面,返回NdisWaitEvent(&pRequest->InternalRequestCompletedEvent, 0);这里一切似乎都很好。注释太小,无法粘贴代码。我将为代码打开一个新线程。
    • 代码在这个新线程中:stackoverflow.com/questions/18257048/…
    猜你喜欢
    • 2013-08-17
    • 1970-01-01
    • 2020-03-19
    • 2012-02-02
    • 2013-08-20
    • 2012-05-05
    • 2016-02-23
    • 2017-06-21
    • 2016-03-10
    相关资源
    最近更新 更多