FilterSendNetBufferLists处理程序是否必须使NDIS过滤器使用NdisFSendNetBufferLists?

时间:2013-08-12 05:34:34

标签: c windows driver ndis

大家,我正在将NDP6协议的WinPcap移植到NDIS6过滤器。它已接近完成,但我还有一些问题:

ndislwf的评论说:“不提供FilerSendNetBufferList处理程序的过滤器不能自己发起一个发送。”这是否意味着如果我使用NdisFSendNetBufferLists函数,我必须提供FilerSendNetBufferList处理程序?我的驱动程序将通过NdisFSendNetBufferLists发送自构造的数据包,但我不想过滤其他程序的已发送数据包。

与FilterReturnNetBufferLists相同,它说“不提供FilterReturnNetBufferLists处理程序的过滤器不能自己发起接收指示。”。 “发起接收指示”是什么意思? NdisFIndicateReceiveNetBufferLists还是NdisFReturnNetBufferLists或两者兼而有之?此外,对于我的驱动程序,我只想捕获收到的数据包而不是返回的数据包。因此,如果可能的话,我不想为性能目的提供FilterReturnNetBufferLists函数。

另一个重新组合的案例是FilterOidRequestComplete和NdisFOidRequest,实际上我的过滤器驱动程序只希望通过NdisFOidRequest发送Oid请求,而不是过滤其他人发送的Oid请求。我可以将FilterOidRequest,FilterCancelOidRequest和FilterOidRequestComplete保留为NULL吗?或者哪一个必须使用NdisFOidRequest?

THX。

1 个答案:

答案 0 :(得分:2)

发送和接收

LWF可以是:

  • 完全从发送路径中排除,无法看到其他协议的发送流量,也无法发送任何自己的流量;或
  • 集成到发送路径中,能够查看和过滤其他协议的发送和发送完成流量,并能够注入自己的流量

这是一个全有或全无的模型。由于您要发送自己构建的数据包,因此必须安装FilterSendNetBufferLists处理程序和FilterSendNetBufferListsComplete处理程序。如果您对其他协议的流量不感兴趣,那么您的发送处理程序可以像样本的发送处理程序一样简单 - 只需将所有内容转储到NdisFSendNetBufferLists而不查看它。

FilterSendNetBufferListsComplete处理程序需要更加小心。迭代所有已完成的NBL并挑选出你发送的NBL。您可以通过查看NET_BUFFER_LIST::SourceHandle来识别您发送的数据包。从流中删除它们(可能重用它们,或只是NdisFreeNetBufferList它们)。然后所有其他数据包通过NdisFSendNetBufferListsComplete上传到堆栈。

以上讨论也适用于接收路径。发送和接收之间的唯一区别是,在接收路径上,您必须密切关注NDIS_RECEIVE_FLAGS_RESOURCES标志。

OID请求

与数据路径一样,如果您想要参与OID请求(过滤或发布自己的请求),则必须将其集成到整个OID堆栈中。这意味着您提供了FilterOidRequestFilterOidRequestCompleteFilterCancelOidRequest处理程序。除了再次检测过滤器在oid-complete处理程序中发起的OID请求,并从流中删除它们(在它们上调用NdisFreeCloneOidRequest)之外,您不需要在这些处理程序之外执行任何特殊操作。

效果

不要担心这里的表现。第一步是让它运作起来。即使示例过滤器将自身插入发送,接收和OID路径中;几乎不可能提出任何可以检测样本过滤器存在的基准测试。在过滤器中使用无操作处理程序非常便宜。

如果您对此非常强烈,那么可以选择性地从数据路径中删除您的过滤器,并调用NdisFRestartFilterNdisSetOptionalHandlers(NDIS_FILTER_PARTIAL_CHARACTERISTICS)。但我绝对不认为你需要复杂性。如果您来自以混杂模式捕获的NDIS 5协议,那么通过切换到本机网络数据结构(NDIS_PACKET-> NBL)并消除环回路径,您已经获得了很大的性能提升。您可以对下一个版本进行额外的微调。