FltPerformAsynchronousIo 函式 (fltkernel.h)
小型篩選驅動程式會呼叫 FltPerformAsynchronousIo 來起始異步 I/O 作業。
語法
NTSTATUS FLTAPI FltPerformAsynchronousIo(
[in, out] PFLT_CALLBACK_DATA CallbackData,
[in] PFLT_COMPLETED_ASYNC_IO_CALLBACK CallbackRoutine,
[in] PVOID CallbackContext
);
參數
[in, out] CallbackData
回呼數據的指標(FLT_CALLBACK_DATA)結構,由先前呼叫 FltAllocateCallbackData所配置。 這是必要參數,而且無法 NULL。 呼叫者負責釋放此結構,而呼叫 FltFreeCallbackData不再需要此結構。
[in] CallbackRoutine
PFLT_COMPLETED_ASYNC_IO_CALLBACK型別回呼例程的指標,此例程會在 I/O 作業完成時呼叫。 注意:篩選管理員會在呼叫任何小型篩選驅動程式的後續作回呼 (PFLT_POST_OPERATION_CALLBACK) 例程之後呼叫這個例程,這些驅動程式的實例附加在起始實例下方(Instance 參數中所指定,以 FltAllocateCallbackData)。 這是必要參數,而且無法 NULL。 篩選管理員一律會呼叫此例程,即使 FltPerformAsynchronousIo 失敗也一樣。
[in] CallbackContext
要傳遞至 CallbackRoutine 的內容指標 此參數是選擇性的,而且可以 NULL。
傳回值
FltPerformAsynchronousIo 會傳回STATUS_SUCCESS,表示文件系統已完成 I/O 作業,以及 CallbackRoutine 的回呼例程 已呼叫。 否則,它會傳回適當的NTSTATUS值,例如下列其中一個:
傳回碼 | 描述 |
---|---|
STATUS_FLT_INVALID_ASYNCHRONOUS_REQUEST | 無法以異步方式執行IRP_MJ_CREATE要求。 這是錯誤碼。 |
STATUS_PENDING | 作業傳回STATUS_PENDING。 篩選管理員會呼叫回呼例程,CallbackRoutine I/O 作業完成時指向 。 此程式代碼只會指出作業已起始。 |
STATUS_FLT_IO_COMPLETE | 作業已由小型篩選驅動程式的預先作回呼例程完成,其實例會附加在起始實例下方。 |
言論
小型篩選驅動程式會呼叫 FltPerformAsynchronousIo,以在呼叫 FltAllocateCallback Data 之後起始異步 I/O 作業,以配置作業的回呼數據結構。
FltPerformAsynchronousIo 只會將 I/O 作業傳送至附加在起始實例下方的小型篩選驅動程序實例(Instance 參數中所指定,以 FltAllocateCallbackData),以及文件系統。 附加在指定實例上方的迷你篩選驅動程式不會收到I/O 作業。
迷你篩選驅動程式只能起始 IRP 型 I/O 作業。 它們無法起始快速 I/O 或文件系統篩選器 (FSFilter) 回呼作業。
小型篩選驅動程式應該只針對無法使用下列例程的異步 I/O 作業使用 FltPerformAsynchronousIo:
無法以異步方式執行IRP_MJ_CREATE要求。
回呼數據 (FLT_CALLBACK_DATA) 結構可以隨時釋放或重複使用回呼例程,CallbackRoutine 指向 的回呼例程已被呼叫。 呼叫端可以呼叫 FltFreeCallbackData 來釋放回呼數據結構,或呼叫 FltReuseCallbackData來準備重複使用。
注意
STATUS_SUCCESS和STATUS_FLT_IO_COMPLETE表示 I/O 作業已完成,但未指出 I/O 作業的最終狀態。 若要判斷基礎迷你篩選驅動程式、篩選驅動程式和文件系統傳回的實際作業狀態,CallbackRoutine 應該檢查在 CallbackRoutine的 callbackContext 參數中所接收回呼數據結構的 IoStatus 成員。
因為篩選管理員一律會呼叫回呼例程,CallbackRoutine 指向 ,即使 FltPerformAsynchronousIo 失敗,迷你篩選驅動程式仍可以直接在回呼例程中執行釋放或重複使用作業。
FltPerformAsynchronousIo 的呼叫者可以在 IRQL <= APC_LEVEL,如果在作業 FLT_IO_PARAMETER_BLOCK 結構的 IrpFlags 成員中設定IRP_PAGING_IO旗標, (此旗標僅適用於IRP_MJ_READ、IRP_MJ_WRITE、IRP_MJ_QUERY_INFORMATION和IRP_MJ_SET_INFORMATION作業。否則,呼叫端必須在 IRQL PASSIVE_LEVEL執行。
要求
要求 | 價值 |
---|---|
目標平臺 | 普遍 |
標頭 | fltkernel.h (包括 Fltkernel.h) |
連結庫 | FltMgr.lib |
DLL | Fltmgr.sys |
IRQL | 請參閱一節。 |