структура SCSI_REQUEST_BLOCK (srb.h)

Структура SCSI_REQUEST_BLOCK связана с функцией SRB.

Примечание

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

Синтаксис

typedef struct _SCSI_REQUEST_BLOCK {
  USHORT                     Length;
  UCHAR                      Function;
  UCHAR                      SrbStatus;
  UCHAR                      ScsiStatus;
  UCHAR                      PathId;
  UCHAR                      TargetId;
  UCHAR                      Lun;
  UCHAR                      QueueTag;
  UCHAR                      QueueAction;
  UCHAR                      CdbLength;
  UCHAR                      SenseInfoBufferLength;
  ULONG                      SrbFlags;
  ULONG                      DataTransferLength;
  ULONG                      TimeOutValue;
  PVOID                      DataBuffer;
  PVOID                      SenseInfoBuffer;
  struct _SCSI_REQUEST_BLOCK *NextSrb;
  PVOID                      OriginalRequest;
  PVOID                      SrbExtension;
  union {
    ULONG InternalStatus;
    ULONG QueueSortKey;
    ULONG LinkTimeoutValue;
  };
  ULONG                      Reserved;
  UCHAR                      Cdb[16];
} SCSI_REQUEST_BLOCK, *PSCSI_REQUEST_BLOCK;

Участники

Length

Задает размер в байтах этой структуры.

Function

Указывает выполняемую операцию, которая может быть одним из следующих значений:

