gpt4 book ai didi

c - FilterSendNetBufferLists 处理程序是否是 NDIS 过滤器使用 NdisFSendNetBufferLists 所必需的?

转载 作者:太空宇宙 更新时间:2023-11-04 08:54:13 29 4
gpt4 key购买 nike

各位,我正在将 WinPcap 从 NDIS6 协议(protocol)移植到 NDIS6 过滤器。快完成了,但我还有一些问题:

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

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

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

谢谢。

最佳答案

发送和接收

LWF 可以是:

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

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

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

上述讨论也适用于接收路径。 send 和 receive 的唯一区别是在接收路径上,你必须密切注意 NDIS_RECEIVE_FLAGS_RESOURCES旗帜。

OID请求

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

性能

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

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

关于c - FilterSendNetBufferLists 处理程序是否是 NDIS 过滤器使用 NdisFSendNetBufferLists 所必需的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18180150/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com