首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NDIS FilterRestart和FilterPause

NDIS FilterRestart和FilterPause
EN

Stack Overflow用户
提问于 2014-04-11 06:07:39
回答 1查看 1K关注 0票数 0

我是NDIS驱动程序的新手,但在确定Win7上的WFP不能满足我的要求之后,我不得不搬到他们那里去。希望这不是一个很基本的问题。

我的要求基本上意味着能够杂乱无章地在多NIC系统上监听选定的NIC。我已经修改了LWF示例,使接口进入混杂模式,但现在我仍然停留在如何设置指定的适配器上。我意识到LWF位于所有适配器之上,所以它不像一个我只需要调用NdisOpenAdapterEx的协议,但是我假设必须有一些过滤机制来忽略某些适配器。

我需要能够IOCTL到驱动程序选择的MAC地址(Es)的接口,我关心的。是否可以加载驱动程序,但只在特定接口上运行筛选器,还是只需忽略来自我在FilterReceiveNetBufferLists中不关心的其他调用。如果我不对特定的接口做任何事情的话,不需要FilterReceiveNetBufferLists回调就更有效了。

让我感到震惊的是,FilterRestart在DriverEntry (通过NdisFRegisterFilterDriver)期间被自动调用,并且似乎没有NdisFPauseFilter (但是有一个NdisFRestartFilter)。理想情况下,我希望能够在任何筛选开始之前设置必要的参数,并且我希望在DriverEntry期间不使用注册表,因为我仍然需要根据需要动态重新任务的能力。

最后,为了更好地理解NDIS内部,当一个过滤器模块被暂停时,整个堆栈是否会暂停,或者NDIS是否围绕暂停模块进行路由?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-14 07:34:48

这些都是好问题。

是否可以加载驱动程序,但仅在特定接口上运行筛选器?

是。你有三个选择。

  1. 在用户模式下静态禁用绑定;或
  2. 在运行时拒绝绑定。
  3. 动态绕过并重新启用数据路径。。(这里不会详细说明这一点,因为MSDN已经对其进行了概述。)

要静态地禁用绑定,可以使用INetCfg API查找筛选器驱动程序和NIC之间的绑定,然后禁用它。这看起来可能是:

代码语言:javascript
复制
INetCfg::Initialize
myFilter = INetCfg::FindComponent
myFilter->QueryInterface(INetCfgComponentBindings)
for each binding in bindings
    if binding is to undesirable NIC
        INetCfgBindingPath::Enable(FALSE)

一旦您的驱动程序被安装,您可以在任何时候这样做。例如,您的用户模式应用程序可能决定只在GUI运行时启用对某些NIC的绑定。

但是运行用户模式代码并不总是很方便,而且如果您的驱动程序还没有用户模式存在,那么创建一个用户模式代码就可以禁用几个绑定可能是太过分了。这就是第二种技术的用处所在。您可以在用户模式下静态地启用绑定,但在运行时拒绝绑定。

如何在运行时拒绝绑定?在许多情况下,您所要做的就是从FilterAttach处理程序返回一个失败状态。这足以使NDIS相信您的过滤器不能(或不会)附加到NIC。但是-如果您的过滤器被标记为必填 (即INF的FilterRunType为1),那么失败的FilterAttach将导致NIC变得不可操作。(毕竟,这就是强制性的全部意义。如果您的过滤器不存在,那么数据路径就不能运行。)但是,如果希望允许NIC无论如何开始运行,请在筛选器从其NDIS_FILTER_ATTACH_FLAGS_IGNORE_MANDATORY返回失败代码之前在NDIS_FILTER_ATTACH_PARAMETERS::Flags字段中设置FilterAttach标志。

如果我不对特定的接口做任何事情的话,不需要FilterReceiveNetBufferLists回调就更有效了。

你的直觉是正确的。在数据路径中有一个过滤器是有开销的,如果过滤器什么也不做,那就是浪费CPU周期。不过,现在还不要取消这个选项。在某些情况下,该选项的简单性超过了其(相对较小的) CPU成本。也就是说,除非您的目标市场在计算每一个CPU周期,否则就可以选择这个简单的选项了。

我想避免在DriverEntry期间使用注册表,因为我仍然需要根据需要动态重新任务的能力。

如前所述,您可以使用用户模式代码重新执行任务.每次用户模式调用INetCfg::Apply时,NDIS都会调用进行正确更改所需的任何FilterAttachFilterDetach

当您使用第二种技术时,重新任务是不可能的。如果您确实需要重新任务某个特定的NIC,那么您应该使用第一种或第三种技术。

当筛选模块暂停时,整个堆栈是否暂停,或者NDIS是否围绕暂停模块进行路由?

整个堆栈暂停。NDIS不“绕”过滤器。(如果您的过滤器是可选的,那么当您的过滤器没有运行时,流量将绕过您的过滤器。但是,只要将过滤器附加到NIC,NBLs和OID就会通过过滤器。)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23004716

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档