Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C NDIS筛选器必须使用FilterSendNetBufferList处理程序才能使用NDisfSendNetBufferList吗?_C_Windows_Driver_Ndis - Fatal编程技术网

C NDIS筛选器必须使用FilterSendNetBufferList处理程序才能使用NDisfSendNetBufferList吗?

C NDIS筛选器必须使用FilterSendNetBufferList处理程序才能使用NDisfSendNetBufferList吗?,c,windows,driver,ndis,C,Windows,Driver,Ndis,各位,我正在将WinPcap从NDIS6协议移植到NDIS6过滤器。快完成了,但我还有一些问题: ndislwf的评论说“不提供FilerSendNetBufferList处理程序的筛选器不能自行发起发送”。这是否意味着如果我使用NDISFSSendNetBufferList函数,我必须提供FilerSendNetBufferList处理程序?我的驱动程序将通过NDISFSendNetBufferList发送自行构造的数据包,但我不想过滤其他程序发送的数据包 与FilterReturnNetBu

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

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

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

另一种情况是FilterOidRequestComplete和NdisFOidRequest,事实上,我的筛选器驱动程序只希望通过NdisFOidRequest发送Oid请求,而不是过滤其他人发送的Oid请求。我可以将FilterOidRequest、FilterCancelOidRequest和FilterOidRequestComplete保留为空吗?或者使用NdisFOidRequest必须使用哪一个

Thx.

发送和接收 LWF可以是:

  • 完全排除在发送路径之外,无法看到其他协议的发送流量,并且无法发送其自身的任何流量;或
  • 集成到发送路径中,能够查看和过滤其他协议的发送和发送完整流量,并能够注入自己的流量
这是一个全有或全无的模式。由于您希望发送自己的自建数据包,因此必须安装
FilterSendNetBufferList
处理程序和
FilterSendNetBufferListsComplete
处理程序。如果您对其他协议的通信量不感兴趣,那么您的发送处理程序可以像示例的发送处理程序一样简单—只需将所有内容转储到
NdisFSendNetBufferLists
,而不必查看它

FilterSendNetBufferListsComplete处理程序需要更加小心。迭代所有已完成的NBL,并选择您发送的NBL。您可以通过查看
NET\u BUFFER\u LIST::SourceHandle
来识别发送的数据包。从流中删除它们(可能会重用它们,或者只是
NdisFreeNetBufferList
它们)。然后,所有其他数据包通过
ndisfssendtebufferlistscomplete
进入堆栈

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

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

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

如果您对此感觉非常强烈,可以通过调用
ndisfsrestartfilter
ndissetocationalhandlers(NDIS\u filter\u PARTIAL\u CHARACTERISTICS)
有选择地从数据路径中删除过滤器。但我绝对不认为你需要这么复杂。如果您来自以混杂模式捕获的NDIS 5协议,那么通过切换到本机网络数据结构(NDIS_数据包->NBL)并消除环回路径,您已经获得了很大的性能改进。您可以将其他微调留待下一个版本