フロー削除コールアウトの処理

吹き出しによって処理されているデータ フローが停止すると、吹き出しドライバーが以前にコンテキストをデータ フローに関連付けた場合、フィルター エンジンは吹き出しの flowDeleteFn 吹き出し関数を呼び出します。 吹き出しの flowDeleteFn 吹き出し関数は、データ フローが停止する前に、データ フローに関連付けられている吹き出しドライバーのコンテキストの必要なクリーンアップを実行します。

次に例を示します。

// Context structure to be associated with data flows
typedef struct FLOW_CONTEXT_ {
  ...
} FLOW_CONTEXT, *PFLOW_CONTEXT;

#define FLOW_CONTEXT_POOL_TAG 'fcpt'

// flowDeleteFn callout function
VOID NTAPI
 FlowDeleteFn(
    IN UINT16  layerId,
    IN UINT32  calloutId,
    IN UINT64  flowContext
    )
{
  PFLOW_CONTEXT context;

  // Get the flow context structure
 context = (PFLOW_CONTEXT)flowContext;

  // Cleanup the flow context structure
  ...

  // Free the memory for the flow context structure
 ExFreePoolWithTag(
 context,
    FLOW_CONTEXT_POOL_TAG
    );
}

フィルター エンジンは、データ フローが停止したときに、データ フローに関連付けられた吹き出しのコンテキストを自動的に削除します。 そのため、データ フローからコンテキストを削除するために、flowDeleteFn 吹き出し関数から FwpsFlowRemoveContext0 関数を呼び出す必要はありません。