IOCTL_ATA_PASS_THROUGH_DIRECT IOCTL (ntddscsi.h)

IOCTL_ATA_PASS_THROUGH_DIRECT 可讓應用程式將幾乎任何 ATA 命令傳送至目標裝置,但有下列限制:

  • 如果裝置目標類型的類別驅動程式存在,應用程式必須將要求傳送至類別驅動程式。 因此,只有在裝置沒有類別驅動程式時,應用程式才能將此要求直接傳送至目標邏輯單元的系統埠驅動程式。

  • 如果內嵌 ATA 命令可能需要基礎迷你埠驅動程式直接存取記憶體,應用程式 就必須 使用此要求,而不是 IOCTL_ATA_PASS_THROUGH

如果 ATA 命令要求資料傳輸作業,呼叫端必須設定快取對齊的緩衝區,或從中移轉數據, 驅動程式可以直接傳輸數據。 呼叫端應該確保下列各項:

  • 數據傳輸長度符合裝置的 I/O 對齊需求;否則,此 IOCTL 會失敗並STATUS_INVALID_PARAMETER。
  • 數據傳輸長度不應大於裝置的最大 I/O 傳輸長度;否則,預期裝置會失敗要求。

IOCTL_ATA_PASS_THROUGH_DIRECT要求通常用於傳輸大量數據, (超過 16 KB) 。

主要程序代碼

IRP_MJ_DEVICE_CONTROL

輸入緩衝區

Irp-AssociatedIrp.SystemBuffer> 的緩衝區包含一個ATA_PASS_THROUGH_DIRECT結構,其中包含一組工作檔輸入緩存器,指出要執行的命令類型。 呼叫端必須初始化此結構的所有成員,但埠驅動程式會填入 的 PathIdTargetIdLun 除外。 針對數據輸出命令,ATA_PASS_THROUGH_DIRECTDataBuffer 成員必須指向包含要寫入數據的快取對齊緩衝區。

輸入緩衝區長度

Parameters.DeviceIoControl.InputBufferLength 表示緩衝區的大小以位元組為單位,位於 Irp-AssociatedIrp.SystemBuffer>InputBufferLength 的值是固定的,而且不取決於傳輸的數據量。 它等於 大小of (ATA_PASS_THROUGH_DIRECT) 。 如果緩衝區的大小小於 sizeof (ATA_PASS_THROUGH_DIRECT) ,埠驅動程式會失敗 I/O 要求並傳回錯誤。

輸出緩衝區

埠驅動程式會使用儲存在 Irp-AssociatedIrp.SystemBuffer> 緩衝區中的ATA_PASS_THROUGH_DIRECT結構來格式化傳回數據。

埠驅動程式會將傳輸的數據儲存在ATA_PASS_THROUGH_DIRECTDataBuffer 成員所指向的快取對齊緩衝區中。

埠驅動程式會在 ATA 命令完成時,填入ATA_PASS_THROUGH_DIRECT的 CurrentTaskFile 成員,並填入裝置輸出緩存器中的值。 應用程式負責解譯輸出緩存器的內容,以判斷裝置傳回的錯誤。

輸出緩衝區長度

埠驅動程式會更新 ATA_PASS_THROUGH_DIRECT 結構的 DataTransferLength 成員,以指出從裝置傳輸的數據量。

輸入/輸出緩衝區

無。

輸入/輸出緩衝區長度

不適用。

狀態區塊

信息成員會設定為 Irp-AssociatedIrp.SystemBuffer> 輸出緩衝區中傳回的位元元組數目。 [狀態] 成員會設定為 [STATUS_SUCCESS],或者如果輸入的 [長度ATA_PASS_THROUGH_DIRECT] 值未正確設定,則設定為 [STATUS_BUFFER_TOO_SMALL] 或 [STATUS_INVALID_PARAMETER]。

規格需求

需求
最低支援的用戶端 Windows Server 2003
標頭 ntddscsi.h (包含 Ntddscsi.h)

另請參閱

ATA_PASS_THROUGH_DIRECT

IOCTL_ATA_PASS_THROUGH