NDIS LWF - FilterRestart和FilterPause

时间:2014-04-11 06:07:39

标签: windows networking kernel driver ndis

我是NDIS LWF驱动程序的新用户,但在确定Win7上的WFP不符合我的要求后,我不得不转向他们。所以希望这不是一个基本的问题。

我的要求基本上需要能够在多NIC系统上滥用侦听选定的NIC。我修改了LWF示例以将接口置于混杂模式,但我现在仍然坚持如何设置指定的适配器。我意识到LWF位于所有适配器之上,因此它不像我可以调用NdisOpenAdapterEx的协议,但我认为必须有一些过滤机制来忽略某些适配器。

我需要能够向驱动程序IOCTL提供我所关心的接口的所选MAC地址。是否可以加载驱动程序但只在特定接口上运行过滤器,或者我只需要忽略来自其他我不关心FilterReceiveNetBufferLists的调用。如果我不对特定接口做任何事情,那么似乎更有效率的是不必拥有FilterReceiveNetBufferLists回调。

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

最后,为了更好地理解NDIS内部结构,当暂停过滤器模块时,整个堆栈是否会暂停或NDIS路由到暂停的模块周围?

1 个答案:

答案 0 :(得分:0)

这些都是好问题。

  

是否可以加载驱动程序,但只能在特定接口上运行过滤器

是。你有三个选择。

  1. 在usermode中静态禁用绑定;或
  2. 在运行时拒绝绑定。
  3. Dynamically bypass and re-enable the datapath。 (这里不再详述,因为它已在MSDN上列出。)
  4. 要静态禁用绑定,您可以使用the INetCfg API查找过滤器驱动程序和NIC之间的绑定,然后将其禁用。这可能看起来像:

    INetCfg::Initialize
    myFilter = INetCfg::FindComponent
    myFilter->QueryInterface(INetCfgComponentBindings)
    for each binding in bindings
        if binding is to undesirable NIC
            INetCfgBindingPath::Enable(FALSE)
    

    安装驱动程序后,您可以随时执行此操作。因此,例如,您的usermode应用程序可能决定仅在其GUI运行时启用对某些NIC的绑定。

    但是运行usermode代码并不总是方便,如果你的驱动程序还没有用户模式,那么创建一个只是为了禁用一些绑定可能有点过分。这是第二种技术派上用场的地方。您可以在usermode中静态启用绑定,但拒绝在运行时绑定。

    你如何拒绝在运行时绑定?在许多情况下,您所要做的就是从FilterAttach处理程序返回失败状态。这足以说服NDIS您的过滤器不能(或不会)连接到NIC。但是 - 如果您的过滤器标记为Mandatory(即INF的FilterRunType为1),那么FilterAttach失败将导致NIC无法运行。 (毕竟,这是强制性的整点。如果您的过滤器不存在,那么数据路径一定不能运行。)但是如果您想允许NIC无论如何都要开始运行,在过滤器从其NDIS_FILTER_ATTACH_FLAGS_IGNORE_MANDATORY返回失败代码之前,在NDIS_FILTER_ATTACH_PARAMETERS::Flags字段中设置FilterAttach标记。

      

    如果我不为某个特定接口做任何事情,那么不必拥有FilterReceiveNetBufferLists回调似乎更有效。

    你的直觉是正确的。在数据路径中有一个过滤器,如果过滤器什么都不做,那就浪费了CPU周期。但是暂时不要写这个选项。在某些情况下,此选项的简单性超过其(相对较小的)CPU成本。也就是说,除非您的目标市场计算每个CPU周期,否则只需使用这个简单的选项就足够了。

      

    我想在DriverEntry期间远离使用注册表,因为我仍然需要能够根据需要动态地重新执行任务。

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

    使用第二种技术时,无法重新执行任务。如果您确实需要重新执行特定NIC的任务,那么您应该使用第一种或第三种技术。

      

    当暂停过滤器模块时,整个堆栈是暂停还是在暂停的模块周围进行NDIS路由?

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