IoSetCancelRoutine 函式 (wdm.h)

如果取消指定的 IRP,IoSetCancelRoutine 例程會設定要呼叫的驅動程式提供的 Cancel 例程。

語法

PDRIVER_CANCEL IoSetCancelRoutine(
  [in] PIRP           Irp,
  [in] PDRIVER_CANCEL CancelRoutine
);

參數

[in] Irp

要放入或移除可取消狀態之 IRP 的指標。

[in] CancelRoutine

指定要在指定的 IRP 取消時呼叫之呼叫端提供的 Cancel 例程進入點,如果指定的 IRP 已從可取消的狀態移除,則為 NULL 。 此例程宣告如下:

VOID
(*PDRIVER_CANCEL)(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp
    );

傳回值

IoSetCancelRoutine 會傳回先前的 Irp-CancelRoutine> 值。 如果先前未設定 任何 Cancel 例程,或 IRP 取消正在進行中, IoSetCancelRoutine 會傳回 NULL

備註

此例程可以停用 IRP 中目前設定的 Cancel 例程。

如果驅動程式在裝置物件中使用 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