ndislwf的评论说:“不提供FilerSendNetBufferList处理程序的过滤器不能自己发起一个发送。”这是否意味着如果我使用NdisFSendNetBufferLists函数,我必须提供FilerSendNetBufferList处理程序?我的驱动程序将通过NdisFSendNetBufferLists发送自构造的数据包,但我不想过滤其他程序的已发送数据包。
与FilterReturnNetBufferLists相同,它说“不提供FilterReturnNetBufferLists处理程序的过滤器不能自己发起接收指示。”。 “发起接收指示”是什么意思? NdisFIndicateReceiveNetBufferLists还是NdisFReturnNetBufferLists或两者兼而有之?此外,对于我的驱动程序,我只想捕获收到的数据包而不是返回的数据包。因此,如果可能的话,我不想为性能目的提供FilterReturnNetBufferLists函数。
另一个重新组合的案例是FilterOidRequestComplete和NdisFOidRequest,实际上我的过滤器驱动程序只希望通过NdisFOidRequest发送Oid请求,而不是过滤其他人发送的Oid请求。我可以将FilterOidRequest,FilterCancelOidRequest和FilterOidRequestComplete保留为NULL吗?或者哪一个必须使用NdisFOidRequest?
THX。
答案 0 :(得分:2)
LWF可以是:
这是一个全有或全无的模型。由于您要发送自己构建的数据包,因此必须安装FilterSendNetBufferLists
处理程序和FilterSendNetBufferListsComplete
处理程序。如果您对其他协议的流量不感兴趣,那么您的发送处理程序可以像样本的发送处理程序一样简单 - 只需将所有内容转储到NdisFSendNetBufferLists
而不查看它。
FilterSendNetBufferListsComplete
处理程序需要更加小心。迭代所有已完成的NBL并挑选出你发送的NBL。您可以通过查看NET_BUFFER_LIST::SourceHandle
来识别您发送的数据包。从流中删除它们(可能重用它们,或只是NdisFreeNetBufferList
它们)。然后所有其他数据包通过NdisFSendNetBufferListsComplete
上传到堆栈。
以上讨论也适用于接收路径。发送和接收之间的唯一区别是,在接收路径上,您必须密切关注NDIS_RECEIVE_FLAGS_RESOURCES
标志。
与数据路径一样,如果您想要参与OID请求(过滤或发布自己的请求),则必须将其集成到整个OID堆栈中。这意味着您提供了FilterOidRequest
,FilterOidRequestComplete
和FilterCancelOidRequest
处理程序。除了再次检测过滤器在oid-complete处理程序中发起的OID请求,并从流中删除它们(在它们上调用NdisFreeCloneOidRequest
)之外,您不需要在这些处理程序之外执行任何特殊操作。
不要担心这里的表现。第一步是让它运作起来。即使示例过滤器将自身插入发送,接收和OID路径中;几乎不可能提出任何可以检测样本过滤器存在的基准测试。在过滤器中使用无操作处理程序非常便宜。
如果您对此非常强烈,那么可以选择性地从数据路径中删除您的过滤器,并调用NdisFRestartFilter
和NdisSetOptionalHandlers(NDIS_FILTER_PARTIAL_CHARACTERISTICS)
。但我绝对不认为你需要复杂性。如果您来自以混杂模式捕获的NDIS 5协议,那么通过切换到本机网络数据结构(NDIS_PACKET-> NBL)并消除环回路径,您已经获得了很大的性能提升。您可以对下一个版本进行额外的微调。