システムのキャンセル スピン ロックの使用
システムは、特定のシステム ルーチンが呼び出されたときに取得または解放される、単一の キャンセル スピン ロックを提供します。
取り消し可能な IRP の状態を変更するドライバー ルーチン (STATUS_CANCELLEDで IRP を完了する可能性があるすべてのルーチンを含む) は、このセクションのガイドラインに従って、システムのキャンセル スピン ロックを取得し、解放する必要があります。
I/O マネージャーが提供するデバイス キューを使用するドライバーでは、IRP のキャンセル可能な状態を変更する Cancel ルーチン以外のすべてのドライバー ルーチンは、最初に IoAcquireCancelSpinLock を呼び出してシステムのスピン ロックを取り消す必要があります。
キャンセル スピン ロックを取得すると、呼び出し元のみがその IRP のキャンセル可能な状態を変更できます。 呼び出し元がスピン ロックを保持している間、I/O マネージャーは、その IRP のドライバーの Cancel ルーチンを呼び出すことはできません。 同様に、 DispatchCleanup ルーチンなどの別のドライバー ルーチンは、その IRP のキャンセル可能な状態を同時に変更しようとすることはできません。
IRP の独自のキューを管理し、ドライバーが提供するスピン ロックを使用してキュー へのアクセスを同期するドライバーでは、ドライバー ルーチンは IoSetCancelRoutine を呼び出す前にスピン ロックのキャンセルを取得する必要はありません。 ただし、これらのドライバーは、 Cancel ルーチンが既に開始されているかどうかを判断するために IoSetCancelRoutine が返す Cancel ルーチン ポインターをチェックする必要があります。 詳細については、 「ドライバー提供のスピン ロックの使用」を参照してください 。
IoAcquireCancelSpinLock を呼び出すドライバー ルーチンは、できるだけ早く IoReleaseCancelSpinLock を呼び出す必要があります。
ドライバーは、スピン ロックを保持しながら、IRP で IoCompleteRequest を呼び出す必要はありません。 スピン ロックを保持しているときに IRP を完了しようとすると、デッドロックが発生する可能性があります。