NDIS ネットワーク フィルター ドライバーを作成しましたが、インストールすると、"FilterAttach" 呼び出しが 4 回表示されます。
フィルター ドライバーで "FilterAttach" が 4 回呼び出されるのはなぜですか?
1 に答える
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 つの変更フィルター (modifying1
とmodifying2
) のそれぞれで 1 回です。
このように各高度で監視フィルターをバインドさせたくない場合は、いつでもハンドラーから戻ることができ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_FILTER_ATTACH_PARAMETERS::FilterModuleGuidName
は以前の への呼び出しと同じであるため、バインドの再計算により、NDIS がフィルターを再試行していることがわかりますFilterAttach
。これは、NDIS が以前と同じ場所にフィルターを取り付けていることを意味します。
デバッグのヒント
カーネル デバッガーがアタッチされている場合は、いつでも を使用!ndiskd.filterdriver
して、フィルターがアタッチされている場所を確認できます。!ndiskd.netreport
を使用して、ネットワーク スタックをグラフィカルに視覚化することもできます。