Подпрограмма BuildRequest драйвера класса хранения
Как и все драйверы в режиме ядра более высокого уровня, драйвер класса хранения должен настроить расположение стека ввода-вывода IRP для следующего ниже драйвера при обработке запросов к периферийным устройствам хранилища. В irP, которые драйвер класса настраивает с помощью SSP для предоставленного системой драйвера порта, расположение стека ввода-вывода драйвера порта задается следующим образом:
MajorFunction содержит IRP_MJ_SCSI
Parameters.Scsi.Srb содержит указатель на SRB
Каждый драйвер класса отвечает за выделение памяти для srb, а также за настройку их с помощью CDB для базового драйвера порта хранилища. Драйвер класса может либо настроить список lookaside для своих SRB-файлов с помощью ExInitializeNPageLookasideList , либо вызвать ExAllocatePool для непагрегированных памяти. Дополнительные сведения об использовании списков lookaside и непагированных пулов см. в разделе Использование списков lookaside .
Независимо от того, выделяет ли он память из пула или из созданного драйверами списка внешних интерфейсов, каждый драйвер класса хранения отвечает за освобождение памяти, выделяемой для SSPB. Процедуры IoCompletion драйверов хранилища, описанные в разделе Процедуры IoCompletion драйвера класса хранения, обычно освобождают память, выделенную для SRB, обратно в список lookaside.
Подпрограмма BuildRequest драйвера класса должна задавать соответствующие значения в элементах SRB, включая длину CDB, настроенную для взаимодействия с устройством. Для запросов, возвращающих сведения о смысле запроса и (или) которые драйверу может потребоваться повторить, он задает подпрограмму IoCompletion в IRP. Для запросов на чтение или запись он определяет SrbFlags с соответствующим направлением передачи, SRB_FLAGS_DATA_IN или SRB_FLAGS_DATA_OUT соответственно.
Подпрограмма BuildRequest может совместно отвечать за настройку SRB с парой процедур SendSrbSynchronous и SendSrbAsynchronous . То есть подпрограмма BuildRequest может настроить элементы SRB, которые обычно настраиваются для всех запросов, в то время как подпрограммы SendSrbXxx устанавливают значения SRB, относящиеся только к каждому типу запроса. Когда IRP передается драйверу порта из подпрограммы SendSrbAsynchronous , IRP необходимо настроить с помощью процедуры IoCompletion , предоставляемой драйвером.
После загрузки драйвера класса он настраивает большинство srb с элементом функции , для которого задано значение SRB_FUNCTION_EXECUTE_SCSI, указывая запрос ввода-вывода устройства для отправки через шину.
Дополнительные сведения о системных элементах SRB и их значениях см. в разделе SCSI_REQUEST_BLOCK.
Настройка srb для распознавания запросов
Драйвер класса может запросить, чтобы драйвер порта возвращал значение запроса SCSI или эквивалентные сведения, когда целевой контроллер возвращает условие проверка. Для этого драйвер класса настраивает указатель SenseInfoBuffer и SenseInfoBufferLength в SRB, чтобы драйвер порта может возвращать сведения о чувстве запроса при возникновении условия проверка. Драйвер порта указывает, что он вернул сведения о смысле запроса, задав членУ SrbStatus SRB_STATUS_AUTOSENSE_VALID при возвращении IRP. Дополнительные сведения о подпрограммах InterpretSenseInfo см. в разделе Подпрограмма InterpretRequestSense драйвера класса хранилища.
Повторных попыток
Драйверы класса хранилища отвечают за повторные запросы, которые завершаются сбоем из-за ошибок целевого объекта или контроллера, сброса шины или времени ожидания запроса. Следовательно, многие драйверы класса поддерживают число повторных попыток в собственном расположении стека ввода-вывода IRP. Подпрограмма BuildRequest такого драйвера класса также может инициализировать ограничение повторных попыток для заданного запроса, прежде чем он настроит свою подпрограмму IoCompletion и отправит IRP драйверу порта. Дополнительные сведения о подпрограммах RetryRequest см. в статье Процедура RetryRequest драйвера класса хранилища.