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