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