共用方式為


FltRequestOperationStatusCallback 函式 (fltkernel.h)

FltRequestOperationStatusCallback 傳回指定 I/O 作業的狀態資訊。

語法

NTSTATUS FLTAPI FltRequestOperationStatusCallback(
  [in]           PFLT_CALLBACK_DATA                 Data,
  [in]           PFLT_GET_OPERATION_STATUS_CALLBACK CallbackRoutine,
  [in, optional] PVOID                              RequesterContext
);

參數

[in] Data

I/O 作業的回呼資料 (FLT_CALLBACK_DATA) 結構的指標。 這是必要參數,而且無法 NULL

[in] CallbackRoutine

篩選管理員 IoCallDriver 傳回之後呼叫的回呼例程指標。 這是必要參數,而且無法 NULL

[in, optional] RequesterContext

要傳遞至 CallbackRoutine的內容指標。 這個參數是選擇性的,而且可以 NULL

傳回值

FltRequestOperationStatusCallback 會傳回STATUS_SUCCESS或適當的 NTSTATUS 值,例如下列其中一項:

傳回碼 描述
STATUS_FLT_DELETING_OBJECT
小型篩選驅動程序的實例正在被拆毀。 這是錯誤碼。
STATUS_INSUFFICIENT_RESOURCES
FltRequestOperationStatusCallback 發生集區配置失敗。 這是錯誤碼。
STATUS_INVALID_PARAMETER
FltRequestOperationStatusCallback 是從不是預先作回呼 (PFLT_PRE_OPERATION_CALLBACK) 例程的例程呼叫,或 I/O 作業是IRP_MJ_CLOSE要求。 這是錯誤碼。

言論

小型篩選驅動程式可以針對 IRP 型 I/O 作業呼叫 FltRequestOperationStatusCallback,以取得針對作業傳回 IoCallDriver 的狀態值。

大部分的小型篩選驅動程式都不需要呼叫 FltRequestOperationStatusCallback。 一般而言,小型篩選驅動程式只會呼叫此例程,以判斷是否授與要求的 oplock。

FltRequestOperationStatusCallback 只能從小型篩選驅動程式的預先作回呼 (PFLT_PRE_OPERATION_CALLBACK) 例程呼叫。

FltRequestOperationStatusCallback 只能針對非IRP_MJ_CLOSE IRP 型作業呼叫。 若要判斷作業是否為 IRP 型作業,請使用 FLT_IS_IRP_OPERATION 巨集。

如果 IRP 型作業是IRP_MJ_CLOSE要求,則會傳回STATUS_INVALID_PARAMETER。

FltRequestOperationStatusCallback 會將 I/O 參數區塊 (FLT_IO_PARAMETER_BLOCK) 的內容複製到回呼數據的 Iopb 成員(FLT_CALLBACK_DATA),而這是 Filter Manager 會傳遞至 CallbackRoutine 參數中指定的例程的回呼數據。 複製的數據代表 I/O 參數區塊的快照集,當時預先作回呼 (PFLT_PRE_OPERATION_CALLBACK) 例程會呼叫 FltRequestOperationStatusCallback。 如果預先作回呼例程在呼叫 FltRequestOperationStatusCallback之後變更 I/O 參數區塊,則篩選管理員傳遞給 CallbackRoutine 的 I/O 參數區塊會與篩選驅動程式在呼叫 ioCallDriver時傳遞驅動程式堆棧的 I/O 參數區塊不同。

下列來自 preoperation 回呼例程的程式代碼範例說明這種情況的發生方式:

PFLT_CALLBACK_DATA Data;
PFLT_GET_OPERATION_STATUS_CALLBACK CallbackRoutine;
PVOID RequesterContext;
...
if (iopb->MajorFunction == IRP_MJ_READ) {
    FltRequestOperationStatusCallback (Data, CallbackRoutine, RequesterContext);
 Data->Iopb->Parameters.Read.ReadBuffer = newBuffer;
    ...
}

在此範例中,讀取緩衝區會在呼叫 FltRequestOperationStatusCallback之後變更,因此當篩選管理員呼叫 CallbackRoutine時,它會傳入舊緩衝區的指標,而不是新的緩衝區。

篩選管理員會在 IRQL <= APC_LEVEL 的原始線程內容中呼叫指定的 CallbackRoutine

要求

要求 價值
目標平臺 普遍
標頭 fltkernel.h (包括 Fltkernel.h)
連結庫 Fltmgr.lib
DLL Fltmgr.sys
IRQL <= APC_LEVEL

另請參閱

FLT_CALLBACK_DATA

FLT_IO_PARAMETER_BLOCK

FLT_IS_IRP_OPERATION

FLT_RELATED_OBJECTS

IoCallDriver

PFLT_GET_OPERATION_STATUS_CALLBACK

PFLT_PRE_OPERATION_CALLBACK