コールアウトの種類

WFP では、次の種類のコールアウトを使用できます。

インライン検査コールアウト
この種類のコールアウトは、常に classifyFn 関数から FWP_ACTION_CONTINUE を返し、ネットワーク トラフィックを変更することはありません。 ネットワーク統計情報を収集するコールアウトは、この種類のコールアウトの例です。

この種類のコールアウトでは、フィルター アクションの種類 (FWPS_ACTION0 構造体の Type メンバーで指定される) を FWP_ACTION_CALLOUT_INSPECTION に設定する必要があります。

帯域外検査コールアウト
この種類のコールアウトは、ネットワーク トラフィックを変更しません。 代わりに、指示されたデータを「保留」し、classifyFn 関数の外部で行われる検査を延期し、パケット挿入関数の 1 つを使用して、保留されたデータを TCP/IP スタックに再挿入します。 「保留」は、まず指定されたデータを複製し、次に FWPS_CLASSIFY_OUT_FLAG_ABSORB ビットがセットされた classifyFn 関数から FWP_ACTION_BLOCK を返すことで実装されます。

インライン修正コールアウト
この種類のコールアウトは、まず指定されたデータの複製を作成してからその複製を変更し、最後に classifyFn 関数から TCP/IP スタックに挿入することで、ネットワーク トラフィックを変更します。 この種類のコールアウトは、FWPS_CLASSIFY_OUT_FLAG_ABSORB ビットが設定されている classifyFn 関数から FWP_ACTION_BLOCK も返します。

この種類のコールアウトのフィルター アクションの種類は、FWP_ACTION_CALLOUT_TERMINATING に設定する必要があります。

帯域外変更コールアウト
この種類のコールアウトは、最初に intentToModify パラメーターを TRUE に設定した FwpsReferenceNetBufferList0 関数を使用して、指定されたパケットを参照します。 次にコールアウトは、classifyFn 関数から FWPS_CLASSIFY_OUT_FLAG_ABSORB ビットがセットされた FWP_ACTION_BLOCK を返します。 パケットを classifyFn の外部で変更する準備ができたら、コールアウトは参照されたパケットを複製します (複製されるとすぐに、元のパケットを逆参照できます)。 その後、コールアウトは複製を変更し、変更されたパケットを TCP/IP スタックに挿入します。

この種類のコールアウトのフィルター アクションの種類は、FWP_ACTION_CALLOUT_TERMINATING に設定する必要があります。

リダイレクト コールアウト
この種類のコールアウトの詳細については、「バインドまたは接続リダイレクトの使用」を参照してください。

リダイレクト コールアウトには、次の 2 種類があります。

  • バインド リダイレクト コールアウトは、コールアウト ドライバーがソケットのローカル アドレスとローカル ポートを変更できるようにします。
  • 接続リダイレクト コールアウトを使用すると、コールアウト ドライバーは、接続のリモート アドレスとリモート ポートを変更できます。

この種類のコールアウトのフィルター アクションの種類は、FWP_ACTION_PERMIT に設定する必要があります。

FWPS_CLASSIFY_OUT_FLAG_ABSORB の詳細については、「FWPS_CLASSIFY_OUT0」を参照してください。 このフラグは、すべての WFP 廃棄レイヤーで無効です。 classifyFn 関数から FWPS_CLASSIFY_OUT_FLAG_ABSORB フラグが設定された FWP_ACTION_BLOCK を返すと、パケットは WFP 破棄レイヤーのいずれにもヒットせず、監査イベントが生成されることもなく、そのまま破棄されます。

複製されたネット バッファー リストは、たとえば、ネット バッファーまたは MDL、またはその両方を追加または削除することで変更できますが、コールアウトは FwpsFreeCloneNetBufferList0 関数を呼び出す前に、そのような変更を元に戻す必要があります。

パケット検査、パケット変更、または接続リダイレクトを実行する他のコールアウトと共存するには、パケットが reference/clone-drop-reinject メカニズムで保留される前に、コールアウトは、classifyFn 関数によって返された FWPS_CLASSIFY_OUT0 構造体の rights メンバーの FWPS_RIGHT_ACTION_WRITE フラグをクリアして、元のパケットを「ハード」ドロップする必要があります。 classifyFn が呼び出されたときに FWPS_RIGHT_ACTION_WRITE フラグが設定されている場合 (パケットが保留され、後で再挿入または変更される可能性があることを意味します)、コールアウトは指示を保留してはならず、現在のアクションの種類を変更してはなりません。また、変更される可能性のある複製を挿入するために、より重要度の高いコールアウトを待機する必要があります。

コールアウトが分類を保留にするたびに、FWPS_RIGHT_ACTION_WRITE フラグを設定する必要があります。 コールアウト ドライバーは、FWPS_RIGHT_ACTION_WRITE フラグをテストして、コールアウトがアクションを返す権限を確認する必要があります。 このフラグが設定されていない場合でも、コールアウトは、FWP_ACTION_BLOCK アクションを返して前のコールアウトによって返された FWP_ACTION_PERMIT アクションを拒否することができます。 「詳細な検査にコールアウトを使用する」に示されている例では、フラグが設定されていない場合、関数は終了します。

FwpsPendOperation0 関数は、FWPM_LAYER_ALE_RESOURCE_ASSIGNMENT_XXXFWPM_LAYER_ALE_AUTH_LISTEN_XXX、または FWPM_LAYER_ALE_AUTH_CONNECT_XXX management フィルタリング レイヤーから送信されるペンド パケットに使用されます。

FwpsPendClassify0 関数は、次のランタイム フィルタリング レイヤーから送信されたパケットを保留するために使用されます。

FWPS_LAYER_ALE_ENDPOINT_CLOSURE_V4 FWPS_LAYER_ALE_ENDPOINT_CLOSURE_V6 FWPS_LAYER_ALE_CONNECT_REDIRECT_V4 FWPS_LAYER_ALE_CONNECT_REDIRECT_V6 FWPS_LAYER_ALE_BIND_REDIRECT_V4 FWPS_LAYER_ALE_BIND_REDIRECT_V6