Значение Операция
SRB_FUNCTION_EXECUTE_SCSI (0x00) Запрос на ввод-вывод устройства SCSI должен выполняться в целевой логической единице.
SRB_FUNCTION_ABORT_COMMAND (0x10) Сообщение SCSIMESS_ABORT должно быть отправлено для отмены запроса, на который указывает член NextSrb . Если это запрос с тегами очереди, вместо него следует использовать SCSIMESS_ABORT_WITH_TAG сообщение. Если указанный запрос завершен, этот запрос должен быть выполнен обычным образом. Допустимы только члены функции SRB, PathId, TargetId, Lun и NextSrb .
SRB_FUNCTION_RESET_DEVICE (0x13) Драйвер ScsiPort больше не отправляет этот SRB в свои мини-порты. Только драйверы минипорта Storport используют этот SRB. Целевой контроллер SCSI должен быть сброшен с помощью сообщения SCSIMESS_BUS_DEVICE_RESET. Драйвер минипорта должен выполнять все активные запросы для целевого контроллера. Допустимы только члены функции SRB, TargetId и PathId .
SRB_FUNCTION_RESET_LOGICAL_UNIT (0x20) Если это возможно, логическая единица должна быть сброшена. Драйвер мини-порта HBA должен выполнять все активные запросы для логической единицы. Допустимы только члены функции, PathId, TargetId и Lun SRB. Storport поддерживает этот тип сброса, но порт SCSI не поддерживается.
SRB_FUNCTION_RESET_BUS (0x12) Шина SCSI должна быть сброшена с помощью сообщения SCSIMESS_BUS_DEVICE_RESET. Драйвер минипорта получает этот запрос только в том случае, если истекло время ожидания заданного запроса и последующий запрос, чтобы прервать истекло время ожидания запроса. Допустимы только члены функции SRB и PathId .
SRB_FUNCTION_TERMINATE_IO (0x14) Сообщение SCSIMESS_TERMINATE_IO_PROCESS должно быть отправлено для отмены запроса, на который указывает член NextSrb . Если указанный запрос уже завершен, этот запрос должен быть выполнен обычным образом. Допустимы только члены функции SRB, PathId, TargetId, Lun и NextSrb .
SRB_FUNCTION_RELEASE_RECOVERY (0x11) Сообщение SCSIMESS_RELEASE_RECOVERY должно быть отправлено целевому контроллеру. Допустимы только члены функции SRB, PathId, TargetId и Lun .
SRB_FUNCTION_RECEIVE_EVENT (0x03) HBA следует подготовить к получению асинхронного уведомления о событии от целевого объекта. Член SRB DataBuffer указывает, где должны размещаться данные.
SRB_FUNCTION_SHUTDOWN (0x07) Система завершает работу. Этот запрос отправляется драйверу мини-порта только в том случае, если параметр CachesData имеет значение TRUE в PORT_CONFIGURATION_INFORMATION для HBA. Такой драйвер минипорта может получать несколько из этих уведомлений, прежде чем все действия системы фактически остановлены. Однако после последнего запуска ввода-вывода будет происходить последнее уведомление о завершении работы. Допустимы только функции SRB, PathId, TargetId и Lun .
SRB_FUNCTION_FLUSH (0x08) Драйвер минипорта должен очистить все кэшированные данные для целевого устройства. Этот запрос отправляется драйверу мини-порта только в том случае, если параметр CachesData имеет значение TRUE в PORT_CONFIGURATION_INFORMATION для HBA. Допустимы только функции SRB, PathId, TargetId и Lun .
SRB_FUNCTION_IO_CONTROL (0x02) Запрос — это запрос на управление вводом-выводом, исходящий в приложении пользовательского режима с выделенным HBA. DataBuffer SRB указывает на заголовок SRB_IO_CONTROL, за которым следует область данных. Значение в DataBuffer может использоваться драйвером независимо от значения MapBuffers. Допустимы только функцииSRB, SrbFlags, TimeOutValue, DataBuffer и DataTransferLength , а также член SrbExtension , если драйвер минипорта запросил расширения SRB при инициализации. Если драйвер минипорта управляет выделенным приложением адаптером HBA, чтобы он поддерживал этот запрос, мини-драйвер должен выполнить запрос и уведомить драйвер порта, зависящий от ОС, когда SRB завершил работу, используя обычный механизм вызовов ScsiPortNotification с RequestComplete и NextRequest.
SRB_FUNCTION_LOCK_QUEUE (0x18) Содержит запросы, помещенные в очередь драйвером порта для определенной логической единицы, обычно при обработке запроса питания. Допустимы только элементы SRB Length, Function, SrbFlags и OriginalRequest . Если очередь заблокирована, будут обрабатываться только запросы с ORed SrbFlags с SRB_FLAGS_BYPASS_LOCKED_QUEUE. Драйверы минипорта SCSI не обрабатывают запросы SRB_FUNCTION_LOCK_QUEUE.
SRB_FUNCTION_UNLOCK_QUEUE (0x19) Освобождает очередь драйвера порта для логического блока, ранее заблокированного с помощью SRB_FUNCTION_LOCK_QUEUE. SrbFlags запроса на разблокировку должен быть ORed с SRB_FLAGS_BYPASS_LOCKED_QUEUE. Допустимы только элементы SRB Length, Function, SrbFlags и OriginalRequest . Драйверы минипорта SCSI не обрабатывают SRB_FUNCTION_UNLOCK_QUEUE запросов.
SRB_FUNCTION_UNLOCK_QUEUE (0x19) Освобождает очередь драйвера порта для логического блока, ранее заблокированного с помощью SRB_FUNCTION_LOCK_QUEUE. SrbFlags запроса на разблокировку должен быть ORed с SRB_FLAGS_BYPASS_LOCKED_QUEUE. Допустимы только элементы SRB Length, Function, SrbFlags и OriginalRequest . Драйверы минипорта SCSI не обрабатывают SRB_FUNCTION_UNLOCK_QUEUE запросов.
SRB_FUNCTION_DUMP_POINTERS (0x26) Запрос с этой функцией отправляется драйверу минипорта Storport, который используется для управления диском, в котором хранятся данные аварийного дампа. Запрос собирает сведения, необходимые драйверу мини-порта для поддержки аварийного дампа и гибернации. См. структуру MINIPORT_DUMP_POINTERS . Драйвер физического минипорта должен задать флаг STOR_FEATURE_DUMP_POINTERS в элементе FeatureSupport своего HW_INITIALIZATION_DATA , чтобы получить запрос с этой функцией.
SRB_FUNCTION_FREE_DUMP_POINTERS (0x27) Запрос с этой функцией отправляется драйверу минипорта Storport, чтобы освободить все ресурсы, выделенные во время предыдущего запроса на SRB_FUNCTION_DUMP_POINTERS.

