Подпрограммы IoCompletion драйвера класса хранилища
Драйвер класса хранения должен иметь одну или несколько подпрограмм IoCompletion , если только драйвер синхронно не ожидает завершения каждого IRP, отправляемого драйверу порта, при необходимости повторяет запросы, а затем не освобождает память для SРБ в рамках подпрограммы dispatch или BuildRequest . Обратите внимание, что синхронная обработка каждого IRP приведет к снижению производительности драйвера класса. Кроме того, драйверы класса хранения для устройств, которые могут содержать файл системной страницы, должны обрабатывать все запросы на передачу асинхронно и, следовательно, должны иметь подпрограмму IoCompletion для запросов на чтение и запись.
Как описано в разделе Подпрограмма BuildRequest драйвера класса хранилища, драйверы класса хранилища отвечают за освобождение памяти, выделяемой для SDB, как обратно в список lookaside, так и в невыгребованный пул. Как и любой другой драйвер в режиме ядра более высокого уровня, он также отвечает за освобождение всех выделенных им irP, таких как IRP для разделения запроса на передачу, как описано в подпрограмме SplitTransferRequest драйвера класса хранилища.
Подпрограмма IoCompletion драйвера класса в конечном итоге отвечает за то, что задан блок состояния ввода-вывода, и за завершение исходного IRP. Обратите внимание, что завершение IRP может включать преобразование ошибки, возвращаемой членом SRB ScsiStatus или SenseInfoBuffer , в значение типа NTSTATUS и (или) ведение журнала ошибки, как описано в разделе Завершение irPs в подпрограммах диспетчеризации.
При возникновении определенных типов ошибок при обработке запроса драйвер порта хранилища замораживает внутреннюю очередь для целевой логической единицы (LU) и задает SRB_STATUS_QUEUE_FROZEN по завершении запроса. Следовательно, драйверы классов обычно имеют внутренние процедуры для изменения состояния очереди для запросов ввода-вывода устройств. Дополнительные сведения см. в разделе Подпрограмма releaseQueue драйвера класса хранилища.
Если подпрограмма BuildRequest драйвера запрашивает, чтобы драйвер порта возвращал сведения о смысле запроса для запроса, ее подпрограмма IoCompletion либо вызывает внутреннюю подпрограмму InterpretRequestSense , либо реализует те же встроенные функции. Дополнительные сведения см. в разделе Подпрограмма InterpretRequestSense драйвера класса хранилища.
Драйверы класса хранилища отвечают за повторные попытки запросов, которые завершаются сбоем из-за ошибок целевого контроллера, сброса шины или времени ожидания запроса. Когда драйвер порта возвращает конкретный запрос с заданным SrbStatus для указания такой ошибки, драйвер класса может вызвать подпрограмму RetryRequest из своей процедуры IoCompletion или, возможно, из подпрограммы InterpretRequestSense . Дополнительные сведения см. в разделе Подпрограмма RetryRequest драйвера класса хранилища.
Общие сведения о процедурах IoCompletion см. в разделе Завершение irP.