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 で基になるミニポート ドライバーがメモリに直接アクセスする必要がある場合は、この要求を行う 必要があります 。
アプリケーションは、 IRP_MJ_DEVICE_CONTROL 要求を使用してこの要求を送信できます。
記憶域クラス ドライバーは、要求がストレージ クラス ドライバーによって処理されたことを示すために、マイナー IRP 番号をIRP_MN_SCSI_CLASSに設定します。
メジャー コード
[入力バッファー]
Parameters.DeviceIoControl.InputBufferLength は、少なくとも (センス データ サイズsizeof(SCSI_PASS_THROUGH_DIRECT_EX)) である必要がある Irp->AssociatedIrp.SystemBuffer のバッファーのサイズ + (バイト単位) を示します。 SCSI_PASS_THROUGH_DIRECT_EX構造体のサイズは固定されています。この構造体には SCSI CDB が含まれます。これは、ポート ドライバーによって入力されるパス、ターゲット ID、LUN を除き、呼び出し元によって初期化される必要があります。 データ出力コマンドの場合、転送されるデータはアダプター・デバイスアライン・バッファー内になければなりません。 SCSI_PASS_THROUGH_DIRECT_EX の DataInBuffer メンバーは、このアダプター デバイスアラインバッファーへのポインターです。 呼び出し元が要求検出データを要求する場合、呼び出し元は 、SCSI_PASS_THROUGH_DIRECT_EX 構造に従って追加のストレージを割り当てる必要があります。
入力バッファーの長さ
Parameters.DeviceIoControl.InputBufferLength は、少なくとも (センス データ サイズsizeof(SCSI_PASS_THROUGH_DIRECT_EX)) である必要がある Irp->AssociatedIrp.SystemBuffer のバッファーのサイズ + (バイト単位) を示します。 SCSI_PASS_THROUGH_DIRECT_EX構造体のサイズは固定されています。出力バッファー
ポート ドライバーは、Irp-AssociatedIrp.SystemBuffer> のバッファーに要求検出データとSCSI_PASS_THROUGH_DIRECT_EX構造体を返します。
出力バッファーの長さ
SenseInfoLength と DataOutTransferLength は、転送されるデータの量を示すように更新されます。 ポート ドライバーは、デバイスから 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 メンバーにあります。 ドライバーは、アダプターの DeviceObject の AlignmentMask メンバーの値を使用することもできます。
次の関数例では、バッファーがデバイスアラインデータ転送バッファーとして準備されています。
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 でプロパティの種類が 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 を含む) |
こちらもご覧ください
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示