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