SCSI_REQUEST_BLOCK 構造体 (storport.h)
注意
SCSI ポート ドライバーと SCSI ミニポート ドライバー モデルは、今後変更または使用できない可能性があります。 代わりに、 Storport ドライバー モデルと Storport ミニポート ドライバー モデルを使用することをお勧めします。
構文
typedef struct _SCSI_REQUEST_BLOCK {
USHORT Length;
UCHAR Function;
UCHAR SrbStatus;
UCHAR ScsiStatus;
UCHAR PathId;
UCHAR TargetId;
UCHAR Lun;
UCHAR QueueTag;
UCHAR QueueAction;
UCHAR CdbLength;
UCHAR SenseInfoBufferLength;
ULONG SrbFlags;
ULONG DataTransferLength;
ULONG TimeOutValue;
PVOID DataBuffer;
PVOID SenseInfoBuffer;
struct _SCSI_REQUEST_BLOCK *NextSrb;
PVOID OriginalRequest;
PVOID SrbExtension;
union {
ULONG InternalStatus;
ULONG QueueSortKey;
ULONG LinkTimeoutValue;
};
ULONG Reserved;
UCHAR Cdb[16];
} SCSI_REQUEST_BLOCK, *PSCSI_REQUEST_BLOCK;
メンバー
Length
この構造体のサイズをバイト単位で指定します。
Function
実行する操作を指定します。次のいずれかの値を指定できます。
値 | 意味 |
---|---|
SRB_FUNCTION_EXECUTE_SCSI (0x00) | SCSI デバイス I/O 要求は、ターゲット論理ユニットで実行する必要があります。 |
SRB_FUNCTION_ABORT_COMMAND (0x10) | NextSrb メンバーが指す要求を取り消すには、SCSIMESS_ABORT メッセージを送信する必要があります。 これがタグ付きキュー要求の場合は、代わりにSCSIMESS_ABORT_WITH_TAGメッセージを使用する必要があります。 指定された要求が完了した場合、この要求は正常に完了する必要があります。 SRB 関数、 PathId、 TargetId、 Lun、 および NextSrb メンバーのみが有効です。 |
SRB_FUNCTION_RESET_DEVICE (0x13) | ScsiPort ドライバーは、この SRB をミニポートに送信しなくなりました。 Storport ミニポート ドライバーのみがこの SRB を使用します。 SCSI ターゲット コントローラーは、SCSIMESS_BUS_DEVICE_RESET メッセージを使用してリセットする必要があります。 ミニポート ドライバーは、ターゲット コントローラーのアクティブな要求を完了する必要があります。 SRB 関数、 TargetId、および PathId メンバーのみが有効です。 |
SRB_FUNCTION_RESET_LOGICAL_UNIT (0x20) | 可能であれば、論理ユニットをリセットする必要があります。 HBA ミニポート ドライバーは、論理ユニットのアクティブな要求を完了する必要があります。 SRB の Function、 PathId、 TargetId、 Lun メンバーのみが有効です。 Storport ではこの種類のリセットがサポートされていますが、SCSI ポートではサポートされていません。 |
SRB_FUNCTION_RESET_BUS (0x12) | SCSI バスは、SCSIMESS_BUS_DEVICE_RESET メッセージを使用してリセットする必要があります。 ミニポート ドライバーは、特定の要求がタイムアウトし、タイムアウト要求を中止する後続の要求もタイムアウトした場合にのみ、この要求を受信します。SRB 関数 と PathId メンバーのみが有効です。 |
SRB_FUNCTION_TERMINATE_IO (0x14) | NextSrb メンバーが指す要求を取り消すには、SCSIMESS_TERMINATE_IO_PROCESS メッセージを送信する必要があります。 指定された要求が既に完了している場合、この要求は正常に完了する必要があります。 SRB 関数、 PathId、 TargetId、 Lun、 および NextSrb メンバーのみが有効です。 |
SRB_FUNCTION_RELEASE_RECOVERY (0x11) | SCSIMESS_RELEASE_RECOVERY メッセージをターゲット コントローラーに送信する必要があります。 SRB 関数、 PathId、 TargetId、 Lun メンバーのみが有効です。 |
SRB_FUNCTION_RECEIVE_EVENT (0x03) | HBA は、アドレス指定されたターゲットから非同期イベント通知を受信するように準備する必要があります。 SRB DataBuffer メンバーは、データを配置する場所を示します。 |
SRB_FUNCTION_SHUTDOWN (0x07) | システムがシャットダウン中です。 この要求は、HBA のPORT_CONFIGURATION_INFORMATIONで CachesData を TRUE に設定した場合にのみ、ミニポート ドライバーに送信されます。 このようなミニポート ドライバーは、すべてのシステム アクティビティが実際に停止する前に、これらの通知のいくつかを受信できます。 ただし、最後のシャットダウン通知は、最後の開始 I/O の後に行われます。 SRB 関数、 PathId、 TargetId 、 Lun メンバーのみが有効です。 |
SRB_FUNCTION_FLUSH (0x08) | ミニポート ドライバーは、ターゲット デバイスのキャッシュされたデータをフラッシュする必要があります。 この要求は、HBA のPORT_CONFIGURATION_INFORMATIONで CachesData を TRUE に設定した場合にのみ、ミニポート ドライバーに送信されます。 SRB 関数、 PathId、 TargetId 、 Lun メンバーのみが有効です。 |
SRB_FUNCTION_IO_CONTROL (0x02) | 要求は I/O 制御要求であり、専用 HBA を持つユーザー モード アプリケーションで送信されます。 SRB DataBuffer は、SRB_IO_CONTROL ヘッダーとそれに続くデータ領域を指します。 DataBuffer の値は、MapBuffers の値に関係なく、ドライバーで使用できます。 SRB 関数、 SrbFlags、 TimeOutValue、 DataBuffer、および DataTransferLength メンバーのみが有効であり、ミニポート ドライバーが初期化時に SRB 拡張機能を要求した場合は 、SrbExtension メンバーと共に有効です。 ミニポート ドライバーがアプリケーション専用 HBA を制御してこの要求をサポートする場合、ミニポート ドライバーは要求を実行し、SRB が完了したときに、RequestComplete と NextRequest を使用して ScsiPortNotification への呼び出しの通常のメカニズムを使用して OS 固有のポート ドライバーに通知する必要があります。 |
SRB_FUNCTION_LOCK_QUEUE (0x18) | 通常、電源要求の処理中に、特定の論理ユニットのポート ドライバーによってキューに入れられている要求を保持します。 SRB Length、 Function、 SrbFlags、 OriginalRequest の各メンバーのみが有効です。 キューがロックされている場合は、SRB_FLAGS_BYPASS_LOCKED_QUEUEを含む SrbFlags ORed を含む要求のみが処理されます。 SCSI ミニポート ドライバーは、SRB_FUNCTION_LOCK_QUEUE要求を処理しません。 |
SRB_FUNCTION_UNLOCK_QUEUE (0x19) | 以前にSRB_FUNCTION_LOCK_QUEUEでロックされていた論理ユニットのポート ドライバーのキューを解放します。 ロック解除要求の SrbFlags は、SRB_FLAGS_BYPASS_LOCKED_QUEUEを使用した ORed である必要があります。 SRB Length、 Function、 SrbFlags、 OriginalRequest の各メンバーのみが有効です。 SCSI ミニポート ドライバーは、SRB_FUNCTION_UNLOCK_QUEUE要求を処理しません。 |
SRB_FUNCTION_DUMP_POINTERS (0x26) | この関数を使用した要求は、クラッシュ ダンプ データを保持するディスクを制御するために使用される Storport ミニポート ドライバーに送信されます。 要求は、クラッシュ ダンプと休止状態をサポートするためにミニポート ドライバーから必要な情報を収集します。 MINIPORT_DUMP_POINTERS構造を参照してください。 物理ミニポート ドライバーは、この関数を使用して要求を受信するには、そのHW_INITIALIZATION_DATAの FeatureSupport メンバーでSTOR_FEATURE_DUMP_POINTERS フラグを設定する必要があります。 |
SRB_FUNCTION_FREE_DUMP_POINTERS (0x27) | この関数を使用した要求は、Storport ミニポート ドライバーに送信され、SRB_FUNCTION_DUMP_POINTERSの以前の要求中に割り当てられたリソースを解放します。 |
SrbStatus
完了した要求の状態を返します。 このメンバーは、要求が完了したことを OS 固有のドライバーに通知する前に、ミニポート ドライバーによって設定する必要があります ScsiPortNotification と RequestComplete します。 このメンバーの値には、次のいずれかを指定できます。
値 | 意味 |
---|---|
SRB_STATUS_PENDING | 要求が進行中であることを示します。 OS 固有のポート ドライバーは 、SrbStatus をこの値に初期化します。 |
SRB_STATUS_SUCCESS | 要求が正常に完了したことを示します。 |
SRB_STATUS_ABORTED | ポート ドライバーの指示に応じて要求が中止されたことを示します。 ミニポート ドライバーは、成功したSRB_FUNCTION_ABORT_COMMAND要求の NextSrb でこの状態を設定します。 |
SRB_STATUS_ABORT_FAILED | 要求の中止が失敗したことを示します。 指定した要求が見つからない場合は、SRB_FUNCTION_ABORT_COMMAND要求のこの状態を返します。 |
SRB_STATUS_ERROR | SCSI バスの状態でエラーが発生して要求が完了したことを示します。 |
SRB_STATUS_BUSY | 現在、ミニポート ドライバーまたはターゲット デバイスが要求を受け入れられなかったことを示します。 OS 固有のポート ドライバーは、後で要求を再送信します。 |
SRB_STATUS_INTERNAL_ERROR | SCSI ポート ドライバーがミニポート ドライバーまたはターゲット デバイスに要求を配信できなかったことを示します。 このような場合、状態は InternalStatus に記録されます。 |
SRB_STATUS_INVALID_REQUEST | ミニポート ドライバーが指定された要求をサポートしていないことを示します。 |
SRB_STATUS_NO_DEVICE | デバイスが応答しなかったことを示します。 |
SRB_STATUS_TIMEOUT | 要求がタイムアウトしたことを示します。 |
SRB_STATUS_SELECTION_TIMEOUT | SCSI デバイスの選択がタイムアウトしたことを示します。 |
SRB_STATUS_COMMAND_TIMEOUT | ターゲットが制限時間内にコマンドを完了しなかったことを示します。 |
SRB_STATUS_MESSAGE_REJECTED | ターゲットがメッセージを拒否したことを示します。 通常、これは、SRB_FUNCTION_TERMINATE_IOなどのメッセージの種類の要求に対してのみ返されます。 |
SRB_STATUS_BUS_RESET | この要求の実行中にバスリセットが発生したことを示します。 |
SRB_STATUS_PARITY_ERROR | SCSI バスでパリティ エラーが発生し、再試行に失敗したことを示します。 |
SRB_STATUS_REQUEST_SENSE_FAILED | request-sense コマンドが失敗したことを示します。 これは、HBA が自動要求センスを実行し、ミニポート ドライバーがこの HBA のPORT_CONFIGURATION_INFORMATIONで AutoRequestSense を TRUE に設定した場合にのみ返されます。 |
SRB_STATUS_NO_HBA | HBA が応答しないことを示します。 |
SRB_STATUS_DATA_OVERRUN | データ オーバーランまたはアンダーラン エラーが発生したことを示します。 ミニポート ドライバーは、SRB の DataTransferLength メンバーを更新して、アンダーランが発生した場合に実際に転送されたデータの量を示す必要もあります。 |
SRB_STATUS_UNEXPECTED_BUS_FREE | ターゲットが予期せず切断されたことを示します。 |
SRB_STATUS_PHASE_SEQUENCE_FAILURE | HBA が無効なフェーズ シーケンスエラーを検出したことを示します。 |
SRB_STATUS_REQUEST_FLUSHED | 状態の要求が停止されたことを示します。 |
SRB_STATUS_BAD_FUNCTION | SRB 関数 コードがサポートされていないことを示します。 |
SRB_STATUS_INVALID_PATH_ID | SRB で指定された PathId が存在しないことを示します。 |
SRB_STATUS_INVALID_TARGET_ID | SRB の TargetID 値が無効であることを示します。 |
SRB_STATUS_INVALID_LUN | SRB の Lun 値が無効であることを示します。 |
SRB_STATUS_ERROR_RECOVERY | SCSI バスの状態でエラーが発生して要求が完了し、SCSI INITIATE RECOVERY メッセージが受信されたことを示します。 |
SRB_STATUS_AUTOSENSE_VALID | SenseInfoBuffer で返される情報が有効であることを示します。 |
SRB_STATUS_QUEUE_FROZEN | ミニポート ドライバーは、SrbStatus メンバーをこの値に設定しないでください。 Windows ポート ドライバーは、この値を設定して、特定の周辺機器に対する要求のキューが凍結されたことをストレージ クラス ドライバーに通知できます。 |
ScsiStatus
HBA またはターゲット デバイスによって返された SCSI 状態を返します。 状態が SUCCESS でない場合、ミニポート ドライバーは SrbStatus メンバーをSRB_STATUS_ERRORに設定する必要があります。
PathId
要求の SCSI ポートまたはバスを示します。 この値は 0 から始まります。
TargetId
バス上のターゲット コントローラーまたはデバイスを示します。
Lun
デバイスの論理ユニット番号を示します。
QueueTag
OS 固有のポート ドライバーによって割り当てられたキュー タグ値を格納します。 このメンバーがタグ付きキューに使用されている場合、HBA は LU への要求の内部キューをサポートし、ミニポート ドライバーは、この HBA のPORT_CONFIGURATION_INFORMATIONで TaggedQueueing を TRUE に設定します。
QueueAction
SRB_FLAGS_QUEUE_ACTION_ENABLE フラグが設定されている場合に使用されるタグ付きキュー メッセージを示します。 値には、SCSI 仕様に従って定義されているSRB_SIMPLE_TAG_REQUEST、SRB_HEAD_OF_QUEUE_TAG_REQUEST、またはSRB_ORDERED_QUEUE_TAG_REQUESTのいずれかを指定できます。
CdbLength
SCSI-2 以降のコマンド記述子ブロックのサイズをバイト単位で示します。
SenseInfoBufferLength
要求センス バッファーのサイズをバイト単位で示します。 アンダーランが発生した場合、ミニポート ドライバーは、実際に転送されたバイト数にこのメンバーを更新する必要があります。
SrbFlags
要求に関するさまざまなパラメーターとオプションを示します。 SrbFlags は読み取り専用です。ただし、SRB_FLAGS_UNSPECIFIED_DIRECTIONが設定されていて、SRB_FLAGS_DATA_INまたはSRB_FLAGS_DATA_OUTを更新するために下位 DMA アダプターのミニポート ドライバーが必要な場合を除きます。 このメンバーには、次のフラグを 1 つ以上設定できます。
フラグ | 説明 |
---|---|
SRB_FLAGS_QUEUE_ACTION_ENABLE | タグ付きキュー アクションを有効にすることを示します。 |
SRB_FLAGS_DISABLE_AUTOSENSE | 要求センス情報を返してはならないことを示します。 |
SRB_FLAGS_DATA_IN | デバイスからシステムにデータが転送されることを示します。 |
SRB_FLAGS_DATA_OUT | データがシステムからデバイスに転送されることを示します。 |
SRB_FLAGS_UNSPECIFIED_DIRECTION | ASPI/CAM SCSI インターフェイスとの下位互換性のために定義されているこのフラグは、上記の両方のフラグが設定されているため、転送方向が前のいずれかである可能性があることを示します。 このフラグが設定されている場合、ミニポート ドライバーは、SCSI バス上のターゲットのデータ フェーズを調べることによって転送方向を決定する必要があります。 HBA が下位 DMA デバイスの場合、このようなミニポート ドライバーは ScsiPortIoMapTransfer を呼び出す前に、SRB_FLAGS_DATA_OUTまたはSRB_FLAGS_DATA_INを正しい値に更新する必要があります。 |
SRB_FLAGS_NO_DATA_TRANSFER | この要求によるデータ転送がないことを示します。 これが設定されている場合、フラグSRB_FLAGS_DATA_OUT、SRB_FLAGS_DATA_IN、およびSRB_FLAGS_UNSPECIFIED_DIRECTIONはクリアされます。 |
SRB_FLAGS_DISABLE_SYNCH_TRANSFER | 可能であれば、この転送要求に対して非同期 I/O を実行する必要があることを示します。 同期 I/O が以前にネゴシエートされた場合、HBA は転送を実行する前に非同期 I/O の再ネゴシエーションを行う必要があります。 |
SRB_FLAGS_DISABLE_DISCONNECT | HBA は、この要求の処理中にターゲットが SCSI バスから切断できないようにすることを示します。 |
SRB_FLAGS_BYPASS_FROZEN_QUEUE | ミニポート ドライバーとは無関係です。 |
SRB_FLAGS_NO_QUEUE_FREEZE | ミニポート ドライバーとは無関係です。 |
SRB_FLAGS_IS_ACTIVE | ミニポート ドライバーとは無関係です。 |
SRB_FLAGS_ALLOCATED_FROM_ZONE | ミニポート ドライバーとは無関係であり、現在の Windows クラス ドライバーでは廃止されています。 Windows レガシ クラス ドライバーでは、SRB がゾーン バッファーから割り当てられたかどうかを示します。 このフラグが設定されている場合、クラス ドライバーは ExInterlockedFreeToZone を呼び出して SRB を解放する必要があります。それ以外の場合は、 ExFreePool を呼び出す必要があります。 新しいクラス ドライバーでは、ゾーン バッファーではなくルックアサイド リストを使用する必要があります。 |
SRB_FLAGS_SGLIST_FROM_POOL | ミニポート ドライバーとは無関係です。 Windows クラス ドライバーの場合、これは、分散/収集リストのメモリが非ページ プールから割り当てられたことを示します。 このフラグが設定されている場合、クラス ドライバーは ExFreePool を呼び出して、SRB の完了後にメモリを解放する必要があります。 |
SRB_FLAGS_BYPASS_LOCKED_QUEUE | ミニポート ドライバーとは無関係です。 ポート ドライバーでは、このフラグは、論理ユニット キューがロックされているかどうかを要求を処理する必要があることを示します。 上位レベルのドライバーは、SRB_FUNCTION_UNLOCK_QUEUE要求を送信するには、このフラグを設定する必要があります。 |
SRB_FLAGS_NO_KEEP_AWAKE | ミニポート ドライバーとは無関係です。 Windows クラス ドライバーは、このフラグを使用して、この要求を処理するデバイスの電源をオンにするのではなく、アイドル状態を報告するポート ドライバーを示します。 |
SRB_FLAGS_FREE_SENSE_BUFFER | ポートまたはミニポート ドライバーがセンス データのバッファーを割り当てたことを示します。 これにより、データを抽出した後にセンス データ バッファーを解放する必要があることをクラス ドライバーに通知します。 |
DataTransferLength
データ バッファーのサイズをバイト単位で示します。 アンダーランが発生した場合、ミニポート ドライバーは、実際に転送されたバイト数にこのメンバーを更新する必要があります。
TimeOutValue
OS 固有のポート ドライバーがタイムアウトしたと見なす前に、要求が実行できる間隔を秒単位で示します。ミニポート ドライバーは、ポート ドライバーが既に行うので、要求を時間を取る必要はありません。
DataBuffer
データ バッファーを指します。 ミニポート ドライバーは、ミニポート ドライバーが HBA のPORT_CONFIGURATION_INFORMATIONで MapBuffers を TRUE に設定しない限り、データ ポインターとしてこの値を使用しないでください。 ただし、SRB_FUNCTION_IO_CONTROL要求の場合、ミニポート ドライバーは MapBuffers の値に関係なく、この値をデータ ポインターとして使用できます。
SenseInfoBuffer
要求センス バッファーを指します。 ミニポート ドライバーは、CHECK 条件の後に要求検出データを提供する必要はありません。
NextSrb
この要求が適用されるSCSI_REQUEST_BLOCKを示します。 SRB_FUNCTION_ABORT_COMMANDなど、2 番目の SRB を使用するのは、要求の小さなサブセットのみです。
OriginalRequest
この要求の IRP を指します。 このメンバーはミニポート ドライバーとは無関係です
SrbExtension
Srb 拡張を指します。 ミニポート ドライバーは、 SCSI_HW_INITIALIZATION_DATAで SrbExtensionSize を 0 に設定する場合、このメンバーを使用しないでください。 SrbExtension のメモリは OS 固有のポート ドライバーによって初期化されず、ミニポート ドライバーによって決定されたデータは HBA によって直接アクセスできます。 対応する物理アドレスは、SrbExtension ポインターを使用して ScsiPortGetPhysicalAddress を呼び出すことによって取得できます。
InternalStatus
要求をミニポート ドライバーに配信できない場合は常に完了した要求の状態を報告するために、 SrbStatus の代わりに SCSI ポート ドライバーによって使用されます。 このような場合、 SrbStatus は SRB_STATUS_INTERNAL_ERROR に設定されます。 このメンバーは、SCSI ポートとクラス ドライバー間の通信にのみ使用され、ミニポート ドライバーでは使用しないでください。
QueueSortKey
ターゲット デバイスの種類に応じて、メディアの先頭から 0 のオフセットを指定します。
LinkTimeoutValue
タイムアウト値を指定します。
Reserved
予約済み。
Cdb[16]
ターゲット デバイスに送信する SCSI-2 以降のコマンド記述子ブロックを指定します。
注釈
Windows ストレージ クラスとフィルター ドライバーは、次の Function 値を持つ SRB をシステム ポート ドライバーに送信できます。
- SRB_FUNCTION_CLAIM_DEVICE、クラス ドライバーが PathId、 TargetId、 および Lun メンバーによって SRB で識別される周辺機器をサポートしていることを示します。
- SRB_ATTACH_DEVICE、クラス ドライバーの上に階層化されたフィルター ドライバーが、特定の周辺機器に対する要求を最初にフィルター ドライバーにルーティングすることを望んでいることを示します。
- クラス ドライバーが特定の周辺機器で要求を解放していることを示すSRB_FUNCTION_RELEASE_DEVICE。
- ポート ドライバーで現在キューに登録されている要求の取り消しを特定の周辺機器に要求するSRB_FUNCTION_FLUSH_QUEUE。
- ポート ドライバーが特定の周辺機器に要求の固定キューを解放するように要求するSRB_FUNCTION_RELEASE_QUEUEします。
上記の SRB_FUNCTION_XXX は、SCSI ミニポート ドライバーに送信される SRB では設定されません。 SRB_FUNCTION_REMOVE_DEVICEは、システムの将来のバージョンで使用するために定義されます。 また、SCSI ミニポート ドライバーに送信される SRB では設定されません。 SRB_FUNCTION_WMI_REQUESTは、SCSI_WMI_REQUEST_BLOCKでのみ有効です。 ストレージ クラスまたはフィルター ドライバーは、これを使用して WMI 要求をポート ドライバーに送信します。
要件
要件 | 値 |
---|---|
Header | storport.h (Srb.h、Minitape.h、Storport.h を含む) |