共用方式為


串流檢查

內嵌資料流程檢查

內嵌資料流程修飾詞可以藉由允許或封鎖FWPS_STREAM_CALLOUT_IO_PACKET0結構之 countBytesEnforced成員的值,藉此編輯資料流程資料,方法是從classifyFn圖說文字函式傳回FWP_ACTION_PERMITFWP_ACTION_BLOCK。 他們也可以呼叫 FwpsStreamInjectAsync0 函式,將新內容新增至資料流程。 此內容可以是新內容,也可以取代封鎖的資料。

例如,若要取代在指示區段中間找到的模式 (, n 個位元組後面接著 p 位元組的模式,後面接著 m 個位元組) ,圖說文字會遵循下列步驟:

  1. 圖說文字的classifyFn函式是使用n + p + m位元組來呼叫。

  2. 圖說文字會 傳回FWP_ACTION_PERMIT並將 countBytesEnforced 成員設定為 n

  3. 圖說文字的classifyFn函式會以p + m位元組再次呼叫。 如果countBytesEnforced小於指定的數量,則其會再次呼叫classifyFn

  4. classifyFn 函式中,圖說文字會呼叫 FwpsStreamInjectAsync0 函式來插入取代模式 p'。 圖說文字接著會傳FWP_ACTION_BLOCK,並將 countBytesEnforced設定為p

  5. 圖說文字的 classifyFn 函式會以 m 位元組再次呼叫。

  6. 圖說文字會傳回countBytesEnforced設為m的FWP_ACTION_PERMIT

如果指定的資料不足以讓圖說文字做出檢查決策,它可以將FWPS_STREAM_CALLOUT_IO_PACKET0結構的streamAction成員設定為FWPS_STREAM_ACTION_NEED_MORE_DATA,並將countBytesRequired成員設定為應該在再次指出資料之前累積的最小數量。 設定streamAction時,圖說文字應該會從classifyFn函式傳回FWP_ACTION_NONE

設定 FWPS_STREAM_ACTION_NEED_MORE_DATA 時,其可累積最多 8 MB 的資料流程資料。 在呼叫圖說文字的classifyFn函式且緩衝區空間耗盡時,其會設定FWPS_CLASSIFY_OUT_FLAG_BUFFER_LIMIT_REACHED旗標。 設定後一個旗標時,圖說文字必須接受完整指示的資料。 設定 FWPS_CLASSIFY_OUT_FLAG_NO_MORE_DATA 旗標時,圖說文字不得傳回 FWPS_STREAM_ACTION_NEED_MORE_DATA

為了方便從一般緩衝區掃描串流模式,其提供 FwpsCopyStreamDataToBuffer0 公用程式函式,可將指定的資料流程資料複製到連續緩衝區。

頻外資料流程檢查

針對頻外檢查或修改,串流圖說文字會遵循與封包檢查圖說文字類似的模式:它會先複製所有指定的資料流程區段以供延後處理,然後封鎖這些區段。 檢查或修改過的資料稍後會插入資料流程中。 在頻外插入資料時,圖說文字必須在所有指定的區段上傳回 FWP_ACTION_BLOCK ,以確保結果資料流程的完整性。 頻外檢查模組不得任意插入 FIN (,這表示傳送者) 不會再將資料插入傳出資料流程。 如果模組必須卸載連線,其classifyFn圖說文字函式必須將FWPS_STREAM_CALLOUT_IO_PACKET0結構的streamAction成員設定為FWPS_STREAM_ACTION_DROP_CONNECTION

注意 這是圖說文字從頻外切換到內嵌的 合約違規 ,而且可能會導致非預期的行為。 確定頻外圖說文字元合每個指定的準則。

因為資料流程資料可以指示為 NET_BUFFER_LIST 鏈結,所以 FWP 會提供 FwpsCloneStreamData0FwpsDiscardClonedStreamData0 公用程式函式,以在 net buffer 清單鏈結上運作。

其也支援連入方向的串流資料節流。 如果圖說文字無法跟上傳入資料速率的步調,它可以傳回 FWPS_STREAM_ACTION_DEFER 以「暫停」資料流程。 接著,您可以藉由呼叫 FwpsStreamContinue0 函式來「繼續」資料流程。 延遲使用此函式的資料流程會導致 TCP/IP 堆疊停止 ACK 處理傳入資料。 這會導致 TCP 滑動視窗減少到 0。

針對頻外資料流程檢查圖說文字,呼叫 FwpsStreamContinue0 時,不得呼叫 FwpsStreamInjectAsync0 函 式。

插入的資料流程資料不會重新指示至圖說文字,但會提供從較低權數子層串流圖說文字。

GitHub 上Windows 驅動程式範例存放庫中的Windows 篩選平台串流編輯範例示範如何在串流層執行內嵌和頻外編輯。

注意 Windows Server 2008 和更新版本不支援在下列程式中移除資料流程篩選:

  • 圖說文字正在執行頻外封包插入。

  • 圖說文字藉由將FWPS_STREAM_CALLOUT_IO_PACKET0結構的streamAction成員設定為FWPS_STREAM_ACTION_NEED_MORE_DATA,以要求更多資料。

  • 圖說文字會將FWPS_STREAM_CALLOUT_IO_PACKET0結構的streamAction成員設定為FWPS_STREAM_ACTION_DEFER,以延遲資料流程。

動態串流檢查

Windows 7 和更新版本支援動態串流檢查。 動態資料流檢查會在現有的資料流程上運作,而不是建立和終止新的資料流程。 可執行動態資料流檢查的圖說文字驅動程式應該在FWPS_CALLOUT1FWPS_CALLOUT2結構的Flags成員中設定FWP_CALLOUT_FLAG_ALLOW_MID_STREAM_INSPECTION旗標。

避免不必要的檢查

若要只在驅動程式感興趣的連線上執行串流檢查,圖說文字可以在 FWPS_CALLOUT0 結構的 Flags 成員中設定 FWP_CALLOUT_FLAG_CONDITIONAL_ON_FLOW 旗標。 所有其他連線都會忽略此圖說文字。 效能將會改善,而且驅動程式不需要維護不必要的狀態資料。

串流層瀑布模型

一個嚴格的瀑布式模型會遵循一個嚴格的瀑布圖層;也就是說,只有當先前的圖說文字 () 明確允許時,才允許此層中的圖說文字檢查資料流程區段。 如果圖說文字封鎖指定的區段,該區段會永久從資料流程取出,而且不允許任何圖說文字檢查它。

此外:

  1. 資料流程層的每個非檢查圖說文字都必須明確地將值指派給classifyOut參數的actionType成員,不論該參數中可能先前設定的值為何。
  2. classifyOut參數許可權成員中的FWPS_RIGHT_ACTION_WRITE旗標在一層中沒有意義。 此圖層的圖說文字不應該檢查此旗標是否存在。 不論classifyOut>許可權的值為何,圖說文字都可以處理指定的layerData參數。