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


DispatchReadWrite в драйверах Higher-Level

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

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

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

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

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

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