通过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
 
原文地址:https://www.cnblogs.com/hwli/p/8946479.html