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