共用方式為


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 值的例程。

要求

要求 價值
目標平臺 普遍
標頭 wdm.h (包括 Wdm.h、Ntddk.h、Ntifs.h)
連結庫 NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <= DISPATCH_LEVEL
DDI 合規性規則 CompleteRequest(wdm)CompleteRequestStatusCheck(wdm)CompletionRoutineRegistered(wdm)HwStorPortProhibitedDIS(storport)IoAllocateForward(wdm)IoAllocateIrpSignalEventInCompletion(wdm)IoAllocateIrpSignalEventInCompletion2(wdm)IoAllocateIrpSignalEventInCompletion3(wdm)IoAllocateIrpSignalEventInCompletionTimeout(wdm)IoBuildFsdForward(wdm)IoBuildFsdIrpSignalEventInCompletion(wdm)IoBuildFsdIrpSignalEventInCompletion2(wdm)IoBuildFsdIrIoBuildFsdIrpSignalEventInCompletionTimeout(wdm)IoSetCompletionExCompleteIrp(wdm)IoSetCompletionRoutineExCheck(wdm)IoSetCompletionRoutineExCheckDeviceObject(wdm)LowerDriverReturn(wdm)MarkPower(wdm)MarkPowerDown(wdm)MarkQueryRelations(wdm)MarkStartDevice(wdm)PendedCompletedRequestEx(wdm)SetCompletionRoutineFromDispatch(kmdf)SignalEventInCompletion(wdm)SignalEventInCompletion2(wdm)SignalEventInCompletion3(wdm)StartDeviceWait2(wdm)StartDeviceWait4(wdm)

另請參閱

IO_STACK_LOCATION

IRP

IoAllocateIrp

IoBuildAsynchronousFsdRequest

IoBuildPartialMdl

IoCompletion

IoFreeIrp

IoSetCompletionRoutine