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