次の方法で共有


IOCTL_SCSI_PASS_THROUGH_EX IOCTL (ntddscsi.h)

IOCTL_SCSI_PASS_THROUGH_EX制御コード要求は、IOCTL_SCSI_PASS_THROUGH要求の拡張バージョンです。 この要求は、双方向データ転送をサポートし、コマンド データ ブロック (CDB) > 16 バイトを許可します。

アプリケーションが、次の制限を使用して、ほぼすべての SCSI コマンドをターゲット デバイスに送信できるようにします。

  • COPY などのマルチターゲット コマンドは使用できません。
  • デバイスのターゲットの種類のクラス ドライバーが存在する場合は、そのクラス ドライバーに要求を送信する必要があります。 したがって、アプリケーションは、その LU に接続されているデバイスの種類のクラス ドライバーがない場合にのみ、ターゲット論理ユニット (LU) のシステム ポート ドライバーにこの要求を直接送信できます。 システム ポート ドライバーは、パススルー要求を処理する前に、デバイスがクラス ドライバーによって要求されているかどうかを判断するためにチェックされません。 そのため、アプリケーションがデバイスを要求したクラス ドライバーをバイパスし、そのデバイスのパススルー要求をポート ドライバーに直接送信すると、クラス ドライバーとアプリケーションの間でデバイスの制御の競合が発生する可能性があります。 パススルー要求がアダプター デバイス オブジェクトに送信され、それがユーザー モードから送信され、クラス ドライバーによって要求された LU を対象とする場合、Storport は STATUS_INVALID_DEVICE_REQUESTで要求を失敗させます。 要求が LU デバイス オブジェクトに送信された場合、カーネル モードで送信された場合、または要求されていない LU を対象とする場合は、ミニポート ドライバーに渡されます。
  • この要求は、CDB がメモリに直接アクセスする基になるミニポート ドライバーを必要とする場合は使用できません。 呼び出し元の CDB でメモリへの直接アクセスが必要になる場合は、代わりに IOCTL_SCSI_PASS_THROUGH_DIRECT_EX を使用します。
  • アプリケーションは、パススルー要求を非同期的に送信しようとしてはなりません。 すべてのパススルー要求は同期である必要があります。
  • アプリケーションでは、パススルー要求をデバイスに送信するための管理特権は必要ありませんが、デバイスへの読み取り/書き込みアクセス権が必要です。
呼び出し元のアプリケーションは SCSI コマンド記述子ブロックを作成します。このブロックには、CHECK CONDITION が発生した場合に要求検出データの要求を含めることができます。

IOCTL_SCSI_PASS_THROUGH_EX は、バッファーされたデバイス制御要求です。 システム メモリ内のバッファリングをバイパスするには、呼び出し元は IOCTL_SCSI_PASS_THROUGH_DIRECT_EX を使用する必要があります。 IOCTL_SCSI_PASS_THROUGH_DIRECT_EX要求を処理する場合、システムはユーザー メモリ内のバッファーをロックダウンし、デバイスはこのメモリに直接アクセスします。

この要求は通常、少量のデータ (<16K) を転送するために使用されます。

アプリケーションは、 IRP_MJ_DEVICE_CONTROL 要求を使用してこの要求を送信できます。

記憶域クラス ドライバーは、要求がストレージ クラス ドライバーによって処理されたことを示すために、マイナー IRP 番号をIRP_MN_SCSI_CLASSに設定します。

メモ SCSI ポート ドライバーと SCSI ミニポート ドライバー モデルは、今後変更または使用できない可能性があります。 代わりに、 Storport ドライバー モデルと Storport ミニポート ドライバー モデルを使用することをお勧めします。
 

メジャー コード

IRP_MJ_DEVICE_CONTROL

[入力バッファー]

この構造体には SCSI CDB が含まれます。これは、ポート ドライバーによって入力されるパス、ターゲット ID、論理ユニット番号 (LUN) を除き、呼び出し元によって初期化される必要があります。 data-out コマンドの場合、転送されるデータは、SCSI_PASS_THROUGH_EX構造体の DataInBufferOffset にある Irp-AssociatedIrp.SystemBuffer> のバッファーに含まれます。 ただし、呼び出し元が要求検出データを要求した場合、呼び出し元は、 SCSI_PASS_THROUGH_EXの直後に追加のストレージを割り当てる必要があります。

入力バッファーの長さ

Parameters.DeviceIoControl.InputBufferLength は、少なくとも (センス データ サイズsizeof(SCSI_PASS_THROUGH_EX)) である必要がある Irp->AssociatedIrp.SystemBuffer のバッファーのサイズ + (バイト単位) を示します。 SCSI_PASS_THROUGH_EX構造体のサイズは、DataInTransferLength で指定された値によって異なります。

出力バッファー

ポート ドライバーは、要求検出データと、デバイスから Irp-AssociatedIrp.SystemBuffer> のバッファーに転送されたすべてのデータを返します。 SCSI_PASS_THROUGH_EX構造体の SenseInfoLengthDataOutTransferLength は、転送されるデータの量を示すように更新されます。

出力バッファーの長さ

SCSI_PASS_THROUGH_EX構造体の SenseInfoLengthDataOutTransferLength は、転送されるデータの量を示すように更新されます。

ステータス ブロック

[情報] フィールドは、Irp-AssociatedIrp.SystemBuffer> の出力バッファーで返されるバイト数に設定されます。 [状態] フィールドはSTATUS_SUCCESSに設定され、SCSI_PASS_THROUGH_EXの入力 Length 値が正しく設定されていない場合はSTATUS_BUFFER_TOO_SMALLまたはSTATUS_INVALID_PARAMETER可能性があります。

注釈

IOCTL_SCSI_PASS_THROUGH_EX要求を発行するには、基になるストレージ デバイスで拡張 SRB がサポートされている必要があります。 これは、サポートされている SRB 型が SRB_TYPE_STORAGE_REQUEST_BLOCKされることを意味します。 アプリケーションは、クエリの種類が PropertyStandardQuery でプロパティの種類が StorageDeviceProperty であるIOCTL_STORAGE_QUERY_PROPERTY要求を使用して、SRB サポートを照会できます。 STORAGE_ADAPTER_DESCRIPTIOR構造体で返される SrbType メンバーは、SRB_TYPE_SCSI_REQUEST_BLOCKまたはSRB_TYPE_STORAGE_REQUEST_BLOCKを示します。

要件

要件
Header ntddscsi.h (Ntddscsi.h を含む)

こちらもご覧ください

SCSI_PASS_THROUGH_EX