コールアウト ドライバーのプログラミングに関する考慮事項

Windows フィルター プラットフォームのコールアウト ドライバーをプログラムする場合は、次のトピックを考慮してください。

ユーザー モード vs. カーネル モード

Windows フィルタリング プラットフォームに組み込まれている標準のフィルター機能を使用して目的のフィルター処理を実行できる場合、独立系ソフトウェア ベンダー (ISV) は、カーネル モードのコールアウト ドライバーを記述する代わりに、フィルター エンジンを構成するユーザー モード管理アプリケーションを記述してください。 カーネル モードのコールアウト ドライバーは、標準の組み込みフィルター機能では処理できない方法でネットワーク データを処理する必要がある場合にのみ書き込む必要があります。 ユーザー モードの Windows フィルター プラットフォーム管理アプリケーションを記述する方法については、Microsoft Windows SDK の「Windows フィルタリング プラットフォーム」のドキュメントを参照してください。

フィルタリング レイヤーの選択

コールアウト ドライバーは、ネットワーク スタック内の可能な限り高いフィルター レイヤーでネットワーク データをフィルター処理する必要があります。 たとえば、目的のフィルター処理タスクをストリーム レイヤーで処理できる場合は、ネットワーク レイヤーで実装しないでください。 ドライバーが Windows での IPsec との互換性を保証するために使用する必要があるフィルタリング レイヤーの推奨事項の詳細については、「IPsec 互換コールアウト ドライバーの開発」を参照してください。

アプリケーション層強制 (ALE) フローで確立されたレイヤーでのブロック

通常、ALE フローによって確率されたフィルタリング レイヤー (FWPM_LAYER_ALE_FLOW_ESTABLISHED_V4 または FWPM_LAYER_ALE_FLOW_ESTABLISHED_V6) のいずれかでコールアウトがフィルタリング エンジンに追加されている 場合、その classifyFn コールアウト関数はアクションの FWP_ACTION_BLOCK を返すべきではありません。 ALE フローで確立されたフィルタリング レイヤーのいずれかで、接続を承認または拒否することを決定しないでください。 このような決定は、常に他の ALE フィルタリング レイヤーの 1 つで行う必要があります。

このような classifyFn コールアウト関数がアクションのFWP_ACTION_BLOCKを返す唯一の有効な理由は、確立された接続が終了しない場合に潜在的なセキュリティ リスクを引き起こす可能性のあるエラーが発生した場合です。 この場合、アクションの FWP_ACTION_BLOCK を返した場合、潜在的なセキュリティ リスクが悪用されることを防ぐために接続が閉じられます。

コールアウト関数の実行時間

フィルター エンジンは通常、IRQL = DISPATCH_LEVEL でコールアウトのコールアウト関数を呼び出すので、システムを効率的に実行し続けるために、これらの関数ができるだけ早く実行を完了するようにします。 IRQL = DISPATCH_LEVEL での拡張実行は、システムの全体的なパフォーマンスに悪影響を与える可能性があります。

受信データ パスへの挿入

元のパケットのチェックがサム IP パケット フラグメントから再構成されるときに正しくなくなっている可能性があるため、コールアウトでは、受信データ パスに挿入するパケット挿入関数を呼び出す前に IP チェックサム を再計算する必要があります。 ネット バッファー リストがフラグメントから再構築されるかどうかを示す信頼性の高いメカニズムはありません。

トランスポート層からの TCP パケットのインライン挿入

TCP スタックのロック動作により、トランスポート層のコールアウトは、classifyFn コールアウト関数から新しい TCP パケットまたは複製された TCP パケットを挿入できません。 インライン挿入が必要な場合は、コールアウトで DPC をキューに入れ、挿入を実行する必要があります。

発信 IP ヘッダーの配置

パケット 挿入関数の 1 つを使用してパケット データを発信パスに挿入する場合は、ネット バッファー リスト (NET_BUFFER_CURRENT_MDL (NET_BUFFER_LIST_FIRST_NB(netBufferList))) の IP ヘッダーを記述する MDL のポインターがアラインされている必要があります。 着信パケットの IP ヘッダー MDL はポインターアラインされている可能性があるため、発信パスに受信パケットを挿入するときに、コールアウトで IP ヘッダーを再構築する必要があります (まだアラインされていない場合)。

Windows フィルタリング プラットフォーム コールアウト ドライバー