0

皆さん、WinPcap を NDIS6 プロトコルから NDIS6 フィルターに移植しています。ほぼ完成しましたが、まだいくつか質問があります。

ndislwf のコメントには、「FilerSendNetBufferList ハンドラーを提供しないフィルターは、それ自体で送信を開始することはできません」とありました。NdisFSendNetBufferLists 関数を使用した場合、FilerSendNetBufferList ハンドラーを提供する必要があるということですか? 私のドライバーは、NdisFSendNetBufferLists によって自己構築されたパケットを送信しますが、他のプログラムの送信パケットをフィルター処理したくありません。

FilterReturnNetBufferLists と同様に、「FilterReturnNetBufferLists ハンドラーを提供しないフィルターは、それ自体で受信指示を発信することはできません」と述べています。「受信指示を発信する」とはどういう意味ですか? NdisFIndicateReceiveNetBufferLists または NdisFReturnNetBufferLists またはその両方? また、私のドライバーでは、返されたパケットではなく、受信したパケットのみをキャプチャしたいと考えています。したがって、可能であれば、パフォーマンスの目的で FilterReturnNetBufferLists 関数を提供したくありません。

別の類似したケースは FilterOidRequestComplete と NdisFOidRequest です。実際、フィルター ドライバーは、他のユーザーから送信された Oid 要求をフィルタリングするのではなく、NdisFOidRequest によって Oid 要求自体を送信したいだけです。FilterOidRequest、FilterCancelOidRequest、および FilterOidRequestComplete を NULL のままにできますか? または、NdisFOidRequest を使用するために必要なものはどれですか?

どうも。

4

1 に答える 1

2

送受信

LWF は次のいずれかになります。

  • 送信パスから完全に除外され、他のプロトコルの送信トラフィックを確認できず、独自のトラフィックを送信できません。また
  • 送信パスに統合され、他のプロトコルの送信トラフィックと送信完了トラフィックを表示およびフィルタリングでき、独自のトラフィックを注入できます

オール オア ナッシング モデルです。独自の自己構築パケットを送信したいので、ハンドラーとハンドラーをインストールする必要があります。他のプロトコルのトラフィックに関心がない場合は、サンプルの送信ハンドラーと同じくらい単純な送信ハンドラーにすることができます。見ずにすべてをダンプするだけです。FilterSendNetBufferListsFilterSendNetBufferListsCompleteNdisFSendNetBufferLists

ハンドラーはFilterSendNetBufferListsCompleteもう少し注意する必要があります。完了したすべての NBL を繰り返し処理し、送信したものを選択します。を参照して、送信したパケットを特定できますNET_BUFFER_LIST::SourceHandle。ストリームからそれらを削除します (おそらく再利用するか、それらだけを使用しNdisFreeNetBufferListます)。他のすべてのパケットは、 経由でスタックを上りますNdisFSendNetBufferListsComplete

上記の説明は、受信パスにも適用されます。送信と受信の唯一の違いは、受信パスではNDIS_RECEIVE_FLAGS_RESOURCESフラグに細心の注意を払う必要があることです。

OID リクエスト

データパスと同様に、OID 要求に参加したい場合 (フィルター処理または独自の発行のいずれか)、OID スタック全体に統合する必要があります。つまり、、、およびハンドラを提供FilterOidRequestFilterOidRequestCompleteますFilterCancelOidRequest。フィルタが oid-complete ハンドラーで発生した OID 要求を再度検出し、それらをストリームから削除する (それらを呼び出す) ことを除いて、これらのハンドラーでサンプルが行うこと以外に特別なことをする必要はありませんNdisFreeCloneOidRequest

パフォーマンス

ここでは、パフォーマンスについて心配する必要はありません。最初のステップは、それを機能させることです。サンプル フィルタは、送信パス、受信パス、および OID パスに自身を挿入します。サンプル フィルターの存在を検出できるベンチマークを作成することはほとんど不可能です。フィルターに何もしないハンドラーを含めるのは非常に安価です。

これについて非常に強く感じる場合は、およびを呼び出して、データパスからフィルターを選択的に削除できます。しかし、複雑さは絶対に必要ないと思います。プロミスキャス モードでキャプチャする NDIS 5 プロトコルを使用している場合は、ネイティブ ネットワーク データ構造 (NDIS_PACKET->NBL) に切り替えてループバック パスを排除することで、パフォーマンスが大幅に向上しています。追加の微調整は次のバージョンに任せることができます。NdisFRestartFilterNdisSetOptionalHandlers(NDIS_FILTER_PARTIAL_CHARACTERISTICS)

于 2013-08-12T18:16:13.327 に答える