SrbStatus

Возвращает состояние завершенного запроса. Этот член должен быть задан драйвером минипорта, прежде чем он уведомляет драйвер, зависящий от ОС, о завершении запроса путем вызова ScsiPortNotification с RequestComplete. Значение этого элемента может быть одним из следующих значений:

Значение Значение
SRB_STATUS_PENDING Указывает, что запрос выполняется. Драйвер порта для конкретной ОС инициализирует SrbStatus этим значением.
SRB_STATUS_SUCCESS Указывает, что запрос успешно завершен.
SRB_STATUS_ABORTED Указывает, что запрос был прерван драйвером порта. Драйвер минипорта задает это состояние в NextSrb для успешного запроса SRB_FUNCTION_ABORT_COMMAND.
SRB_STATUS_ABORT_FAILED Указывает на попытку прерывания запроса. Возвращает это состояние для запроса SRB_FUNCTION_ABORT_COMMAND, если не удается найти указанный запрос.
SRB_STATUS_ERROR Указывает, что запрос был завершен с ошибкой в состоянии ШИНЫ SCSI.
SRB_STATUS_BUSY Указывает, что драйвер мини-порта или целевое устройство не смогли принять запрос в настоящее время. Драйвер порта, зависящий от ОС, повторно отправляет запрос позже.
SRB_STATUS_INTERNAL_ERROR Указывает, что драйвер порта SCSI не может доставить запрос к драйверу мини-порта или целевому устройству. В таких случаях состояние записывается в InternalStatus.
SRB_STATUS_INVALID_REQUEST Указывает, что драйвер минипорта не поддерживает заданный запрос.
SRB_STATUS_NO_DEVICE Указывает, что устройство не ответило.
SRB_STATUS_TIMEOUT Указывает время ожидания запроса.
SRB_STATUS_SELECTION_TIMEOUT Указывает время ожидания выбора устройства SCSI.
SRB_STATUS_COMMAND_TIMEOUT Указывает, что целевой объект не выполнил команду в течение периода времени.
SRB_STATUS_MESSAGE_REJECTED Указывает, что целевой объект отклонил сообщение. Обычно это возвращается только для таких запросов типа сообщений, как SRB_FUNCTION_TERMINATE_IO.
SRB_STATUS_BUS_RESET Указывает, что во время выполнения этого запроса произошел сброс шины.
SRB_STATUS_PARITY_ERROR Указывает на ошибку четности на шине SCSI и о сбое повторных попыток.
SRB_STATUS_REQUEST_SENSE_FAILED Указывает, что не удалось выполнить команду request-sense. Это возвращается только в том случае, если HBA выполняет автозапрос и драйвер минипорта устанавливает для AutoRequestSenseзначение TRUE в PORT_CONFIGURATION_INFORMATION для этого адаптера HBA.
SRB_STATUS_NO_HBA Указывает, что HBA не отвечает.
SRB_STATUS_DATA_OVERRUN Указывает, что произошла ошибка переполнения или переполнения данных. Драйвер минипорта также должен обновить элемент DataTransferLength SRB, чтобы указать, сколько данных фактически было передано при возникновении недостаточного запуска.
SRB_STATUS_UNEXPECTED_BUS_FREE Указывает на неожиданное отключение целевого объекта.
SRB_STATUS_PHASE_SEQUENCE_FAILURE Указывает, что HBA обнаружила недопустимую ошибку последовательности этапов.
SRB_STATUS_REQUEST_FLUSHED Указывает, что запрос на состояние был остановлен.
SRB_STATUS_BAD_FUNCTION Указывает, что код функции SRB не поддерживается.
SRB_STATUS_INVALID_PATH_ID Указывает, что pathId , указанный в SRB, не существует.
SRB_STATUS_INVALID_TARGET_ID Указывает, что значение TargetID в SRB недопустимо.
SRB_STATUS_INVALID_LUN Указывает, что значение Lun в SRB недопустимо.
SRB_STATUS_ERROR_RECOVERY Указывает, что запрос был завершен с ошибкой в состоянии ШИНЫ SCSI и что получено сообщение SCSI INITIAT RECOVERY.
SRB_STATUS_AUTOSENSE_VALID Указывает, что информация, возвращаемая в SenseInfoBuffer , действительна.
SRB_STATUS_QUEUE_FROZEN Драйвер минипорта никогда не должен присваивать этому значению член SrbStatus . Драйвер порта Windows может задать это значение, чтобы сообщить драйверу класса хранения о том, что очередь запросов для конкретного периферийного устройства была заморожена.

