WFP 圖說網路驅動程式可以透過在 classifyFn圖示函式中傳回動作類型 FWP_ACTION_PERMIT、FWP_ACTION_CONTINUE或 FWP_ACTION_BLOCK,以授權或拒絕網路作業,或允許或拒絕網路封包。 註標驅動程式通常無法從其 分類Fn 函式做出檢查決策,直到像可分類欄位、元數據或封包等指定的資訊能夠被轉送給另一個元件處理,例如使用者模式應用程式。 在這些情況下,可能必須在稍後以異步方式進行決策。
異步處理的一般規則
WFP 支援異步處理 classifyFn callout 函式。 不過,執行這項作的機制會根據不同的層級而有所不同。
異步 ALE 分類
呼叫驅動程式必須從 classifyFn 呼叫 FwpsPendOperation0 函式。 異步操作必須透過呼叫 FwpsCompleteOperation0 函式來完成。
異步封包分類
圖說文字驅動程式應該從 classifyFn 函式中返回 FWP_ACTION_BLOCK,並設置 FWPS_CLASSIFY_OUT_FLAG_ABSORB 旗標。 網路封包必須被參考或複製。 異步操作可以通過重新插入複製或修改後的封包,或無干擾地捨棄封包來完成。
包含封包的異步 ALE 分類
會使用前兩個程序的組合:分類操作會被暫停,封包會被參考或複製,稍後再呼叫 classifyFn 來完成分類,然後將複製的封包重新注入或丟棄。
特殊案例和考慮
ALE 連接與接收/接受層 的比較
當 FwpsCompleteOperation0 被呼叫以完成 ALE 連接層(FWPS_LAYER_ALE_AUTH_CONNECT_V4 或 FWPS_LAYER_ALE_AUTH_CONNECT_V6)的掛起分類作業時,ALE 重新驗證分類作業將在相應的 ALE 連接層觸發。 擴展驅動程式應該從此重新授權分類作業傳回檢視決定。 您可以藉由檢查是否已設定 FWP_CONDITION_FLAG_IS_REAUTHORIZE 旗標,來偵測 ALE 的重新授權分類作業。
標注驅動程式必須為每個掛起的 ALE_AUTH_CONNECT 分類作業維護唯一狀態,以便在 FwpsCompleteOperation0觸發的重新授權期間,可以查找每個分類作業的檢查決策。 如果在暫停中的 ALE_AUTH_CONNECT 分類作業期間參考或複製了封包(例如,用於非 TCP 連線),則重新授權發生後,就可以再次注入這些封包。
當 FwpsCompleteOperation0 在 ALE 接收/接受層進行分類作業時(FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V4 或 FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V6),FwpsCompleteOperation0 不會觸發 ALE 重新授權。 相反地,如果複製的封包重新傳入,且該修改不夠明顯,無法繞過篩選條件,就會再次呼叫 classifyFn。 允許從ALE_RECV_ACCEPT層自我插入的複製品有效地授權連入連線。 如果不允許連入連線,則在其呼叫FwpsCompleteOperation0後捨棄該傳入封包。
ALE 重新授權
呼叫驅動程式可以在 ALE 連接或接收/接受層重新分類,針對例如原則變更(例如在層中新增或移除篩檢)、偵測新的到達介面,或使用 IPsec 重新鑑別連線的事件。 這類重新授權不能透過呼叫 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)。
進口運輸層
呼叫驅動程式不得對需要在進入傳輸層進行 ALE 分類處理的封包執行異步處理(FWPS_LAYER_INBOUND_TRANSPORT_V4 或 FWPS_LAYER_INBOUND_TRANSPORT_V6)。 這樣做可能會干擾流程建立。 當 WFP 在接收到的傳輸層上調用 classifyFn 呼叫函式時,會為需要 ALE 分類處理的封包設定 FWPS_METADATA_FIELD_ALE_CLASSIFY_REQUIRED 標誌。 呼叫驅動程序應該允許來自INBOUND_TRANSPORT層的這類封包,而且應該延遲處理它們,直到到達ALE_RECV_ACCEPT層為止。
STREAM 層
在數據流層(FWPS_LAYER_STREAM_V4 或 FWPS_LAYER_STREAM_V6),會指出TCP數據區段,而不是IP或TCP標頭。 串流層也是可以在一次對 classifyFn 回呼函式的呼叫中,指定一系列網路緩衝區清單的位置。 WFP 提供專用的複製和插入函式,FwpsCloneStreamData0 和 FwpsStreamInjectAsync0,供流層呼叫使用。
由於流層數據的已排序傳遞本質,呼叫驅動程式必須繼續複製和吸收數據,只要有任何流數據仍待處理。 混合指定數據流的異步和同步作業可能會導致未定義的行為。