структура STORAGE_REQUEST_BLOCK (minitape.h)

STORAGE_REQUEST_BLOCK — это расширенная структура блока запросов SCSI (SRB). Структура обеспечивает добавление расширенных данных, связанных с функцией SRB.

Замечание

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

Синтаксис

typedef struct _STORAGE_REQUEST_BLOCK {
  USHORT                               Length;
  UCHAR                                Function;
  UCHAR                                SrbStatus;
  ULONG                                ReservedUlong1;
  ULONG                                Signature;
  ULONG                                Version;
  ULONG                                SrbLength;
  ULONG                                SrbFunction;
  ULONG                                SrbFlags;
  ULONG                                ReservedUlong2;
  ULONG                                RequestTag;
  USHORT                               RequestPriority;
  USHORT                               RequestAttribute;
  ULONG                                TimeOutValue;
  union {
    ULONG SystemStatus;
    ULONG RequestTagHigh4Bytes;
  } DUMMYUNIONNAME;
  ULONG                                SystemStatus;
  ULONG                                ZeroGuard1;
  ULONG                                AddressOffset;
  ULONG                                NumSrbExData;
  ULONG                                DataTransferLength;
  PVOID POINTER_ALIGN                  DataBuffer;
  PVOID POINTER_ALIGN                  ZeroGuard2;
  PVOID POINTER_ALIGN                  OriginalRequest;
  PVOID POINTER_ALIGN                  ClassContext;
  PVOID POINTER_ALIGN                  PortContext;
  PVOID POINTER_ALIGN                  MiniportContext;
  _STORAGE_REQUEST_BLOCK POINTER_ALIGN *NextSrb;
  struct                               _STORAGE_REQUEST_BLOCK;
  ULONG                                SrbExDataOffset[ANYSIZE_ARRAY];
} STORAGE_REQUEST_BLOCK, *PSTORAGE_REQUEST_BLOCK;

Members

Length

Задает размер заголовка SRB для совместимости со структурой SCSI_REQUEST_BLOCK . Это равно смещение элемента сигнатуры этой структуры.

Function

Задайте значение SRB_FUNCTION_STORAGE_REQUEST_BLOCK , чтобы указать, что это расширенный SRB. В отличие от SCSI_REQUEST_BLOCK, идентификатор функции SRB находится в элементе SrbFunction .

SrbStatus

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

Ценность Meaning
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 Указывает, что драйвер Storport не смог доставить запрос в драйвер мини-порта или целевое устройство. В таких случаях состояние записывается в 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 может задать это значение, чтобы сообщить драйверу класса хранилища, что его очередь запросов для конкретного периферийного устройства была заморожена.
SRB_STATUS_NOT_POWERED Указывает, что запрос завершился сбоем, так как целевой объект не работает. Для запросов с SRB_FLAGS_NO_KEEP_AWAKE, заданных в SrbFlags, запросы, отправленные в LUN, которые отключены, завершаются сбоем с этим состоянием.
SRB_STATUS_LINK_DOWN Указывает, что запрос завершился сбоем, так как ссылка отключена.
SRB_STATUS_BAD_SRB_BLOCK_LENGTH Указывает, что запрос завершился ошибкой, так как длина SRB была недопустимой.

ReservedUlong1

Зарезервировано. Установите значение 0.

Signature

Подпись расширенного формата SRB. Для этого задано значение SRB_SIGNATURE.

Version

Используемая версия структуры. Текущая версия STORAGE_REQUEST_BLOCK_VERSION_1.

SrbLength

Длина этого расширенного SRB в байтах, включая эту структуру, адрес и любые расширенные данные SRB.

SrbFunction

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

