IoSetCancelRoutine 函数 (wdm.h)

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)

另请参阅

IoAcquireCancelSpinLock

IoReleaseCancelSpinLock