次の方法で共有


IOCTL_ATA_PASS_THROUGH IOCTL (ntddscsi.h)

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

  • ターゲットの種類のデバイスのクラス ドライバーが存在する場合、アプリケーションはクラス ドライバーに要求を送信する必要があります。 したがって、アプリケーションは、その LU に接続されているデバイスの種類のクラス ドライバーがない場合にのみ、ターゲット論理ユニット (LU) のシステム ポート ドライバーに直接この要求を送信できます。 システム ポート ドライバーは、パススルー要求を処理する前に、デバイスがクラス ドライバーによって要求されているかどうかを判断するためにチェックされません。 そのため、アプリケーションがデバイスを要求したクラス ドライバーをバイパスし、そのデバイスのパススルー要求をポート ドライバーに直接送信すると、クラス ドライバーとアプリケーションの間でデバイスの制御の競合が発生する可能性があります。
  • この要求は、コマンドで基になるドライバーがメモリに直接アクセスする必要がある場合は使用できません。 呼び出し元のコマンドでメモリへの直接アクセスが必要になる場合は、代わりに IOCTL_ATA_PASS_THROUGH_DIRECT を使用します。
  • アプリケーションは、パススルー要求を非同期的に送信しようとしないでください。 すべてのパススルー要求は同期である必要があります。
  • アプリケーションでは、パススルー要求をデバイスに送信するための管理特権は必要ありませんが、デバイスへの読み取り/書き込みアクセス権が必要です。
呼び出し元のアプリケーションは、 ATA_PASS_THROUGH_EX 構造内の目的のコマンドの ATA タスク ファイルレジスタの内容を提供します。 システムは、すべてのデータ転送をダブル バッファーします。 この要求は通常、少量のデータ (16 KB 未満) を転送するために使用されます。

メジャー コード

IRP_MJ_DEVICE_CONTROL

[入力バッファー]

Irp-AssociatedIrp.SystemBuffer> のバッファーには、実行するコマンドの並べ替えとそのパラメーターを示すタスク ファイル入力レジスタのセットを含む、ATA_PASS_THROUGH_EX構造体が含まれている必要があります。 呼び出し元は、ポート ドライバーが入力する PathIdTargetIdLun を除き、この構造体のすべてのメンバーを初期化する必要があります。 data-out コマンドの場合、構造体の DataBufferOffset メンバーは、書き込まれるデータを含むキャッシュアラインバッファーを指す必要があります。

入力バッファーの長さ

Parameters.DeviceIoControl.InputBufferLengthは、Irp->AssociatedIrp.SystemBuffer のバッファーのサイズをバイト単位で示します。 埋め込み ATA コマンドが書き込み操作の場合、入力バッファーのサイズは sizeof(ATA_PASS_THROUGH_EX) と ATA_PASS_THROUGH_EXDataTransferLengthメンバーの値の合計である必要があります。 次の擬似コードの例は、バッファー サイズを計算する方法を示しています。
ULONG buffsize; // size of the buffer
ATA_PASS_THROUGH_EX hdr;
hdr.DataTransferLength = size in bytes of the data transfer
buffsize = sizeof (ATA_PASS_THROUGH_EX) + hdr.DataTransferLength

埋め込み ATA コマンドが、データ転送を伴わない読み取り操作またはデバイス制御操作である場合、 InputBufferLengthsizeof (ATA_PASS_THROUGH_EX) と等しい必要があります。

どちらの場合も、 InputBufferLengthsizeof (ATA_PASS_THROUGH_EX) より小さい場合、ポート ドライバーは I/O 要求を失敗させ、エラーを返します。

出力バッファー

ポート ドライバーは、ATA_PASS_THROUGH_EX構造体を使用して戻り値のデータを書式設定し、Irp-AssociatedIrp.SystemBuffer> のバッファーにデータを格納します。

ポート ドライバーは、埋め込まれた ATA コマンドの完了時に、デバイスの出力レジスタに存在する値を CurrentTaskFile メンバーに入力します。 コマンドがデータ転送の場合、ポート ドライバーは、転送されたデータを、構造体の先頭から DataBufferOffset バイトのオフセットにあるキャッシュアラインバッファーに格納します。 アプリケーションは、出力レジスタの内容を解釈して、デバイスから返されたエラー (存在する場合) を判断する役割を担います。

出力バッファーの長さ

ポート ドライバーは、ATA_PASS_THROUGH_EXのDataTransferLength メンバーを更新して、デバイスから実際に転送されたデータの量を示します。 埋め込み ATA コマンドが、データを転送しない書き込み操作またはデバイス制御操作である場合、 OutputBufferLengthsizeof(ATA_PASS_THROUGH_EX) と等しくなります。 埋め込み ATA コマンドが読み取り操作の場合、 OutputBufferLengthsizeof(ATA_PASS_THROUGH_EX) + DataTransferLength と等しくなります。

ステータス ブロック

Information メンバーは、Irp-AssociatedIrp.SystemBuffer> の出力バッファーで返されるバイト数に設定されます。 Status メンバーは、STATUS_SUCCESSに設定されているか、ATA_PASS_THROUGH_EXの入力 Status 値が正しく設定されていない場合はSTATUS_BUFFER_TOO_SMALLまたはSTATUS_INVALID_PARAMETERに設定されます。

要件

要件
サポートされている最小のクライアント Windows Server 2003 以降で使用できます。
Header ntddscsi.h (Ntddscsi.h を含む)

こちらもご覧ください

ATA_PASS_THROUGH_EX

IOCTL_ATA_PASS_THROUGH_DIRECT