Ценность Meaning
SRB_FUNCTION_EXECUTE_SCSI (0x00) Запрос ввода-вывода устройства SCSI должен выполняться в целевом логическом модуле. Если NumSrbExData> 0, одна или несколько расширенных структур блоков запросов находятся в смещениях, указанных в SrbExDataOffset: SRBEX_DATA_SCSI_CDB16, SRBEX_DATA_SCSI_CDB32, SRBEX_DATA_SCSI_CDB_VAR, SRBEX_DATA_BIDIRECTIONAL, SRBEX_DATA_IO_INFO
SRB_FUNCTION_ABORT_COMMAND (0x10) Сообщение SCSIMESS_ABORT должно быть отправлено для отмены запроса, на который указывает член NextSrb . Если это запрос с тегами очереди, вместо этого следует использовать SCSIMESS_ABORT_WITH_TAG сообщение. Если указанный запрос был завершен, этот запрос должен быть выполнен нормально. Расширенные данные SRB не требуются для этой функции. ПРИМЕЧАНИЕ. Эта функция не отправляется в минипорт Storport.
SRB_FUNCTION_RESET_DEVICE (0x16) Целевой контроллер SCSI должен быть сброшен с помощью сообщения SCSIMESS_BUS_DEVICE_RESET. Минипорт-драйвер должен завершить все активные запросы целевого контроллера. Расширенные данные SRB не требуются для этой функции.
SRB_FUNCTION_RESET_LOGICAL_UNIT (0x20) Если это возможно, логическая единица должна быть сброшена. Мини-порт HBA должен завершить все активные запросы для логического блока. Расширенные данные SRB не требуются для этой функции. Storport поддерживает этот тип сброса, но порт SCSI не поддерживает.
SRB_FUNCTION_RESET_BUS (0x12) Шина SCSI должна быть сброшена с помощью сообщения SCSIMESS_BUS_DEVICE_RESET. Минипорт-драйвер получает этот запрос только в том случае, если заданный запрос истек и последующий запрос, чтобы прервать время ожидания запроса, также истекло время ожидания. Расширенные данные SRB не требуются для этой функции.
SRB_FUNCTION_TERMINATE_IO (0x14) Сообщение SCSIMESS_TERMINATE_IO_PROCESS должно быть отправлено для отмены запроса, на который указывает член NextSrb . Если указанный запрос уже завершен, этот запрос должен быть выполнен нормально. Расширенные данные SRB не требуются для этой функции. ПРИМЕЧАНИЕ. Эта функция не отправляется в минипорт Storport.
SRB_FUNCTION_RELEASE_RECOVERY (0x11) Сообщение SCSIMESS_RELEASE_RECOVERY должно быть отправлено целевому контроллеру. Расширенные данные SRB не требуются для этой функции. ПРИМЕЧАНИЕ. Эта функция не отправляется в минипорт Storport.
SRB_FUNCTION_RECEIVE_EVENT (0x03) HBA должен быть подготовлен для получения асинхронного уведомления о событиях из целевого объекта. Элемент SRB DataBuffer указывает, где должны размещаться данные. ПРИМЕЧАНИЕ. Эта функция не отправляется в минипорт Storport.
SRB_FUNCTION_SHUTDOWN (0x07) Система завершает работу. Минипорт-драйвер может получать несколько этих уведомлений до того, как все системные действия на самом деле остановлены. Однако после последнего запуска ввода-вывода будет происходить последнее уведомление о завершении работы. Расширенные данные SRB не требуются для этой функции.
SRB_FUNCTION_FLUSH (0x08) Минипорт-драйвер должен очистить все кэшированные данные для целевого устройства. Этот запрос отправляется минипорту только в том случае, если параметр CachesData имеет значение TRUE в PORT_CONFIGURATION_INFORMATION для HBA. Расширенные данные SRB не требуются для этой функции.
SRB_FUNCTION_IO_CONTROL (0x02) Запрос — это запрос элемента управления ввода-вывода, который создается в пользовательском приложении с выделенным HBA. Объект SRB DataBuffer указывает на заголовок SRB_IO_CONTROL , за которым следует область данных. Значение в DataBuffer может использоваться драйвером независимо от значения MapBuffers. Допустимы только функции SRB, SrbFlags, TimeOutValue, DataBuffer и DataTransferLength, а также член SrbExtension, если драйвер мини-порта запрашивал расширения SRB при инициализации. Если драйвер минипорта управляет выделенным приложением HBA таким образом, чтобы он поддерживал этот запрос, минипорт-драйвер должен выполнить запрос и уведомить драйвер порта для конкретной операционной системы после завершения SRB, используя обычный механизм вызовов StorPortNotification с 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_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.
SRB_FUNCTION_QUIESCE_DEVICE (0x1A) Запрос выполняется только между классом хранилища и драйвером порта хранения и не отправляется в мини-порт. Эта функция служит в качестве ожидания драйвером класса для драйвера портов для завершения всех невыполненных операций ввода-вывода.
SRB_FUNCTION_PNP (0x25) Запрос — это расширенный запрос PnP, форматированный как структура SRBEX_DATA_PNP . Смещение для данных расширенного запроса находится в SrbExDataOffset[0].
SRB_FUNCTION_POWER (0x24) Запрос — это расширенный запрос, отформатированный как структура SRBEX_DATA_POWER . Смещение для данных расширенного запроса находится в SrbExDataOffset[0].
SRB_FUNCTION_WMI (0x17) Запрос — это расширенный запрос, отформатированный как структура SRBEX_DATA_WMI . Смещение для данных расширенного запроса находится в SrbExDataOffset[0].

