次の方法で共有


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

Windows フィルター プラットフォームの吹き出しドライバーをプログラムする場合は、次のトピックを検討してください。

ユーザー モードとカーネル モード

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

フィルター レイヤーの選択

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

アプリケーション層強制 (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 フィルタリング プラットフォーム コールアウト ドライバー