ScsiStatus

Возвращает состояние SCSI, возвращенное HBA или целевым устройством. Если состояние не выполнено успешно, драйвер минипорта должен задать для элемента SrbStatus значение SRB_STATUS_ERROR.

PathId

Указывает порт или шину SCSI для запроса. Это значение отсчитывается от нуля.

TargetId

Указывает целевой контроллер или устройство на шине.

Lun

Указывает логический номер устройства.

QueueTag

Содержит значение тега очереди, назначенное драйвером портов для конкретной ОС. Если этот элемент используется для очередей с тегами, HBA поддерживает внутреннее очередь запросов к LUs, а драйвер минипорта задайте для taggedQueueingзначение TRUE в PORT_CONFIGURATION_INFORMATION для этого адаптера HBA.

QueueAction

Указывает сообщение с тегами, которое будет использоваться при установке флага SRB_FLAGS_QUEUE_ACTION_ENABLE. Это может быть одно из следующих значений: SRB_SIMPLE_TAG_REQUEST, SRB_HEAD_OF_QUEUE_TAG_REQUEST или SRB_ORDERED_QUEUE_TAG_REQUEST, как определено в соответствии со спецификацией SCSI.

CdbLength

Указывает размер блока дескриптора команды SCSI-2 или более поздней версии в байтах.

SenseInfoBufferLength

Указывает размер буфера смысле запроса в байтах. Если происходит недостаточное выполнение, драйвер мини-порта должен обновить этот элемент до количества фактически переданных байтов.

SrbFlags

Указывает различные параметры и параметры запроса. SrbFlags доступен только для чтения, за исключением случаев, когда SRB_FLAGS_UNSPECIFIED_DIRECTION задан и драйверы минипорта подчиненных адаптеров DMA требуются для обновления SRB_FLAGS_DATA_IN или SRB_FLAGS_DATA_OUT. Этот член может иметь один или несколько следующих флагов:

