IoSetCompletionRoutineEx 函式 (wdm.h)
IoSetCompletionRoutineEx 例程會註冊 IoCompletion 例程,當下一個較低層級驅動程式已完成指定 IRP 的要求作業時,就會呼叫此例程。
語法
NTSTATUS IoSetCompletionRoutineEx(
[in] PDEVICE_OBJECT DeviceObject,
[in] PIRP Irp,
[in] PIO_COMPLETION_ROUTINE CompletionRoutine,
[in, optional] PVOID Context,
[in] BOOLEAN InvokeOnSuccess,
[in] BOOLEAN InvokeOnError,
[in] BOOLEAN InvokeOnCancel
);
參數
[in] DeviceObject
驅動程式裝置物件的指標。
[in] Irp
驅動程式正在處理的 IRP 指標。
[in] CompletionRoutine
指定驅動程式提供的進入點 IoCompletion 例程,當下一個較低的驅動程式完成封包時呼叫。
[in, optional] Context
要傳遞至 IoCompletion 例程之驅動程式決定內容的指標。 內容信息必須儲存在非分頁記憶體中,因為會在 IRQL <= DISPATCH_LEVEL呼叫 IoCompletion 例程。
[in] InvokeOnSuccess
指定是否根據NT_SUCCESS巨集的結果,以 IRP IO_STATUS_BLOCK 結構的成功狀態值完成 IRP 時呼叫完成例程(請參閱使用 NTSTATUS 值 )。
[in] InvokeOnError
指定是否在 IRP 的 IO_STATUS_BLOCK 結構中,以非uccess 狀態值完成 IRP 時呼叫完成例程。
[in] InvokeOnCancel
指定驅動程式或核心是否已呼叫 IoCancelIrp 取消 IRP 時呼叫完成例程。
傳回值
此例程會在成功時傳回STATUS_SUCCESS,如果作業的記憶體不足,則傳回STATUS_INSUFFICIENT_RESOURCES。
言論
不同於 ioSetCompletionRoutine ,IoSetCompletionRoutineEx 例程會傳回 NTSTATUS 值。 驅動程式必須檢查此值,以判斷是否已成功註冊 IoCompletion 例程。 如果成功註冊 IoCompletion 例程,IoSetCompletionRoutineEx 配置仍會配置記憶體,直到 IoCompletion 例程執行為止。 驅動程式必須藉由呼叫ioCallDriver ,確保其 IoCompletion 例程執行;否則,核心將會流失記憶體。
IoCompletion 例程必須屬於擁有 deviceObject 所指向之裝置對象的驅動程式。 這項需求可防止 IoCompletion 例程在傳回之前卸除。
IoSetCompletionRoutineEx 的行為與 IoSetCompletionRoutine 例程相同,不同之處在於:
IoSetCompletionRoutineEx 保證在 IoCompletion 例程執行之前,不會卸除非即插即用驅動程式。
IoSetCompletionRoutineEx 是傳回 NTSTATUS 值的例程。