次の方法で共有


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 構造体が含まれている必要があります。 呼び出し元は、ポート ドライバーが入力 PathIdTargetId、および Lunを除き、この構造体のすべてのメンバーを初期化する必要があります。 データアウト コマンドの場合、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 コマンドが、データ転送を伴わない読み取り操作またはデバイス制御操作である場合、inputBufferLength sizeof (ATA_PASS_THROUGH_EX) と等しい必要があります。

どちらの場合も、inputBufferLength (ATA_PASS_THROUGH_EX) sizeof 未満の場合、ポート ドライバーは I/O 要求に失敗し、エラーを返します。

出力バッファー

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

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

出力バッファーの長さ

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

状態ブロック

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

必要条件

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

関連項目

ATA_PASS_THROUGH_EX

IOCTL_ATA_PASS_THROUGH_DIRECT