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->AssociatedIrp.SystemBuffer 的緩衝區包含一個 ATA_PASS_THROUGH_DIRECT 結構,其中包含一組工作檔案輸入緩存器,表示要執行的命令排序。 呼叫端必須初始化此結構的所有成員,除了 PathId、TargetId和 Lun之外,埠驅動程式會填入此結構。 對於數據輸出命令,DataBuffer 成員 ATA_PASS_THROUGH_DIRECT 必須指向包含要寫入之數據的快取對齊緩衝區。
Parameters.DeviceIoControl.InputBufferLength 會指出 Irp->AssociatedIrp.SystemBuffer的緩衝區大小。 InputBufferLength 的值是固定的,而且不取決於傳輸的數據量。 它等於 sizeof(ATA_PASS_THROUGH_DIRECT)。 如果緩衝區的大小小於 sizeof(ATA_PASS_THROUGH_DIRECT),埠驅動程式會失敗 I/O 要求並傳回錯誤。
埠驅動程式會使用在 Irp->AssociatedIrp.SystemBuffer 儲存在緩衝區中的 ATA_PASS_THROUGH_DIRECT 結構來格式化傳回數據。
埠驅動程式會將傳輸的數據儲存在 DataBuffer 所指向的快取對齊緩衝區中, 成員 ATA_PASS_THROUGH_DIRECT。
埠驅動程式會將 CurrentTaskFile 成員填入 ATA_PASS_THROUGH_DIRECT,並在 ATA 命令完成時,裝置輸出緩存器中的值。 應用程式負責解譯輸出緩存器的內容,以判斷裝置傳回的錯誤。
埠驅動程式會更新 DataTransferLengthATA_PASS_THROUGH_DIRECT 結構的成員,以指出從裝置傳輸的數據量。
沒有。
不適用。
Information 成員會設定為 Irp->AssociatedIrp.SystemBuffer輸出緩衝區中傳回的位元元組數目。 Status 成員會設定為 STATUS_SUCCESS,或者如果 ATA_PASS_THROUGH_DIRECT 中的輸入 Length 值未正確設定,或可能設定為STATUS_BUFFER_TOO_SMALL或STATUS_INVALID_PARAMETER。
要求 | 價值 |
---|---|
最低支援的用戶端 | Windows Server 2003 |
標頭 | ntddscsi.h (包括 Ntddscsi.h) |