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的值。 如果未設定任何 Cancel 例程,或 IRP 取消正在進行中,IoSetCancelRoutine 會傳回 NULL 。
言論
此例程可以停用目前在 IRP 中設定 取消 例程。
如果驅動程式在裝置物件中使用 I/O 管理員提供的裝置佇列,驅動程式必須在呼叫此例程時保留系統取消微調鎖定。 驅動程式會在呼叫 IoAcquireCancelSpinLock 之後,於 IRQL = DISPATCH_LEVEL 執行,直到它釋放 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) |