структура 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;
  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;

Члены

Length

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

Function

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

SrbStatus

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

Значение Значение
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 Указывает, что команда с чувством запроса завершилась сбоем. Возвращается только в том случае, если адаптер шины узла (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

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

Значение Значение
SRB_FUNCTION_EXECUTE_SCSI (0x00) Запрос ввода-вывода устройства SCSI должен выполняться в целевой логической единице. При использовании NumSrbExData> 0 одна или несколько следующих расширенных структур блоков запросов находятся в смещениях, указанных в SrbExDataOffset: SRBEX_DATA_SCSI_CDB16, SRBEX_DATA_SCSI_CDB32, SRBEX_DATA_SCSI_CDB_VAR, SRBEX_DATA_BIDIRECTIONALSRBEX_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) Адаптер безопасности должен быть подготовлен к получению асинхронного уведомления о событии от целевого объекта. Элемент SRB DataBuffer указывает место размещения данных. ПРИМЕЧАНИЕ. Эта функция не отправляется в мини-порт от Storport.
SRB_FUNCTION_SHUTDOWN (0x07) Система завершает работу. Драйвер мини-порта может получить несколько из этих уведомлений, прежде чем все действия системы фактически остановятся. Однако последнее уведомление о завершении работы будет появляться после последнего запуска ввода-вывода. Расширенные данные SRB не требуются для этой функции.
SRB_FUNCTION_FLUSH (0x08) Драйвер мини-порта должен очистить все кэшированные данные для целевого устройства. Этот запрос отправляется драйверу мини-порта только в том случае, если для параметра CachesData задано значение TRUE в PORT_CONFIGURATION_INFORMATION для адаптера шины. Расширенные данные SRB не требуются для этой функции.
SRB_FUNCTION_IO_CONTROL (0x02) Запрос — это запрос элемента управления вводом-выводом, который создается в приложении пользовательского режима с выделенным адаптером HBA. DataBuffer SRB указывает на заголовок 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 . Если очередь заблокирована, будут обрабатываться только запросы с SrbFlags ORed с SRB_FLAGS_BYPASS_LOCKED_QUEUE . Драйверы SCSI miniport не обрабатывают запросы SRB_FUNCTION_LOCK_QUEUE .
SRB_FUNCTION_UNLOCK_QUEUE (0x19) Освобождает очередь драйвера порта для логической единицы, которая ранее была заблокирована SRB_FUNCTION_LOCK_QUEUE. SrbFlags запроса на разблокировку должны быть помечены SRB_FLAGS_BYPASS_LOCKED_QUEUE. Допустимы только элементы SRB Length, Function, SrbFlags и OriginalRequest . Драйверы SCSI miniport не обрабатывают запросы 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) Запрос — это расширенный запрос power, отформатированный в виде SRBEX_DATA_POWER структуры. Смещение данных расширенного запроса находится в SrbExDataOffset[0].
SRB_FUNCTION_WMI (0x17) Запрос — это расширенный запрос power, отформатированный в виде SRBEX_DATA_WMI структуры. Смещение данных расширенного запроса находится в SrbExDataOffset[0].

SrbFlags

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

Flag Значение
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 должен пересмотреть асинхронный ввод-вывод перед выполнением передачи.
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 Этот флаг не имеет отношения к драйверам miniport и устарел для новых драйверов класса 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 поддерживает внутреннюю очередь запросов к логическим единицам , а драйвер miniport устанавливает для параметра TaggedQueueing значение TRUE в PORT_CONFIGURATION_INFORMATION для этого адаптера.

RequestPriority

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

RequestAttribute

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

TimeOutValue

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

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 для адаптера шины. Однако в случае SRB_FUNCTION_IO_CONTROL запросов драйверы минипорта могут использовать это значение в качестве указателя данных независимо от значения MapBuffers.

ZeroGuard2

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

OriginalRequest

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

ClassContext

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

PortContext

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

MiniportContext

Указывает на расширение Srb. Драйвер мини-порта не должен использовать этот элемент, если в HW_INITIALIZATION_DATA для SrbExtensionSize задано значение 0. Память в 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
Верхняя часть minitape.h (включая Storport.h, Srb.h, Minitape.h)

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

SCSI_REQUEST_BLOCK