1

NDIS ネットワーク フィルター ドライバーを作成しましたが、インストールすると、"FilterAttach" 呼び出しが 4 回表示されます。
フィルター ドライバーで "FilterAttach" が 4 回呼び出されるのはなぜですか?

4

1 に答える 1

2

FilterAttachドライバーに多くの呼び出しが表示される理由は 3 つあります。

  • 複数の NIC、
  • 監視フィルター、および
  • NDIS バインディングの再計算

それぞれ詳しく見ていきましょう。

複数の NIC

フィルター ドライバーは、フィルター ドライバーと互換性のある各 NIC にフィルター モジュールをバインドします。したがって、互換性のある NIC が 3 つある場合は、少なくとも 3 つの呼び出しが行われ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

監視と変更の違いは、これらのフィルターがネットワーク カードにバインドされる方法にあります。フィルターの変更は最も単純です。ネットワーク カードごとに 1 回バインドするだけです。対照的に、監視フィルターは、お互いの変更フィルターに対して1 回バインドし、NIC 自体に対してもう 1 回バインドします。以下は、監視フィルターと 2 つの変更フィルターがある場合に何が起こるかを示す図です。

  [TCPIP]
     |
[monitoring1]   // 3
     |
[modifying2]
     |
[monitoring1]   // 2
     |
[modifying1]
     |
[monitoring1]   // 1
     |
   [NIC]

この図で注目すべき重要な点は、同じ監視フィルターがスタックに 3 回接続されていることです。1 回は NIC で、1 回は 2 つの変更フィルター (modifying1modifying2) のそれぞれで 1 回です。

このように各高度で監視フィルターをバインドさせたくない場合は、いつでもハンドラーから戻ることができNDIS_STATUS_NOT_SUPPORTEDます。必須フィルタがある場合は、 にもフラグを設定する必要がありますが、モニタリング フィルタを必須としてマークすることはお勧めしません。FilterAttachNDIS_FILTER_ATTACH_PARAMETERS::LowerIfIndexNDIS_FILTER_ATTACH_PARAMETERS::BaseMiniportIfIndexNDIS_FILTER_ATTACH_FLAGS_IGNORE_MANDATORYNDIS_FILTER_ATTACH_PARAMETERS::Flags

NDIS_FILTER_ATTACH_PARAMETERS::BaseMiniportIfIndexへの両方の呼び出しで が同じ場合、この状況にあることがわかりますFilterAttachが、NDIS_FILTER_ATTACH_PARAMETERS::FilterModuleGuidName is different. TheBaseMiniportIfIndex tells you which miniport your filter is over, and theFilterModuleGuidName` は、どのフィルター インスタンスがアタッチされているかを正確に示します。

NDIS バインディングの再計算

フィルターがルーチンへの複数の呼び出しを検出する可能性がある最後の理由FilterAttachは、NDIS がバインドを再計算することがあるためです。新しいフィルターがフィルターの下にインストールされている可能性があります。NDIS はフィルターのバインドを解除し ( FilterDetach)、新しいフィルターをバインドしてから、フィルターを再度バインドします ( FilterAttach)。

NDIS_FILTER_ATTACH_PARAMETERS::FilterModuleGuidNameは以前の への呼び出しと同じであるため、バインドの再計算により、NDIS がフィルターを再試行していることがわかりますFilterAttach。これは、NDIS が以前と同じ場所にフィルターを取り付けていることを意味します。

デバッグのヒント

カーネル デバッガーがアタッチされている場合は、いつでも を使用!ndiskd.filterdriverして、フィルターがアタッチされている場所を確認できます。!ndiskd.netreportを使用して、ネットワーク スタックをグラフィカルに視覚化することもできます。

于 2013-10-07T22:47:53.587 に答える