0

大家,我正在将 WinPcap 从 NDIS6 协议移植到 NDIS6 过滤器。快结束了,但我还有一些问题:

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

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

另一个类似的情况是FilterOidRequestComplete和NdisFOidRequest,实际上我的过滤驱动只想通过NdisFOidRequest自己发送Oid请求,而不是过滤其他人发送的Oid请求。我可以将 FilterOidRequest、FilterCancelOidRequest 和 FilterOidRequestComplete 保留为 NULL 吗?或者哪一个是必须使用 NdisFOidRequest 的?

谢谢。

4

1 回答 1

2

发送和接收

LWF 可以是:

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

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

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

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

OID 请求

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

表现

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

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

于 2013-08-12T18:16:13.327 回答