为什么我的NDIS过滤器驱动程序'FilterReceiveNetBufferLists处理程序没有被调用?

时间:2013-08-13 17:12:36

标签: c windows driver ndis

大家。这是我,将NDP 6协议中的WinPcap移植到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的文件。

感谢。

1 个答案:

答案 0 :(得分:1)

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

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

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

如果您是Windows内核网络调试的新手,则很难确定某些内容是好还是坏。理想情况下,您需要另一台可以调试的工作计算机,这样您就可以看到“正常”的样子。

如果您的搜索仍未显示任何有用信息,则另一个攻击角度是对您所做的代码更改进行二进制搜索。首先,注释掉您对过滤器接收路径所做的所有更改,并将其恢复为与样本中的完全相同。这样可以解决问题吗?如果是这样,继续。 。 。