分類コールアウトの非同期の処理
WFP コールアウト ドライバーは、アクションの種類 FWP_ACTION_PERMIT、FWP_ACTION_CONTINUE、または FWP_ACTION_BLOCK を classifyFn 吹き出し関数から返すことによって、ネットワーク操作を承認または拒否したり、ネットワーク パケットを許可または拒否したりすることができます。 多くの場合、コールアウト ドライバーは、分類可能なフィールド、メタデータ、パケットなどの指定された情報をユーザー モード アプリケーションなどの別のコンポーネントに処理するために転送できるようになるまで、その classifyFn 関数から検査の決定を返すことができません。 このような場合は、後で非同期的に決定する必要があります。
非同期処理の一般的な規則
WFP では、classifyFn 吹き出し関数の非同期処理がサポートされています。 しかし、これを行うためのメカニズムは、層によって異なります。
非同期 ALE 分類
コールアウト ドライバーは、FwpsPendOperation0 関数を classifyFn から呼び出す必要があります。 非同期操作は、FwpsCompleteOperation0 関数の呼び出しで完了する必要があります。
非同期パケット分類
コールアウト ドライバーは、FWPS_CLASSIFY_OUT_FLAG_ABSORB フラグを設定して classifyFn 関数から FWP_ACTION_BLOCK を返す必要があります。 ネットワーク パケットは参照または複製する必要があります。 非同期操作は、複製または変更されたパケットを再挿入するか、またはパケットをサイレント モードで破棄することによって完了します。
パケットを含む非同期 ALE 分類
前の 2 つの手順の組み合わせが使用されます。分類操作がペンドされ、パケットが参照または複製され、後で classifyFn の呼び出しが完了し、複製されたパケットが再挿入または破棄されます。
特殊ケースと考慮事項
ALE Connect と Receive/Accept レイヤー
FwpsCompleteOperation0 が ALE Connect レイヤー (FWPS_LAYER_ALE_AUTH_CONNECT_V4 または FWPS_LAYER_ALE_AUTH_CONNECT_V6) でベンド分類操作を完了するために呼び出されると、ALE の再認証の分類操作がそれぞれの ALE Connect レイヤーでトリガーされます。 コールアウト ドライバーは、この再認証の分類操作から検査の決定を返す必要があります。 FWP_CONDITION_FLAG_IS_REAUTHORIZE フラグが設定されているかどうかをチェックすることで、ALE 再認証の分類操作を検出できます。
コールアウト ドライバーは、FwpsCompleteOperation0 によってトリガーされる再認証中に各分類操作の検査決定を検索できるように、ペンドされたALE_AUTH_CONNECT分類操作ごとに一意の状態を保持する必要があります。 ペンドされた ALE_AUTH_CONNECT 分類操作中にパケットが参照または複製された場合 (たとえば、TCP 以外の接続の場合)、再認証が行われた後に再び挿入できます。
FwpsCompleteOperation0 が ALE Receive/Accept レイヤー (FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V4 または FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V6) で分類操作中に呼び出されると、FwpsCompleteOperation0 は ALE 再認証をトリガーしません。 代わりに、変更がフィルターをバイパスするのに十分な大きさではなかった場合に、複製されたパケットが着信に再挿入されたときに、classifyFn への新しい呼び出しが再度行われます。 ALE_RECV_ACCEPT レイヤーから自己挿入複製を許可すると、着信接続が効果的に承認されます。 着信接続を許可しない場合は、FwpsCompleteOperation0 を呼び出した後、着信パケットをカードを破棄します。
ALE 再認証
コールアウト ドライバーは、ポリシーの変更 (レイヤーでのフィルターの追加または削除など)、新しい到着インターフェイスの検出、IPsec を使用した接続の再キー設定などのイベントの ALE Connect または Receive/Accept レイヤーで再分類できます。 このような再認証は、FwpsCompleteOperation0 を呼び出して保留にすることはできません。また、この操作を行う必要はありません。 コールアウト ドライバーでは、再認証中に示されたパケットを処理するために、前述の規則を使用する必要があります。
受信パケットと送信パケットの両方が、ALE_AUTH_CONNECT または ALE_RECV_ACCEPT レイヤーで再認証できることに注意してください。 たとえば、受信パケットは、ALE_AUTH_CONNECT レイヤーで再認証できます。 吹き出しドライバーは、パケットの方向が接続の方向と同じであることを想定しないでください。
ALE_FLOW_ESTABLISHED レイヤー
これらのレイヤー (FWPS_LAYER_ALE_FLOW_ESTABLISHED_V4 または FWPS_LAYER_ALE_FLOW_ESTABLISHED_V6) では、非同期処理はサポートされていません。
INBOUND_TRANSPORT レイヤー
コールアウト ドライバーは、受信 (着信) トランスポート層 (FWPS_LAYER_INBOUND_TRANSPORT_V4 または FWPS_LAYER_INBOUND_TRANSPORT_V6) で ALE 分類処理を必要とするパケットの非同期処理を実行してはなりません。 これを行うと、フローの作成を妨げる可能性があります。 WFP は、受信トランスポート層で classifyFn 吹き出し関数を呼び出すときに、ALE 分類処理を必要とするパケットに対して FWPS_METADATA_FIELD_ALE_CLASSIFY_REQUIRED フラグを設定します。 コールアウト ドライバーは、INBOUND_TRANSPORT レイヤーからのこのようなパケットを許可し、ALE_RECV_ACCEPT レイヤーに到達するまで処理を延期する必要があります。
STREAM レイヤー
ストリーム レイヤー (FWPS_LAYER_STREAM_V4 または FWPS_LAYER_STREAM_V6) では、IP または TCP ヘッダーの代わりに TCP データセグメントが示されます。 ストリーム レイヤーでは、ネット バッファー リストのチェーンを classifyFn 吹き出し関数の 1 回の呼び出しで示すこともできます。 WFP では、ストリーム レイヤーの吹き出しを使用するための特殊な複製および挿入関数 FwpsCloneStreamData0 と FwpsStreamInjectAsync0 を使用できます。
ストリーム レイヤー データの順序指定された配信の性質上、吹き出しドライバーは、ストリーム データがまだ保留中である限り、データの複製と吸収を継続する必要があります。 特定のストリーム フローに対して非同期操作と同期操作を混在させると、未定義の動作が発生する可能性があります。