структура IDE_REQUEST_BLOCK (irb.h)
Структура IDE_REQUEST_BLOCK определяет блок запроса интегрированной среды разработки.
Синтаксис
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
Указывает категорию, к которой принадлежит запрос. В приведенной ниже таблице описывается классификация запросов ввода-вывода.
функции | вложенных команд | описание |
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 содержит IdeTaskFile, описывающий команду ATA. Вложенные команды указывают более точное группирование запросов для быстрого поиска. |
IRB_FUNCTION_ATAPI_COMMAND | IRB_FUNCTION_REQUEST_SENSE | Указывает, что IRB содержит CDB, описывающий команду ATAPI. |
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 | Указывает, что произошла ошибка при выполнении или перезапуске данных. Минипорт должен обновить поле DataTransferLength в IRB, чтобы указать фактический объем данных, передаваемых в случае недостаточного запуска. |
IRB_STATUS_DEVICE_ERROR | Указывает, что устройство вернуло ошибку. Минипорт-драйвер должен обновить ataStatus и поля AtaError в Irb до содержимого состояния и ошибки устройства 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 — это битовая маска, указывающая допустимые данные смысла в SenseInfoBuffer члена IRB. |
IRB_STATUS_RETURN_TASKFILE_VALID | IRB_STATUS_RETURN_TASKFILE_VALID — это битовая маска, указывающая допустимый файл задачи возврата в SenseInfoBuffer члена IRB. |
AtaStatus
Указывает состояние, возвращаемое устройством в его регистре состояния. Минипорт-драйвер должен обновить это поле при завершении IRB с IRB_STATUS_DEVICE_ERROR.
AtaError
Указывает значение ошибки, возвращаемое устройством в регистре ошибок. Минипорт-драйвер должен обновить это поле при завершении IRB с IRB_STATUS_DEVICE_ERROR.
Channel
Указывает номер канала.
TargetId
Указывает целевой идентификатор устройства.
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 | Указывает, что драйвер минипорта должен ждать, пока устройство должно задать бит DRDY в регистре состояния ATA перед выдачой этой команды. |
IRB_FLAGS_USE_DMA | Указывает, что запрос содержит связанный список точечной и сборной, а драйвер минипорта может использовать DMA для передачи данных для этого запроса. |
IRB_FLAGS_MAP_BUFFERS | Указывает, что поле DataBuffer в IRB сопоставляется. Минипорт может безопасно получить доступ к DataBuffer при установке этого флага. Драйвер мини-порта не должен получить доступ к DataBuffer, если флаг не задан. Минипорт-драйвер может запросить драйвер порта для сопоставления буфера данных, задав этот флаг в IRB в его подпрограмме IdeHwBuildIo. |
IRB_FLAGS_48BIT | Указывает, что команда ATA в IRB принадлежит 48-разрядному набору функций LBA. Поле предыдущей в структуре _IDE_TASK_FILE допустимо при установке этого флага. |
IRB_FLAGS_PIO_MULTIPLE | Указывает, что команда ATA должна быть передана с помощью метода ATA PIO Multiple. |
IRB_FLAGS_RETURN_RESULTS | Указывает, что файл задачи возврата ATA должен быть скопирован в SenseInfoBuffer. |
IRB_FLAGS_DATA_IN | Указывает, что данные передаются с устройства на хост-систему (операция чтения). |
IRB_FLAGS_DATA_OUT | Указывает, что данные передаются на устройство из хост-системы (операция записи). |
IRB_FLAGS_DISCARDABLE | Указывает, что команда должна выполняться наилучшим образом. (примечание. В настоящее время это не используется ATAport). |
IRB_FLAGS_HIGH_PRIORITY | Указывает, что этот IRB-код должен обрабатываться как можно скорее, прежде чем высокоприоритетные IRBS в настоящее время в мини-порте ATA. |
TimeOutValue
Указывает время в секундах, после которого запрос будет истекает.
DataTransferLength
Содержит длину в байтах буфера данных, содержащего передаваемые данные.
IrbExtension
Указатель на расширение для каждого запроса, выделенное драйвером порта.
DataBuffer
Указатель на буфер, в котором находятся данные.
SenseInfoBuffer
Указатель на буфер, содержащий данные смысла.
NextIrb
Указатель на следующую обработку IRB. Драйвер порта задает для этого значение NULL. Минипорт-драйвер может использовать это поле для связывания IRB вместе.
Reserved
Зарезервировано для дальнейшего использования.
IdeTaskFile
Содержит структуру типа IDE_TASK_FILE, в которой хранится файл задачи интегрированной среды разработки для указанного контроллера. Этот элемент определяется всякий раз, когда результат побитового И между элементом функции и IRB_FUNCTION_ATA_COMMAND является ненулевой.
Cdb[16]
Содержит блок дескриптора команды (CDB). Этот элемент определяется всякий раз, когда результат побитового И между элементом функции и IRB_FUNCTION_ATAPI_COMMAND ненулево.
PowerChange
Указывает значение перечисления типа POWER_CHANGE_INFO, определяющее переход состояния питания. Этот элемент определяется всякий раз, когда функция равна IRB_FUNCTION_POWER_CHANGE.
AsUChar[16]
Предоставляет средства доступа к членам IdeTaskFile, PowerChangeи Cdb как неподписанные символьные данные.
Замечания
Структура IDE_REQUEST_BLOCK предоставляет функциональные возможности, аналогичные SCSI_REQUEST_BLOCK, но с характеристиками, более подходящими для управления устройствами в шине интегрированной среды разработки.
Требования
Требование | Ценность |
---|---|
заголовка | irb.h (include Irb.h) |