通過IOCTL_ATA_PASS_THROUGH訪問ATA設備接口


控制代碼功能:像ATA硬盤發送ATA指令。
IDE/ATA:接口,一個串行,一個並行,一般叫做IDE接口的硬盤和ATA接口的硬盤。
ATA指令:可以操作ATA硬盤的指令。

 1 typedef struct _ATA_PASS_THROUGH_EX {
 2   USHORT    Length;
 3   USHORT    AtaFlags;
 4   UCHAR     PathId;
 5   UCHAR     TargetId;
 6   UCHAR     Lun;
 7   UCHAR     ReservedAsUchar;
 8   ULONG     DataTransferLength;
 9   ULONG     TimeOutValue;
10   ULONG     ReservedAsUlong;
11   ULONG_PTR DataBufferOffset;
12   UCHAR     PreviousTaskFile[8];
13   UCHAR     CurrentTaskFile[8];
14 } *PATA_PASS_THROUGH_EX, ATA_PASS_THROUGH_EX;

Length:指定ATA_PASS_THROUGH_EX結構的字節長度.
AtaFlags:指示數據傳輸的方向並指定要執行的操作類型。

ATA_FLAGS_DRDY_REQUIRED 在將命令發送到設備之前,請等待設備的DRDY狀態。
ATA_FLAGS_DATA_IN 從設備讀取數據。
ATA_FLAGS_DATA_OUT 將數據寫入設備
ATA_FLAGS_48BIT_COMMAND

要發送的ATA命令使用48位邏輯塊地址(LBA)功能集。設置此標志時,

ATA_PASS_THROUGH_EX結構中的PreviousTaskFile成員的內容應該是有效的。

ATA_FLAGS_USE_DMA 將傳輸模式設置為DMA。
ATA_FLAGS_NO_MULTIPLE 只讀單扇區。
 

PathId:表示請求的IDE端口或總線。該值由端口驅動程序設置
TargetId:表示總線上目標設備的整數。該值由端口驅動程序設置
Lun:表示設備的邏輯單元號。該值由端口驅動程序設置。
ReservedAsUchar:保留
DataTransferLength:指示數據緩沖區的大小(以字節為單位)。
TimeOutValue:端口驅動程序確定請求超時時間
ReservedAsUlong; //保留
DataBufferOffset; //指定從此結構開始到數據緩沖區的偏移量(以字節為單位)。
PreviousTaskFile[8]; //指定當前傳遞命令之前的任務文件輸入寄存器的內容。未設置ATA_FLAGS_48BIT_COMMAND標志時不使用此成員。
CurrentTaskFile[8]; //SATA的register

偏移量 屬性
byte0 Features register
byte1 Sector count register
byte2 Sector number register
byte3 Cylinder low register
byte4 Cylinder high register
byte5 Device/head register
byte6 Command register
byte7 Reserved

當ATA_PASS_THROUGH_EX成功返回后:CurrentTaskFile內容為output registers

偏移量  屬性
byte0 Error register
byte0 Sector count register
byte0 Sector number register
byte0 Cylinder low register
byte0 Cylinder high register
byte0 Device/head register
byte0 Status register
byte0 Reserved
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM