共用方式為


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)

另請參閱

IoAcquireCancelSpinLock

IoReleaseCancelSpinLock