次の方法で共有


IoSetCancelRoutine 関数 (wdm.h)

IoSetCancelRoutine ルーチンは、特定の IRP が取り消された場合に呼び出されるドライバー提供 キャンセル ルーチンを設定します。

構文

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

パラメーター

[in] Irp

取り消し可能な状態に配置または削除される IRP へのポインター。

[in] CancelRoutine

指定した IRP が取り消された場合に呼び出す呼び出し元が指定した キャンセル ルーチンのエントリ ポイントを指定するか、指定された IRP が取り消し可能な状態から削除されている場合に NULL します。 このルーチンは、次のように宣言されます。

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