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)

另请参阅

IoAcquireCancelSpinLock

IoReleaseCancelSpinLock