SCSI_REQUEST_BLOCK 構造体 (srb.h)

SCSI_REQUEST_BLOCK構造体は SRB 関数に関連付けられています。

注意

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 関数PathIdTargetIdLunNextSrb の各メンバーのみが有効です。
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 の FunctionPathIdTargetIdLun メンバーのみが有効です。 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 関数PathIdTargetIdLunNextSrb の各メンバーのみが有効です。
SRB_FUNCTION_RELEASE_RECOVERY (0x11) SCSIMESS_RELEASE_RECOVERY メッセージをターゲット コントローラーに送信する必要があります。 SRB 関数PathIdTargetIdLun の各メンバーのみが有効です。
SRB_FUNCTION_RECEIVE_EVENT (0x03) HBA は、アドレス指定されたターゲットから非同期イベント通知を受信するように準備する必要があります。 SRB DataBuffer メンバーは、データを配置する場所を示します。
SRB_FUNCTION_SHUTDOWN (0x07) システムがシャットダウン中です。 この要求は、HBA のPORT_CONFIGURATION_INFORMATIONで CachesDataTRUE に設定した場合にのみ、ミニポート ドライバーに送信されます。 このようなミニポート ドライバーは、すべてのシステム アクティビティが実際に停止する前に、これらの通知のいくつかを受信できます。 ただし、最後のシャットダウン通知は、最後の開始 I/O の後に発生します。 SRB 関数PathIdTargetIdLun の各メンバーのみが有効です。
SRB_FUNCTION_FLUSH (0x08) ミニポート ドライバーは、ターゲット デバイスのキャッシュされたデータをフラッシュする必要があります。 この要求は、HBA のPORT_CONFIGURATION_INFORMATIONで CachesDataTRUE に設定した場合にのみ、ミニポート ドライバーに送信されます。 SRB 関数PathIdTargetIdLun の各メンバーのみが有効です。
SRB_FUNCTION_IO_CONTROL (0x02) 要求は I/O 制御要求であり、専用 HBA を持つユーザー モード アプリケーションで送信されます。 SRB DataBuffer は、SRB_IO_CONTROL ヘッダーとそれに続くデータ領域を指します。 DataBuffer の値は、MapBuffers の値に関係なく、ドライバーで使用できます。 SRB 関数SrbFlagsTimeOutValueDataBufferおよび DataTransferLength メンバーのみが有効であり、ミニポート ドライバーが初期化時に SRB 拡張機能を要求した場合は 、SrbExtension メンバーと共に有効です。 ミニポート ドライバーがこの要求をサポートするようにアプリケーション専用 HBA を制御する場合、ミニポート ドライバーは要求を実行し、SRB が完了したときに、RequestCompleteNextRequest を使用して ScsiPortNotification への呼び出しの通常のメカニズムを使用して OS 固有のポート ドライバーに通知する必要があります。
SRB_FUNCTION_LOCK_QUEUE (0x18) 特定の論理ユニットのポート ドライバーによってキューに登録された要求を保持します。通常は、電源要求の処理中です。 SRB LengthFunctionSrbFlagsOriginalRequest の各メンバーのみが有効です。 キューがロックされている場合、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 LengthFunctionSrbFlagsOriginalRequest の各メンバーのみが有効です。 SCSI ミニポート ドライバーは、SRB_FUNCTION_UNLOCK_QUEUE要求を処理しません。
SRB_FUNCTION_UNLOCK_QUEUE (0x19) 以前に SRB_FUNCTION_LOCK_QUEUE でロックされていた論理ユニットのポート ドライバーのキューを解放します。 ロック解除要求の SrbFlags は、SRB_FLAGS_BYPASS_LOCKED_QUEUEを持つ ORed である必要があります。 SRB LengthFunctionSrbFlagsOriginalRequest の各メンバーのみが有効です。 SCSI ミニポート ドライバーは、SRB_FUNCTION_UNLOCK_QUEUE要求を処理しません。
SRB_FUNCTION_DUMP_POINTERS (0x26) この関数を使用した要求は、クラッシュ ダンプ データを保持するディスクを制御するために使用される Storport ミニポート ドライバーに送信されます。 要求は、クラッシュ ダンプと休止状態をサポートするためにミニポート ドライバーから必要な情報を収集します。 MINIPORT_DUMP_POINTERS構造を参照してください。 物理ミニポート ドライバーは、この関数を使用して要求を受信するには、そのHW_INITIALIZATION_DATAFeatureSupport メンバーでSTOR_FEATURE_DUMP_POINTERS フラグを設定する必要があります。
SRB_FUNCTION_FREE_DUMP_POINTERS (0x27) この関数を使用した要求は、Storport ミニポート ドライバーに送信され、SRB_FUNCTION_DUMP_POINTERSの以前の要求中に割り当てられたリソースを解放します。

SrbStatus

完了した要求の状態を返します。 このメンバーは、要求が完了したことを OS 固有のドライバーに通知する前に、ミニポート ドライバーによって設定する必要があります ScsiPortNotification with 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で AutoRequestSenseTRUE に設定した場合にのみ返されます。
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で TaggedQueueingTRUE に設定します。

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で MapBuffersTRUE に設定しない限り、データ ポインターとしてこの値を使用しないでください。 ただし、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、クラス ドライバーが PathIdTargetIdおよび 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 srb.h (Srb.h、Minitape.h、Storport.h を含む)

こちらもご覧ください

ExFreePool

ExInterlockedFreeToZone

HW_INITIALIZATION_DATA (SCSI)

PORT_CONFIGURATION_INFORMATION (SCSI)

SCSI_WMI_REQUEST_BLOCK

SRB_IO_CONTROL

ScsiPortGetPhysicalAddress

ScsiPortGetSrb

ScsiPortIoMapTransfer

ScsiPortNotification