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


структура SCSI_REQUEST_BLOCK (minitape.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_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 для HBA. Однако в случае 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 задано нулевое значение. Память в SrbExtension не инициализируется драйвером порта, зависящим от ОПЕРАЦИОННОй системы, и к данным, определяемым драйвером мини-порта, можно получить непосредственно с помощью адаптера HBA. Соответствующий физический адрес можно получить, вызвав ScsiPortGetPhysicalAddress с указателем SrbExtension .

InternalStatus

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

QueueSortKey

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

LinkTimeoutValue

Указывает значение времени ожидания связи.

Reserved

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

Cdb[16]

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

Комментарии

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

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

Требования

Требование Значение
Заголовок minitape.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