我创建了 NDIS 网络过滤器驱动程序,但是当我安装它时,我看到“FilterAttach”调用 4 次。
为什么“FilterAttach”在我的过滤器驱动程序中调用 4 次?
1 回答
FilterAttach
您会在驱动程序中看到许多调用的原因有 3 个:
- 多个网卡,
- 监控过滤器,以及
- NDIS 绑定重新计算
让我们详细看看每一个。
多个网卡
过滤器驱动程序会将过滤器模块绑定到与过滤器驱动程序兼容的每个 NIC。因此,如果您有 3 个兼容的 NIC,您将至少获得三个对FilterAttach
.
[TCPIP] [TCPIP] [TCPIP]
| | |
[filter1] [filter2] [filter3]
| | |
[NIC1] [NIC2] [NIC3]
您可以告诉您处于这种情况,因为不同实例的NDIS_FILTER_ATTACH_PARAMETERS::BaseMiniportIfIndex
值不同。FilterAttach
这意味着您的过滤器被绑定在不同的 NIC 上。
监控过滤器
NDIS LWF 正在监视或修改. 查看 INF 文件以查看您拥有哪种类型的过滤器:
; For a Monitoring filter, use this:
; HKR, Ndi,FilterType,0x00010001, 1 ; Monitoring filter
; For a Modifying filter, use this:
; HKR, Ndi,FilterType,0x00010001, 2 ; Modifying filter
监控和修改的区别在于这些过滤器如何绑定到网卡。修改过滤器是最简单的:每个网卡只绑定一次。相比之下,监控过滤器会为彼此修改过滤器绑定一次,并为 NIC 本身绑定一次。下面是当您有一个监控过滤器和 2 个修改过滤器时发生的情况的图表:
[TCPIP]
|
[monitoring1] // 3
|
[modifying2]
|
[monitoring1] // 2
|
[modifying1]
|
[monitoring1] // 1
|
[NIC]
在此图中要注意的关键是同一监控过滤器被附加到堆栈 3 次:一次通过 NIC,一次通过 2 个修改过滤器(modifying1
和modifying2
)中的每一个。
如果您不希望您的监控过滤器像这样在每个高度绑定,您可以在任何时间NDIS_STATUS_NOT_SUPPORTED
从您的处理程序返回,而不是. 如果您有强制过滤器,您还应该在 中设置标志,但请注意,我们不建议将监控过滤器标记为强制。FilterAttach
NDIS_FILTER_ATTACH_PARAMETERS::LowerIfIndex
NDIS_FILTER_ATTACH_PARAMETERS::BaseMiniportIfIndex
NDIS_FILTER_ATTACH_FLAGS_IGNORE_MANDATORY
NDIS_FILTER_ATTACH_PARAMETERS::Flags
NDIS_FILTER_ATTACH_PARAMETERS::BaseMiniportIfIndex
如果两次调用中的 相同,您可以判断您处于这种情况FilterAttach
,但是 NDIS_FILTER_ATTACH_PARAMETERS::FilterModuleGuidName is different. The
BaseMiniportIfIndex tells you which miniport your filter is over, and the
FilterModuleGuidName` 会准确地告诉您正在附加哪个过滤器实例。
NDIS 绑定重新计算
过滤器可能会看到对其FilterAttach
例程的多次调用的最后一个原因是因为 NDIS 有时会重新计算绑定。可能在您的过滤器下方安装了一个新过滤器 - NDIS 将取消绑定您的过滤器 ( FilterDetach
) 绑定新过滤器,然后再次绑定您的过滤器 ( FilterAttach
)。
由于绑定重新计算,您可以看出 NDIS 正在重新尝试您的过滤器,因为这NDIS_FILTER_ATTACH_PARAMETERS::FilterModuleGuidName
与之前对FilterAttach
. 这意味着 NDIS 将您的过滤器安装在与以前相同的位置。
调试提示
如果您连接了内核调试器,您可以随时使用!ndiskd.filterdriver
来查看过滤器的连接位置。您还可以使用!ndiskd.netreport
来查看网络堆栈的图形可视化。