繁体   English   中英

为什么不调用我的NDIS筛选器驱动程序的FilterReceiveNetBufferLists处理程序?

[英]Why my NDIS filter driver' FilterReceiveNetBufferLists handler is not called?

大家。 再次是我,那个将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的文档。

谢谢。

我们没有LWF-> Protocol的官方文档,因为这不是很常见的过渡。

很难说是什么原因导致网络瘫痪,因为可能有很多原因。 最好的方法是使用内核调试器,并开始使用!ndiskd.miniport分析事物。 这是网络故障时要检查的一般检查表:

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

如果您不熟悉Windows内核网络调试,将很难确定某些情况是好是坏。 理想情况下,您将有另一台可以运行的计算机进行调试,因此您可以看到“正常”状态。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM