在过滤器驱动程序中调用FilterAttach

时间:2013-10-07 08:10:33

标签: ndis

我创建了NDIS网络过滤器驱动程序,但是当我安装它时,我看到“FilterAttach”调用了4次 为什么“FilterAttach”在我的过滤器驱动程序中调用4次?

1 个答案:

答案 0 :(得分:2)

有3个原因可以让您在驱动程序中看到许多FilterAttach次呼叫:

  • 多个NIC,
  • 监控过滤器,
  • NDIS绑定重新计算

让我们详细看一下。

多个NIC

过滤器驱动程序会将过滤器模块绑定到与过滤器驱动程序兼容的每个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,一次通过两个修改过滤器(modifying1和{{1} })。

如果您不希望监控过滤器在每个高度都绑定,那么只要modifying2NDIS_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查看网络堆栈的图形可视化。