控制代碼功能:像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 |
