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) |