Флаг Значение
SRB_FLAGS_QUEUE_ACTION_ENABLE Указывает, что действия с тегами очереди должны быть включены.
SRB_FLAGS_DISABLE_AUTOSENSE Указывает, что сведения о смысле запроса не должны возвращаться.
SRB_FLAGS_DATA_IN Указывает, что данные будут передаваться с устройства в систему.
SRB_FLAGS_DATA_OUT Указывает, что данные будут передаваться из системы на устройство.
SRB_FLAGS_UNSPECIFIED_DIRECTION Определяется для обратной совместимости с интерфейсами ASPI/CAM SCSI, этот флаг указывает, что направление передачи может быть либо из предыдущего, так как оба предыдущих флага заданы. Если этот флаг установлен, драйвер минипорта должен определить направление передачи, проверив этап данных для целевого объекта на шине SCSI. Если его HBA является подчиненным устройством DMA, такой драйвер минипорта должен обновить SRB_FLAGS_DATA_OUT или SRB_FLAGS_DATA_IN до правильного значения перед вызовом ScsiPortIoMapTransfer.
SRB_FLAGS_NO_DATA_TRANSFER Указывает, что передача данных с этим запросом отсутствует. Если это задано, флаги SRB_FLAGS_DATA_OUT, SRB_FLAGS_DATA_IN и SRB_FLAGS_UNSPECIFIED_DIRECTION будут понятны.
SRB_FLAGS_DISABLE_SYNCH_TRANSFER Указывает, что HBA, если это возможно, должен выполнять асинхронный ввод-вывод для этого запроса на передачу. Если синхронный ввод-вывод был согласован ранее, HBA должен пересмотреть асинхронный ввод-вывод перед выполнением передачи.
SRB_FLAGS_DISABLE_DISCONNECT Указывает, что HBA не должен разрешать целевому объекту отключаться от шины SCSI во время обработки этого запроса.
SRB_FLAGS_BYPASS_FROZEN_QUEUE Не имеет значения для водителей минипорта.
SRB_FLAGS_NO_QUEUE_FREEZE Не имеет значения для водителей минипорта.
SRB_FLAGS_IS_ACTIVE Не имеет значения для водителей минипорта.
SRB_FLAGS_ALLOCATED_FROM_ZONE Не имеет значения для драйверов минипорта и является устаревшим для текущих драйверов класса Windows. Для устаревшего драйвера класса Windows это указывает, выделен ли SRB из буфера зоны. Если этот флаг задан, драйвер класса должен вызвать ExInterlockedFreeToZone , чтобы освободить SRB; в противном случае он должен вызывать ExFreePool. Новые драйверы классов должны использовать списки lookaside, а не буферы зоны.
SRB_FLAGS_SGLIST_FROM_POOL Не имеет значения для водителей минипорта. Для драйвера класса Windows это означает, что память для списка точечной и сборной была выделена из непагированного пула. Если этот флаг установлен, драйвер класса должен вызвать ExFreePool , чтобы освободить память после завершения SRB.
SRB_FLAGS_BYPASS_LOCKED_QUEUE Не имеет значения для водителей минипорта. Для драйвера портов этот флаг указывает, что запрос должен обрабатываться, блокируется ли очередь логических единиц. Драйвер более высокого уровня должен задать этот флаг для отправки запроса SRB_FUNCTION_UNLOCK_QUEUE.
SRB_FLAGS_NO_KEEP_AWAKE Не имеет значения для водителей минипорта. Драйвер класса Windows использует этот флаг, чтобы указать драйверу порта, чтобы сообщить об простое, а не включить устройство для обработки этого запроса.
SRB_FLAGS_FREE_SENSE_BUFFER Указывает, что порт или драйвер минипорта выделил буфер для смысле данных. Это информирует драйвер класса о том, что он должен освободить буфер данных sense после извлечения данных.

DataTransferLength

Указывает размер в байтах буфера данных. Если происходит недостаточное выполнение, драйвер мини-порта должен обновить этот элемент до количества фактически переданных байтов.

TimeOutValue

Указывает интервал в секундах, который запрос может выполняться до истечения времени ожидания драйвера порта для конкретной ОС. Драйверы минипорта не требуются для запросов времени, так как драйвер порта уже выполняет.

DataBuffer

Указывает на буфер данных. Драйверы минипорта не должны использовать это значение в качестве указателя данных, если драйвер мини-порта не устанавливает MapBuffers значение TRUE в PORT_CONFIGURATION_INFORMATION для HBA. Однако в случае запросов SRB_FUNCTION_IO_CONTROL драйверы минипорта могут использовать это значение в качестве указателя данных независимо от значения MapBuffers.

SenseInfoBuffer

Указывает на буфер смысла запроса. Драйвер минипорта не требуется для предоставления данных о смысле запроса после ПРОВЕРКИ УСЛОВИЯ.

NextSrb

Указывает SCSI_REQUEST_BLOCK, к которым применяется этот запрос. Только небольшое подмножество запросов использует второй SRB, например SRB_FUNCTION_ABORT_COMMAND.

OriginalRequest

Указывает на IRP для этого запроса. Этот член не имеет значения для драйверов минипорта

SrbExtension

Указывает на расширение Srb. Драйвер минипорта не должен использовать этот элемент, если для него задано значение SrbExtensionSize равным нулю в SCSI_HW_INITIALIZATION_DATA. Память в SrbExtension не инициализирована драйвером порта для конкретной ОС, и данные, определяемые драйвером мини-порта, могут обращаться непосредственно с помощью HBA. Соответствующий физический адрес можно получить, вызвав ScsiPortGetPhysicalAddress с указателем SrbExtension .

InternalStatus

Используется драйвером порта SCSI, а не SrbStatus, чтобы сообщить о состоянии завершенного запроса всякий раз, когда запрос не может быть доставлен драйверу мини-порта. В таких случаях для SrbStatus задано значение SRB_STATUS_INTERNAL_ERROR. Этот элемент используется исключительно для обмена данными между портом SCSI и драйвером класса и не должен использоваться драйверами мини-порта.

QueueSortKey

Задает смещение от начала носителя или нуля в зависимости от типа целевого устройства.

LinkTimeoutValue

Значение времени ожидания связи.

Reserved

Зарезервировано.

Cdb[16]

Указывает блок дескриптора команды SCSI-2 или более поздней версии, отправляемый на целевое устройство.

Комментарии

Класс хранения Windows и драйверы фильтров могут отправлять SBS со следующими значениями функций в драйвер системного порта:

  • SRB_FUNCTION_CLAIM_DEVICE, чтобы указать, что драйвер класса поддерживает периферийное устройство, определенное в SRB элементами PathId, TargetId и Lun .
  • SRB_ATTACH_DEVICE, чтобы указать, что драйвер фильтра, слоистый над драйвером класса, хочет, чтобы запросы конкретного периферийного устройства сначала направлялись в драйвер фильтра.
  • SRB_FUNCTION_RELEASE_DEVICE, чтобы указать, что драйвер класса освобождает свое утверждение на определенном периферийном устройстве.
  • SRB_FUNCTION_FLUSH_QUEUE запросить отмену любых запросов, которые в настоящее время поставлены в очередь в драйвере порта на определенное периферийное устройство.
  • SRB_FUNCTION_RELEASE_QUEUE запросить, чтобы драйвер порта выпустил замороженную очередь запросов на определенное периферийное устройство.

Предыдущие SRB_FUNCTION_XXXX никогда не задаются в SRB, отправляемых в драйверы мини-порта SCSI. SRB_FUNCTION_REMOVE_DEVICE определяется для использования в будущих версиях системы. Он также никогда не задается в SRB, отправляемых в драйверы минипорта SCSI. SRB_FUNCTION_WMI_REQUEST действителен только в SCSI_WMI_REQUEST_BLOCK. Для отправки запросов WMI драйверу порта используется класс хранения или драйвер фильтра.

Требования

   
Заголовок srb.h (include Srb.h, Minitape.h, Storport.h)

См. также раздел

ExFreePool

ExInterlockedFreeToZone

HW_INITIALIZATION_DATA (SCSI)

PORT_CONFIGURATION_INFORMATION (SCSI)

SCSI_WMI_REQUEST_BLOCK

SRB_IO_CONTROL

ScsiPortGetPhysicalAddress

ScsiPortGetSrb

ScsiPortIoMapTransfer

ScsiPortNotification