次の方法で共有


IOCTL_SCSI_PASS_THROUGH_DIRECT_EX IOCTL (ntddscsi.h)

IOCTL_SCSI_PASS_THROUGH_DIRECT_EX制御コード要求は、IOCTL_SCSI_PASS_THROUGH_DIRECT要求の拡張バージョンです。 この要求では、双方向データ転送がサポートされ、コマンド データ ブロック (CDB) > は 16 バイトになります。

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

  • COPY などのマルチターゲット コマンドは使用できません。
  • デバイスのターゲットの種類のクラス ドライバーが存在する場合は、そのクラス ドライバーに要求を送信する必要があります。 したがって、アプリケーションは、その LU に接続されているデバイスの種類のクラス ドライバーがない場合にのみ、ターゲット論理ユニットのシステム ポート ドライバーに直接この要求を送信できます。
  • この要求は、入力 CDB がメモリに直接アクセスする基になるミニポート ドライバーを必要とする場合に行う 必要があります
呼び出し元のアプリケーションは SCSI コマンド記述子ブロックを作成します。このブロックには、CHECK CONDITION が発生した場合に要求検出データの要求を含めることができます。 CDB がデータ転送操作を要求する場合、呼び出し元は、ミニポート ドライバーがデータを直接転送できるアダプター デバイスアラインバッファーを設定する必要があります。 この要求は、通常、大量のデータを転送するために使用されます (>16K)。

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

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

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

メジャー コード

IRP_MJ_DEVICE_CONTROL

[入力バッファー]

Parameters.DeviceIoControl.InputBufferLength は、 Irp->AssociatedIrp.SystemBuffer のバッファーのサイズ (バイト単位) を示します。これは、少なくとも (データ サイズ + sizeof(SCSI_PASS_THROUGH_DIRECT_EX)を検出する必要があります)。 SCSI_PASS_THROUGH_DIRECT_EX構造体のサイズが固定されています。

この構造体には SCSI CDB が含まれます。これは、ポート ドライバーによって入力されるパス、ターゲット ID、LUN を除き、呼び出し元によって初期化される必要があります。 data-out コマンドの場合、転送されるデータはアダプター デバイスアラインバッファー内にある必要があります。 SCSI_PASS_THROUGH_DIRECT_EXDataInBuffer メンバーは、このアダプター デバイスアラインバッファーへのポインターです。 呼び出し元が要求検出データを要求した場合、呼び出し元は 、SCSI_PASS_THROUGH_DIRECT_EX 構造に従って追加のストレージを割り当てる必要があります。

入力バッファーの長さ

Parameters.DeviceIoControl.InputBufferLength は、 Irp->AssociatedIrp.SystemBuffer のバッファーのサイズ (バイト単位) を示します。これは、少なくとも (データ サイズ + sizeof(SCSI_PASS_THROUGH_DIRECT_EX)を検出する必要があります)。 SCSI_PASS_THROUGH_DIRECT_EX構造体のサイズが固定されています。

出力バッファー

ポート ドライバーは、Irp-AssociatedIrp.SystemBuffer> のバッファーに要求センス データとSCSI_PASS_THROUGH_DIRECT_EX構造体を返します。

出力バッファーの長さ

SenseInfoLengthDataOutTransferLength は、転送されるデータの量を示すように更新されます。 ポート ドライバーは、デバイスから DataOutBuffer で指定されたキャッシュアラインバッファーに転送されたすべてのデータを返します。

ステータス ブロック

[情報] フィールドは、Irp-AssociatedIrp.SystemBuffer> の出力バッファーで返されるバイト数に設定されます。 [状態] フィールドはSTATUS_SUCCESSに設定されます。または、SCSI_PASS_THROUGH_DIRECT_EXの入力 Length 値が正しく設定されていない場合、または DataInBuffer で指定されたバッファーが適切にデバイスに配置されていない場合は、STATUS_BUFFER_TOO_SMALLまたはSTATUS_INVALID_PARAMETERに設定されます。

注釈

データ転送操作の場合は、アダプター デバイスに一致するアラインメントを持つバッファーが必要です。 アプリケーションは、クエリの種類が PropertyStandardQuery で、プロパティ ID が StorageAdapterProperty であるIOCTL_STORAGE_QUERY_PROPERTYコントロール コード要求を発行することで、デバイスアラインメント マスクを取得できます。 アラインメント マスクは、返されるSTORAGE_ADAPTER_DESCRIPTOR構造体の AlignmentMask メンバーにあります。 ドライバーは、アダプターの DeviceObjectAlignmentMask メンバーの値を使用することもできます。

次の関数例では、バッファーはデバイスアラインデータ転送バッファーとして準備されています。


PVOID AllocateAlignedBuffer(ULONG size, ULONG AlignmentMask, PVOID *pUnAlignedBuffer)
{
    PVOID AlignedBuffer;
    ULONG_PTR FullWordMask = (ULONG_PTR)AlignmentMask;

    if (AlignmentMask == 0)
    {
        AlignedBuffer = malloc(size);
        // return the original buffer to free later
        *pUnAlignedBuffer = AlignedBuffer;
    }
    else
    {
        // expand the size for the alignment window
        size += AlignmentMask;
        AlignedBuffer = malloc(size);
        // return the original buffer to free later
        *pUnAlignedBuffer = AlignedBuffer;
        // adjust buffer pointer for the desired alignment
        AlignedBuffer = (PVOID)(((ULONG_PTR)AlignedBuffer + FullWordMask) & ~FullWordMask);
    }

    return AlignedBuffer;
}

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

要件

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

こちらもご覧ください

IOCTL_SCSI_PASS_THROUGH_EX

IOCTL_STORAGE_QUERY_PROPERTY

SCSI_PASS_THROUGH_DIRECT_EX