структура 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) Чтобы отменить запрос, на который указывает участник NextSrb , должно быть отправлено SCSIMESS_ABORT сообщение. Если это запрос очереди с тегами, вместо него следует использовать SCSIMESS_ABORT_WITH_TAG сообщение. Если указанный запрос был выполнен, этот запрос должен быть выполнен в обычном режиме. Допустимы только члены функции SRB, PathId, TargetId, Lun и NextSrb .
SRB_FUNCTION_RESET_DEVICE (0x13) Драйвер ScsiPort больше не отправляет этот SRB в свои мини-порты. Только драйверы miniport Storport используют этот SRB. Целевой контроллер SCSI должен быть сброшен с помощью сообщения SCSIMESS_BUS_DEVICE_RESET. Драйвер мини-порта должен выполнять все активные запросы для целевого контроллера. Допустимы только члены функции SRB, TargetId и PathId .
SRB_FUNCTION_RESET_LOGICAL_UNIT (0x20) Если это возможно, логическая единица должна быть сброшена. Драйвер мини-порта HBA должен выполнять все активные запросы для логического блока. Допустимы только элементы Function, PathId, TargetId и Lun SRB. Storport поддерживает этот тип сброса, но порт SCSI — нет.
SRB_FUNCTION_RESET_BUS (0x12) Шина SCSI должна быть сброшена с помощью сообщения SCSIMESS_BUS_DEVICE_RESET. Драйвер мини-порта получает этот запрос только в том случае, если истекло время ожидания заданного запроса, а для последующего запроса на прерывание запроса истекло время ожидания. Допустимы только члены функции SRB и PathId .
SRB_FUNCTION_TERMINATE_IO (0x14) Чтобы отменить запрос, на который указывает участник NextSrb , должно быть отправлено SCSIMESS_TERMINATE_IO_PROCESS сообщение. Если указанный запрос уже выполнен, этот запрос должен быть выполнен в обычном режиме. Допустимы только члены функции 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. SRB DataBuffer указывает на заголовок 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 . Если очередь заблокирована, будут обрабатываться только запросы с SrbFlags ORed с 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 Указывает на сбой команды запроса. Возвращается только в том случае, если 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 поддерживает внутреннюю очередь запросов к LU, а драйвер мини-порта устанавливает для 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 и для обновления SRB_FLAGS_DATA_IN или SRB_FLAGS_DATA_OUT требуются драйверы мини-портов подчиненных адаптеров DMA. Этот элемент может иметь один или несколько из следующих флагов:

Flag Значение
SRB_FLAGS_QUEUE_ACTION_ENABLE Указывает, что необходимо включить действия очереди с тегами.
SRB_FLAGS_DISABLE_AUTOSENSE Указывает, что не следует возвращать сведения о смысле запроса.
SRB_FLAGS_DATA_IN Указывает, что данные будут передаваться с устройства в систему.
SRB_FLAGS_DATA_OUT Указывает, что данные будут передаваться из системы на устройство.
SRB_FLAGS_UNSPECIFIED_DIRECTION Этот флаг, определенный для обратной совместимости с интерфейсами SCSI ASPI/CAM, указывает, что направление передачи может быть любой из предыдущих, так как установлены оба предыдущих флага. Если этот флаг установлен, драйвер мини-порта должен определить направление передачи, проверив этап данных для целевого объекта на шине 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 Указывает, что порт или драйвер минипорта выделил буфер для данных контроля. Это информирует драйвер класса о том, что он должен освободить буфер данных осмысления после извлечения данных.

DataTransferLength

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

TimeOutValue

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

DataBuffer

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

SenseInfoBuffer

Указывает на буфер чувства запроса. Драйвер мини-порта не требуется для предоставления данных о смысле запроса после check CONDITION.

NextSrb

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

OriginalRequest

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

SrbExtension

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

InternalStatus

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

QueueSortKey

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

LinkTimeoutValue

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

Reserved

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

Cdb[16]

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

Комментарии

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

  • 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_XXX никогда не задаются в SSP-файлах, отправляемых в драйверы мини-порта SCSI. SRB_FUNCTION_REMOVE_DEVICE определяется для использования в будущих версиях системы. Он также никогда не задается в SDB-файлах, отправляемых в драйверы минипорта SCSI. SRB_FUNCTION_WMI_REQUEST действителен только в SCSI_WMI_REQUEST_BLOCK. Класс хранения или драйвер фильтра использует его для отправки запросов WMI к драйверу порта.

Требования

Требование Значение
Заголовок srb.h (включая 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