FilterSendNetBufferLists是否必须为NDISfilter使用NdisFSendNetBufferLists?

大家好,我将WinPcap从NDIS6协议移植到NDIS6filter。 这几乎已经完成了,但是我仍然有一些问题:

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

与FilterReturnNetBufferLists相同,它表示“不提供FilterReturnNetBufferLists处理程序的filter不能自行发起接收指示。” “产生接收指示”是什么意思? NdisFIndicateReceiveNetBufferLists或NdisFReturnNetBufferLists或两者? 另外,对于我的驱动程序,我只想捕获收到的数据包,而不是返回的数据包。 所以如果可能的话,我不希望提供FilterReturnNetBufferLists函数用于性能目的。

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

谢谢。

Solutions Collecting From Web of "FilterSendNetBufferLists是否必须为NDISfilter使用NdisFSendNetBufferLists?"

发送和接收

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)并消除环回路径,你已经获得了很大的性能提升。 您可以进一步微调到下一个版本。