FltCbdqInsertIo 函式 (fltkernel.h)

FltCbdqInsertIo 會將 I/O 作業的回呼數據結構插入篩選驅動程式的回呼數據佇列。

語法

NTSTATUS FLTAPI FltCbdqInsertIo(
  [in, out]      PFLT_CALLBACK_DATA_QUEUE            Cbdq,
  [in]           PFLT_CALLBACK_DATA                  Cbd,
  [in, optional] PFLT_CALLBACK_DATA_QUEUE_IO_CONTEXT Context,
  [in, optional] PVOID                               InsertContext
);

參數

[in, out] Cbdq

呼叫端取消安全回呼數據佇列的指標。 此佇列必須透過呼叫 FltCbdqInitialize 來初始化。

[in] Cbd

要排入佇列之 I/O 作業 的回呼數據指標 (FLT_CALLBACK_DATA) 結構。 此作業必須是 IRP 型 I/O 作業。

[in, optional] Context

呼叫端提供的變數,可接收 I/O 要求的不透明內容指標。 篩選驅動程式可以使用這個指標來識別佇列中的特定專案,以便藉由呼叫 FltCbdqRemoveIo 加以移除。 如果篩選驅動程式不需要從佇列中移除特定的 I/O 要求,此參數可以是 NULL

[in, optional] InsertContext

要傳遞至篩選驅動程式 之「Azure AzureInsertIo 回 呼例程」的內容指標。

傳回值

FltCbdqInsertIo 會在回呼數據結構插入回呼數據佇列或適當的 NTSTATUS 值時傳回STATUS_SUCCESS,如下所示:

傳回碼 Description
STATUS_FLT_CBDQ_DISABLED 回呼數據結構未插入回呼數據佇列中,因為佇列目前已停用。 若要重新啟用佇列,請呼叫 FltCbdqEnable。 這是錯誤碼。

注意

如果成功, FltCbdqInsertIo 會傳回篩選的 InsertIo 回呼傳回的任何內容;例如,篩選可能會傳回STATUS_SUCCESS或STATUS_PENDING,以指出成功。 篩選條件在用來指出成功的值時,請務必自我一致。

備註

FltCbdqInsertIo 會將指定的回呼數據 (FLT_CALLBACK_DATA) 結構插入篩選驅動程式的回呼數據佇列中。

  • 請注意,在插入回呼數據的篩選驅動程式與正在取消的相關 IRP 之間有潛在的競爭條件。 如果已取消 IRP,可以立即叫用佇列的取消例程來避免這個問題。

篩選驅動程式可以使用 FltCbdqXxx 例程來實作 IRP 型 I/O 作業的回呼數據佇列。 透過使用這些例程,篩選驅動程式可以讓佇列取消安全;系統會以透明方式處理篩選驅動程式的 I/O 取消。

FltCbdqXxx 例程只能用於 IRP 型 I/O 作業。 若要判斷指定的回呼數據結構是否代表以 IRP 為基礎的 I/O 作業,請使用 FLT_IS_IRP_OPERATION 宏。

回呼數據佇列會藉由呼叫 FltCbdqInitialize 來初始化。 FltCbdqInsertIo 會使用佇列分派數據表中提供的函式來鎖定佇列,並將回呼數據結構插入佇列中。 插入作業本身是由佇列的 一個其一 例程所執行。

如需如何建立回呼數據佇列的詳細資訊,請參閱 FltCbdqInitialize 。 使用 FltCbdqRemoveIo 從佇列中移除特定的 I/O 要求,或 FltCbdqRemoveNextIo 移除下一個可用的 I/O 要求。

如果佇列受到 微調鎖定 保護,而不是 mutex 物件資源變數FltCbdqInsertIo 的呼叫端可以在 IRQL <= DISPATCH_LEVEL執行。 如果使用 mutex 或資源,呼叫端必須在 IRQL <= APC_LEVEL執行。

規格需求

需求
目標平台 Universal
標頭 fltkernel.h (包含 Fltkernel.h)
IRQL 請參閱一節。

另請參閱

FLT_CALLBACK_DATA

FLT_CALLBACK_DATA_QUEUE

FLT_IS_IRP_OPERATION

FltCbdqDisable

FltCbdqEnable

FltCbdqInitialize

FltCbdqRemoveIo

FltCbdqRemoveNextIo