IDE_REQUEST_BLOCK 结构 (irb.h)
IDE_REQUEST_BLOCK 结构定义 IDE 请求块。
语法
typedef struct _IDE_REQUEST_BLOCK {
USHORT Function;
UCHAR IrbStatus;
UCHAR AtaStatus;
UCHAR AtaError;
UCHAR Channel;
UCHAR TargetId;
UCHAR Lun;
UCHAR CdbLength;
UCHAR SenseInfoBufferLength;
UCHAR SenseInfoBufferType;
UCHAR QueueTag;
ULONG ReservedAsUlong;
ULONG IrbFlags;
ULONG TimeOutValue;
ULONG DataTransferLength;
PVOID IrbExtension;
PVOID DataBuffer;
PVOID SenseInfoBuffer;
PVOID NextIrb;
PVOID Reserved;
union {
IDE_TASK_FILE IdeTaskFile;
UCHAR Cdb[16];
IDE_POWER_INFO PowerChange;
UCHAR AsUChar[16];
};
} IDE_REQUEST_BLOCK, *PIDE_REQUEST_BLOCK;
成员
Function
指定请求所属的类别。 下表描述了 I/O 请求的分类。
Function | 子命令 | 说明 |
IRB_FUNCTION_ATA_COMMAND |
IRB_FUNCTION_ATA_IDENTIFY IRB_FUNCTION_ATA_READ IRB_FUNCTION_ATA_WRITE IRB_FUNCTION_ATA_FLUSH IRB_FUNCTION_ATA_SMART |
指示 IRB 包含描述 ATA 命令的 IdeTaskFile。 子命令指示对请求进行更精细的分组,以便更快地查找。 |
IRB_FUNCTION_ATAPI_COMMAND | IRB_FUNCTION_REQUEST_SENSE | 指示 IRB 包含描述 ATAPI 命令的 CDB。 |
IRB_FUNCTION_MINIPORT_COMMAND |
IRB_FUNCTION_ADAPTER_FLUSH IRB_FUNCTION_SHUTDOWN IRB_FUNCTION_POWER_CHANGE IRB_FUNCTION_POWER_REBOOT IRB_FUNCTION_LUN_RESET IRB_FUNCTION_MINIPORT_IOCTL |
指示 IRB 适用于微型端口。 微型端口负责正确解释命令。 |
IrbStatus
微型端口必须将此成员设置为指示指定操作的状态。 下表描述了各种 IrbStatus 值及其含义。
值 | 含义 |
IRB_STATUS_PENDING | 指示请求正在进行中。 端口驱动程序将 IrbStatus 初始化为此值。 微型端口驱动程序绝不应将 IrbStatus 成员设置为此值。 |
IRB_STATUS_SUCCESS | 指示请求已成功完成。 |
IRB_STATUS_DATALENGTH_MISMATCH | 指示发生了数据不足或溢出错误。 微型端口必须更新 IRB 中的 DataTransferLength 字段,以指示在运行不足的情况下传输的实际数据量。 |
IRB_STATUS_DEVICE_ERROR | 指示设备返回错误。 微型端口驱动程序必须在命令完成时将 Irb 中的 AtaStatus 和 AtaError 字段更新为设备 ATA 状态和错误注册的内容。 |
IRB_STATUS_INVALID_REQUEST | 指示微型端口不支持给定的请求。 |
IRB_STATUS_BUS_RESET | 指示在处理给定请求时发生总线重置。 |
IRB_STATUS_SELECTION_TIMEOUT | 指示无法选择目标设备。 |
IRB_STATUS_BUSY | 指示设备正忙。 端口驱动程序会重试此状态完成的任何请求。 以忙碌状态完成的请求仅重试一次。 如果设备在一段时间内无法处理请求,微型端口驱动程序负责使用 AtaPortDeviceBusy 暂停请求队列。 |
IRB_STATUS_AUTOSENSE_VALID | IRB_STATUS_AUTOSENSE_VALID是一个位掩码,指示 IRB 的 SenseInfoBuffer 成员中的有效感知数据。 |
IRB_STATUS_RETURN_TASKFILE_VALID | IRB_STATUS_RETURN_TASKFILE_VALID是一个位掩码,指示 IRB 的 SenseInfoBuffer 成员中的有效返回任务文件。 |
AtaStatus
指示设备在其状态寄存器中返回的状态。 使用 IRB_STATUS_DEVICE_ERROR 完成 IRB 时,微型端口驱动程序应更新此字段。
AtaError
指示设备在其错误寄存器中返回的错误值。 使用 IRB_STATUS_DEVICE_ERROR 完成 IRB 时,微型端口驱动程序应更新此字段。
Channel
指定通道编号。
TargetId
指定设备的目标 ID。
Lun
指定设备的逻辑单元号。
CdbLength
指定 Cdb 指向的缓冲区的长度(以字节为单位)。
SenseInfoBufferLength
指定 SenseInfoBuffer 指向的缓冲区的长度(以字节为单位)。
SenseInfoBufferType
指定 SenseInfoBuffer 中返回的数据结构的类型。 由于 ATA 命令不需要请求感知命令,因此ATA_PASS_THROUGH命令使用 SenseInfoBuffer 返回任务文件信息。 对于 ATA_PASS_THROUGH 命令,如 IrbFlags 成员中标识的那样,相应的返回 TaskFile 大小应报告为 SENSE_INFO_BUFFER_RETURN_TYPE_28BIT_TASKFILE 或
SENSE_INFO_BUFFER_RETURN_TYPE_48BIT_TASKFILE。
QueueTag
此 IRB 的队列标记。 端口驱动程序将此字段设置为 0。
ReservedAsUlong
保留供将来使用。
IrbFlags
使用需要执行的某些操作限定请求。 下表对它们进行了详细描述。
标记 | 说明 |
IRB_FLAGS_DRDY_REQUIRED | 指示微型端口驱动程序必须在发出此命令之前等待设备在 ATA 状态寄存器中设置 DRDY 位。 |
IRB_FLAGS_USE_DMA | 指示请求具有关联的散点/收集列表,微型端口驱动程序可以使用 DMA 传输此请求的数据。 |
IRB_FLAGS_MAP_BUFFERS | 指示映射 IRB 中的 DataBuffer 字段。 设置此标志后,微型端口可以安全地访问 DataBuffer 。 如果未设置标志,微型端口驱动程序不得访问 DataBuffer 。 微型端口驱动程序可以通过在其 IdeHwBuildIo 例程中的 IRB 中设置此标志来请求端口驱动程序映射数据缓冲区。 |
IRB_FLAGS_48BIT | 指示 IRB 中的 ATA 命令属于 48 位 LBA 功能集。 设置此标志时,_IDE_TASK_FILE结构中的“上一个”字段有效。 |
IRB_FLAGS_PIO_MULTIPLE | 指示将使用 ATA PIO Multiple 方法传输 ATA 命令。 |
IRB_FLAGS_RETURN_RESULTS | 指示 ATA 返回任务文件要复制到 SenseInfoBuffer。 |
IRB_FLAGS_DATA_IN | 指示将数据从设备传输到主机系统, (读取操作) 。 |
IRB_FLAGS_DATA_OUT | 指示将数据从主机系统传输到设备, ( 写入操作) 。 |
IRB_FLAGS_DISCARDABLE | 指示命令应尽最大努力完成。 (注意:ATAport) 当前不使用此功能。 |
IRB_FLAGS_HIGH_PRIORITY | 指示在 ATA 微型端口中当前具有非高优先级 IRB 之前,将尽快处理此 IRB。 |
TimeOutValue
指示请求将超时的时间(以秒为单位)。
DataTransferLength
包含包含要传输的数据的数据缓冲区的长度(以字节为单位)。
IrbExtension
指向端口驱动程序分配的每个请求扩展的指针。
DataBuffer
指向数据所在的缓冲区的指针。
SenseInfoBuffer
指向保存感知数据的缓冲区的指针。
NextIrb
指向要处理的下一个 IRB 的指针。 端口驱动程序将此设置为 NULL。 微型端口驱动程序可以使用此字段将 IRB 链接在一起。
Reserved
保留供将来使用。
IdeTaskFile
包含 IDE_TASK_FILE 类型的结构,用于保存所指示控制器的 IDE 任务文件。 只要 Function 成员与 IRB_FUNCTION_ATA_COMMAND 之间的按位 AND 结果为非零值,则定义此成员。
Cdb[16]
包含 CDB) (命令描述符块。 只要 Function 成员与 IRB_FUNCTION_ATAPI_COMMAND 之间的按位 AND 结果为非零值,则定义此成员。
PowerChange
指示定义电源状态转换的 POWER_CHANGE_INFO 类型的枚举值。 只要 Function 等于 IRB_FUNCTION_POWER_CHANGE,就定义此成员。
AsUChar[16]
提供一种将成员 IdeTaskFile、 PowerChange 和 Cdb 作为无符号字符数据进行访问的方法。
注解
IDE_REQUEST_BLOCK 结构提供与 SCSI_REQUEST_BLOCK 类似的功能 , 但具有更适合管理 IDE 总线上的设备的特征。
要求
要求 | 值 |
---|---|
Header | irb.h (包括 Irb.h) |