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


Диспетчеризация чтения и записи с использованием прямого ввода-вывода

Любой драйвер устройства нижнего уровня, который настраивает объекты устройства для прямого ввода-вывода, удовлетворяет запросу на чтение, возвращая данные, передаваемые с устройства в системную физическую память, которая описывается MDL в Irp-MdlAddress>. Он удовлетворяет запросу на запись путем передачи данных из системной физической памяти на устройство.

Драйверы нижнего уровня должны асинхронно обрабатывать запросы на чтение и запись. Таким образом, каждая подпрограмма DispatchReadWrite драйвера нижнего уровня должна передавать IRP_MJ_READ и IRP_MJ_WRITE IRP с допустимыми параметрами другим подпрограммам драйверов, как описано в разделе "Передача IRPs вниз стека драйверов".

Для операций чтения и записи irPs, отправленных драйверам нижнего уровня, страницы физической памяти, описанной MDL в Irp-MdlAddress, уже были проверены на наличие правильных прав доступа для выполнения запрошенной передачи и уже заблокированы драйвером верхнего уровня в цепочке или диспетчером ввода-вывода>. Любой промежуточный или самый низкий уровень драйвера, который настраивает объекты устройства для прямого ввода-вывода, не должен вызывать MmProbeAndLockPages , так как это уже сделано. Драйвер на самом низком уровне вызывает MmGetSystemAddressForMdlSafe. (Вместо этого драйверы для Windows 98 вызывают MmGetSystemAddressForMdl . Драйверы для Windows Me, Windows 2000 и более поздних версий Windows должны использовать MmGetSystemAddressForMdlSafe.)

Любая подпрограмма DispatchReadWrite драйвера устройств среднего или низкого уровня должна проверять параметры в стеке операционных элементов IRP для операций чтения и записи, если она не может доверять драйверу более высокого уровня, который передает только IRP с допустимыми параметрами. Если подпрограмма DispatchReadWrite находит ошибку параметра, она должна завершить IRP с соответствующим значением STATUS_XXX, как описано в документации Completing IRPs. Если параметры допустимы, подпрограмма DispatchReadWrite промежуточного драйвера должна передать запрос на дальнейшую обработку в соответствии с рекомендациями в DispatchReadWrite в Higher-Level Driver.

Подпрограмма dispatchReadWrite драйвера устройства низкого уровня должна вызывать IoMarkIrpPending с запросом на передачу, передавать IRP для дальнейшей обработки другими подпрограммами драйверов и возвращать STATUS_PENDING, как описано в разделе "Передача irPs вниз по стеку драйверов".

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

Как правило, драйвер устройства, который должен разделить большие запросы на передачу, чтобы соответствовать ограничениям устройства, следует отложить эти операции до тех пор, пока не будет настроено устройство для данного запроса на передачу. Такая подпрограмма драйвера устройства DispatchReadWrite не должна проверять структуру стека ввода-вывода входящих IRP на наличие ограничений передачи, специфичных для устройства, и пытаться вычислить диапазоны частичной передачи, когда драйвер может отложить эти проверки до тех пор, пока его StartIo (или другая подпрограмма драйвера) программирует устройство для операции передачи.