IoSetCancelRoutine 函数 (wdm.h)
IoSetCancelRoutine 例程设置驱动程序提供的 Cancel 例程,以在取消给定的 IRP 时调用。
语法
PDRIVER_CANCEL IoSetCancelRoutine(
[in] PIRP Irp,
[in] PDRIVER_CANCEL CancelRoutine
);
参数
[in] Irp
指向要置于可取消状态或从可取消状态中删除的 IRP 的指针。
[in] CancelRoutine
指定调用方提供的 Cancel 例程的入口点,该例程在指定的 IRP 被取消时要调用;如果给定的 IRP 从可取消状态中删除,则为 NULL 。 此例程的声明如下:
VOID
(*PDRIVER_CANCEL)(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
返回值
IoSetCancelRoutine 返回以前的 Irp-CancelRoutine> 值。 如果以前未设置 Cancel 例程,或者 IRP 取消已在进行中, IoSetCancelRoutine 将返回 NULL。
注解
此例程可以禁用 IRP 中当前设置的 Cancel 例程。
如果驱动程序在设备对象中使用 I/O 管理器提供的设备队列,则驱动程序在调用此例程时必须持有系统取消旋转锁。 驱动程序在调用 IoAcquireCancelSpinLock 后以 IRQL = DISPATCH_LEVEL 运行,直到它使用 IoReleaseCancelSpinLock 释放取消旋转锁。
如果驱动程序管理自己的 IRP 队列,则驱动程序在调用此例程时不需要持有取消旋转锁。 IoSetCancelRoutine 使用互锁交换内部函数将 Cancel 例程的地址设置为原子操作。 减少取消旋转锁的使用可以提高驱动程序性能和整体系统性能。
驱动程序 取消 例程在 IRQL = DISPATCH_LEVEL调用,同时保留取消旋转锁。 Cancel 例程必须先释放取消旋转锁,然后才能返回控制权。
要求
要求 | 值 |
---|---|
目标平台 | 桌面 |
标头 | wdm.h(包括 Wdm.h、Ntddk.h、Ntifs.h) |
Library | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | DISPATCH_LEVEL (请参阅“备注”部分) |
DDI 符合性规则 | IrpCancelField (wdm) , StartIoCancel (wdm) |