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 值,例如下列其中一項:
| 傳回碼 | 描述 |
|---|---|
|
小型篩選驅動程序的實例正在被拆毀。 這是錯誤碼。 |
|
FltRequestOperationStatusCallback 發生集區配置失敗。 這是錯誤碼。 |
|
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 |