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


Функция DispatchReadWrite в драйверах Higher-Level

За исключением драйверов файловой системы, драйвер более высокого уровня обычно не имеет внутренних очередей драйверов для IRPs. Такая подпрограмма DispatchReadWrite драйвера может передавать IRPs с допустимыми параметрами в более низкие драйверы, возможно, после настройки подпрограммы IoCompletion, как описано в разделе «Передача IRPs вниз стека драйверов».

Однако процедура DispatchReadWrite драйвера класса SCSI отвечает за разделение крупных запросов на передачу, если это необходимо, прежде чем отправить IRP с основным кодом функции IRP_MJ_READ или IRP_MJ_WRITE к паре драйверов порта/минипорта SCSI. Дополнительные сведения см. в разделе "Подпрограмма splitTransferRequest" драйвера класса хранилища.

Если драйвер более высокого уровня выделяет одну или несколько IRP и настраивает их для драйвера более низкого уровня в своей подпрограмме DispatchReadWrite с целью запроса количества частичных передач, подпрограмма DispatchReadWrite должна вызывать IoSetCompletionRoutine с каждой IRP, выделенной драйвером. Драйвер должен зарегистрировать свою подпрограмму IoCompletion , чтобы отслеживать, сколько данных передается в каждой операции частичной передачи, чтобы подпрограмма IoCompletion может освободить все выделенные драйвером IRPs и, в конечном итоге, завершить исходный запрос.

Если базовый драйвер управляет устройством с съемными носителями, все IRP, выделенные драйвером более высокого уровня, должны иметь контекст потока. Чтобы установить контекст потока, драйвер, выделяющий ресурсы, должен задать значение Irp-Tail.Overlay>.Thread в каждом новом IRP, полученное из значения поступающего IRP. Дополнительные сведения см. в поддержке съемных носителей.

Если базовый драйвер устройства возвращает IRP для частичной передачи с ошибкой, подпрограмма IoCompletion может повторить запрос частичной передачи или завершить обработку исходного IRP, установив блок состояния ввода-вывода с возвращенной ошибкой, после освобождения любых IRP и памяти, выделенных драйвером более высокого уровня.

Если подпрограмма DispatchReadWrite драйвера более высокого уровня выделяет память для операций частичной передачи, а ее выделение будет осуществляться подпрограммой IoCompletion драйвера (или базовым драйвером устройства), подпрограмма DispatchReadWrite должна выделить память из непагрегированного пула.