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宏的结果(请参阅 使用 NTSTATUS 值),指定是否在 IRP 的 IO_STATUS_BLOCK 结构中使用成功状态值完成完成例程。

[in] InvokeOnError

指定是否在 IRP 的 IO_STATUS_BLOCK 结构中使用非uccess 状态值完成 IRP 时调用完成例程。

[in] InvokeOnCancel

指定在驱动程序或内核调用 IoCancelIrp 以取消 IRP 时调用完成例程。

返回值

此例程在成功时返回STATUS_SUCCESS;如果内存不足,则返回STATUS_INSUFFICIENT_RESOURCES作。

言论

IoSetCompletionRoutine不同,IoSetCompletionRoutineEx 例程返回 NTSTATUS 值。 驱动程序必须检查此值,以确定是否已成功注册 IoCompletion 例程。 如果成功注册了 IoCompletion 例程,IoSetCompletionRoutineEx 将分配在 IoCompletion 例程执行之前保持分配的内存。 驱动程序必须确保其 IoCompletion 例程通过调用 IoCallDriver;否则,内核将泄漏内存。

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)HwStorPortProhibitedDDI(storport)IoAllocateForward(wdm)IoAllocateIrpSignalEventInCompletion(wdm)IoAllocateIrpSignalEventInCompletion2(wdm)IoAllocateIrpSignalEventInCompletion3(wdm) 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