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 请求的分类。
函数 | 子命令 | 说明 |
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。 微型端口驱动程序可以通过在 IRB IdeHwBuildIo 例程中设置此标志来请求端口驱动程序映射数据缓冲区。 |
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 任务文件。 每当 函数 成员和IRB_FUNCTION_ATA_COMMAND之间的按位 AND 结果为非零时,就定义此成员。
Cdb[16]
包含命令描述符块(CDB)。 每当 函数 成员和IRB_FUNCTION_ATAPI_COMMAND之间的按位 AND 结果为非零时,就定义此成员。
PowerChange
指示定义电源状态转换的 POWER_CHANGE_INFO 类型的枚举值。 每当 函数 等于IRB_FUNCTION_POWER_CHANGE时,都定义此成员。
AsUChar[16]
提供访问 IdeTaskFile 、PowerChange和 Cdb 作为无符号字符数据的成员的方法。
言论
IDE_REQUEST_BLOCK结构提供的功能类似于 SCSI_REQUEST_BLOCK,但特征更适合管理 IDE 总线上的设备。
要求
要求 | 价值 |
---|---|
标头 | irb.h (包括 Irb.h) |