SrbFlags

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

Flag Meaning
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.
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 Этот флаг не имеет значения для минипорт-драйверов. В драйвере класса это означает, что память для списка точечной или сборной была выделена из непагрегированного пула. Если этот флаг задан, драйвер класса должен вызвать ExFreePool , чтобы освободить память после завершения SRB.
SRB_FLAGS_BYPASS_LOCKED_QUEUE Этот флаг не имеет значения для минипорт-драйверов. Для драйвера порта этот флаг указывает, должен ли запрос обрабатываться, заблокирована ли очередь логического блока. Драйвер более высокого уровня должен задать этот флаг для отправки запроса SRB_FUNCTION_UNLOCK_QUEUE .
SRB_FLAGS_NO_KEEP_AWAKE Этот флаг не имеет значения для минипорт-драйверов. Драйвер класса Windows использует этот флаг, чтобы указать драйверу порта, чтобы завершить запрос, а не включить устройство для обработки этого запроса.
SRB_FLAGS_FREE_SENSE_BUFFER Указывает, что порт или драйвер мини-порта выделил буфер для данных смысле. Это сообщает драйверу класса, что он должен освободить буфер данных смысле после извлечения данных.
SRB_FLAGS_D3_PROCESSING Указывает, что запрос является частью обработки D3. Минипорты, поддерживающие управление питанием среды выполнения, не должны вызывать StorPortPoFxActivateComponent или StorPortPoFxIdleComponent с этими запросами
SRB_FLAGS_ADAPTER_CACHE_ENABLE Указывает, что адаптер может кэшировать данные.

ReservedUlong2

Зарезервировано. Установите значение 0.

RequestTag

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

RequestPriority

Назначение приоритета для SRB.

RequestAttribute

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

TimeOutValue

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

DUMMYUNIONNAME

Объединение, содержащее поля Windows 10 и более поздних версий.

DUMMYUNIONNAME.SystemStatus

Используется для хранения сведений о состоянии сбоя системы в условиях сбоя SrbStatus (например, SRB_STATUS_INTERNAL_ERROR).

DUMMYUNIONNAME.RequestTagHigh4Bytes

Используется для хранения больших четырех байтов уникального тега, если включена функция уникального тега.

SystemStatus

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

ZeroGuard1

Область защиты от драйверов, которые интерпретируют эту структуру как SCSI_REQUEST_BLOCK. Установите значение 0.

AddressOffset

Смещение адреса запроса на хранение с начала этой структуры. Это смещение находит STOR_ADDRESS структуру, содержащую адрес запроса.

NumSrbExData

Количество расширенных блоков данных SRB для этого запроса.

DataTransferLength

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

DataBuffer

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

ZeroGuard2

Область защиты от драйверов, которые интерпретируют эту структуру как SCSI_REQUEST_BLOCK. Установите значение 0.

OriginalRequest

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

ClassContext

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

PortContext

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

MiniportContext

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

NextSrb

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

_STORAGE_REQUEST_BLOCK

SrbExDataOffset[ANYSIZE_ARRAY]

Массив смещения, указывающий расположение расширенных блоков данных для SRB. Этот массив пуст, если NumSrbExData = 0.

Замечания

Начиная с Windows 8 расширенный тип SRB поддерживается с использованием структуры STORAGE_REQUEST_BLOCK . STORAGE_REQUEST_BLOCK расширяет функции SRB, что позволяет добавлять в запрос расширенные блоки данных для функции SRB. Поддержка запросов SRB с помощью структуры SCSI_REQUEST_BLOCK продолжится.

Если NumSrbExData> 0, смещения для расширенных блоков данных SRB находятся в массиве SrbExDataOffset . Каждое смещение относительно начала этой структуры и указывает на SRBEX_DATA структуру, содержащую расширенный блок данных.

Адрес целевого устройства для SRB находится в STOR_ADDRESS структуре , указанной Адресом AddressOffset.

Требования

Требование Ценность
Минимальный поддерживаемый клиент Windows 8
Header minitape.h (include Storport.h, Srb.h, Minitape.h)

См. также