我是 NDIS LWF 驱动程序的新手,但在确定 Win7 上的 WFP 无法满足我的要求后,我不得不转向它们。所以希望这不是一个太基本的问题。

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

我需要能够 IOCTL 到驱动程序我关心的接口的选定 MAC 地址。是否可以加载驱动程序,但只让过滤器在特定接口上运行,或者我只需忽略来自 FilterReceiveNetBufferLists 中我不关心的其他人的调用。如果我不会针对特定接口对 FilterReceiveNetBufferLists 回调执行任何操作,那么似乎不需要 FilterReceiveNetBufferLists 回调会更有效。

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

最后,为了更好地理解 NDIS 内部结构,当过滤器模块暂停时,整个堆栈都会暂停,还是 NDIS 会绕过暂停的模块进行路由?

有帮助吗?

解决方案

这些都是好问题。

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

是的。您在这里有三个选择。

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

要静态禁用绑定,您可以使用 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)

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

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

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

如果我不会针对特定接口对 FilterReceiveNetBufferLists 回调执行任何操作,那么似乎不需要 FilterReceiveNetBufferLists 回调会更有效。

你的直觉是正确的。在数据路径中设置过滤器会产生开销,如果过滤器不执行任何操作,就会浪费 CPU 周期。但暂时不要取消这个选项。在某些情况下,此选项的简单性超过了其(相对较小的)CPU 成本。也就是说,除非您的目标市场正在计算每个 CPU 周期,否则采用这个简单的选项可能就足够了。

我不想在 DriverEntry 期间使用注册表,因为我仍然需要能够根据需要动态重新分配任务。

正如上面提到的,你 使用用户模式代码重新执行任务。每次用户模式调用 INetCfg::Apply 时,NDIS 都会调用任何 FilterAttach 或者 FilterDetach 需要做出正确的改变。

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

当过滤器模块暂停时,整个堆栈是否会暂停,或者 NDIS 是否绕过暂停的模块进行路由?

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top