次の方法で共有


記憶域クラス ドライバーの IoCompletion ルーチン

記憶域クラス ドライバーには 1 つ以上の IoCompletion ルーチンが必要です。ただし、ドライバーがポート ドライバーに送信するすべての IRP の完了を同期的に待機し、必要に応じて要求を再試行してから、ディスパッチルーチンまたは BuildRequest ルーチン内から SRB のメモリを解放する必要があります。 すべての IRP を同期的に処理すると、クラス ドライバーのパフォーマンスが低下することに注意してください。 さらに、システム ページ ファイルを保持する可能性があるデバイスの記憶域クラス ドライバーは、すべての転送要求を非同期的に処理する必要があるため、読み取り/書き込み要求用の IoCompletion ルーチンが必要です。

記憶域クラス ドライバーの BuildRequest ルーチンで説明されているように、記憶域クラス ドライバーは、ルックアサイド リストまたは非ページ プールに戻るかどうかに関係なく、SRB に割り当てるメモリを解放する役割を担います。 他の上位レベルのカーネル モード ドライバーと同様に、記憶域クラス ドライバーの SplitTransferRequest ルーチンで説明されているように、転送要求を分割する IRP など、割り当てる IRP を解放する役割も担います。

クラス ドライバーの IoCompletion ルーチンは、最終的には、I/O 状態ブロックが設定されていることを確認し、元の IRP を完了します。 IRP の完了には、ディスパッチ ルーチンでの IRP の完了の説明に従って、SRB の ScsiStatus メンバーまたは SenseInfoBuffer メンバーで返されたエラーを NTSTATUS の種類の値に変換したり、エラーをログに記録したりすることが含まれます。

要求の処理中に特定の種類のエラーが発生すると、ストレージ ポート ドライバーは、ターゲット論理ユニット (LU) の内部キューを固定し、要求の完了時に SRB_STATUS_QUEUE_FROZEN を設定します。 そのため、クラス ドライバーには通常、デバイスの I/O 要求のキューの状態を変更する内部ルーチンがあります。 詳細については、記憶域クラス ドライバーの ReleaseQueue ルーチンを参照してください。

ドライバーの BuildRequest ルーチンが、ポート ドライバーが要求のセンス データ要求情報を返すように要求した場合、その IoCompletion ルーチンは内部 InterpretRequestSense ルーチンを呼び出すか、同じ機能をインラインで実装します。 詳細については、記憶域クラス ドライバーの InterpretRequestSense ルーチンを参照してください。

記憶域クラス ドライバーは、ターゲット/コントローラーのエラー、バスのリセット、または要求タイムアウトのために失敗した要求を再試行する役割を担います。 このようなエラーを示すために SrbStatus が設定された特定の要求をポート ドライバーが返す場合、クラス ドライバーは、IoCompletion ルーチンから、または場合によってはその InterpretRequestSense ルーチンから RetryRequest ルーチンを呼び出すことができます。 詳細については、記憶域クラス ドライバーの RetryRequest ルーチンを参照してください。

IoCompletion ルーチンの一般的な情報については、IRP の完了を参照してください。