Поделиться через


структура IDE_REQUEST_BLOCK (irb.h)

Структура IDE_REQUEST_BLOCK определяет блок запроса интегрированной среды разработки.

Примечание В будущем модели драйверов портов ATA и мини-порта ATA могут быть изменены или недоступны. Вместо этого мы рекомендуем использовать драйвера Storport и минипорта Storport модели драйверов.
 

Синтаксис

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)

См. также

AtaportDeviceBusy

IDE_TASK_FILE

POWER_CHANGE_INFO

SCSI_REQUEST_BLOCK