DispatchReadWrite Using Direct I/O
Любой драйвер устройства более низкого уровня, который настраивает свои объекты устройства для прямого ввода-вывода, удовлетворяет запросу на чтение, возвращая данные, передаваемые с устройства в системную физическую память, как описано в MDL в Irp-MdlAddress>. Он удовлетворяет запросу на запись путем передачи данных из физической памяти системы на устройство.
Низкоуровневые драйверы должны асинхронно обрабатывать запросы на чтение и запись. Поэтому подпрограмма DispatchReadWrite каждого драйвера нижнего уровня должна передавать IRP_MJ_READ и IRP_MJ_WRITE IRP с допустимыми параметрами в другие подпрограммы драйвера, как описано в разделе Передача IRP в стек драйверов.
Для операций irP чтения и записи, отправляемых драйверам более низкого уровня, выгружаемая физическая память, описанная MDL в Irp-MdlAddress>, уже была проверена на наличие правильных прав доступа для выполнения запрошенной передачи и уже заблокирована драйвером самого высокого уровня в цепочке или диспетчером операций ввода-вывода. Любой драйвер промежуточного или самого низкого уровня, который настраивает объекты устройства для прямого ввода-вывода, не должен вызывать MmProbeAndLockPages , так как это уже сделано. Драйвер самого низкого уровня вызывает MmGetSystemAddressForMdlSafe. (Драйверы для Windows 98 вместо этого вызывают MmGetSystemAddressForMdl . Драйверы для Windows Me, Windows 2000 и более поздних версий Windows должны использовать MmGetSystemAddressForMdlSafe.)
Любая подпрограмма DispatchReadWrite драйвера устройства промежуточного или нижнего уровня должна проверять параметры в расположении стека операций ввода-вывода для операций чтения и записи, если драйвер более высокого уровня не может передавать только IRP с допустимыми параметрами. Если подпрограмма DispatchReadWrite обнаруживает ошибку параметра, она должна завершить IRP с соответствующей ошибкой STATUS_XXX, как уже описано в разделе Завершение IRP. Если параметры допустимы, подпрограмма DispatchReadWrite промежуточного драйвера должна передать запрос для дальнейшей обработки в соответствии с рекомендациями в DispatchReadWrite в Higher-Level Drivers.
Подпрограмма DispatchReadWrite драйвера устройства низкого уровня должна вызывать IoMarkIrpPending с запросом на передачу, передавать IRP для дальнейшей обработки другими подпрограммами драйвера и возвращать STATUS_PENDING, как описано в разделе Передача IRP в стеке драйверов.
Обратите внимание, что подпрограмма DispatchReadWrite драйвера устройства может управлять порядком, в котором поставщики irp помещаются в очередь на устройство для ускорения пропускной способности ввода-вывода, вызывая IoStartPacket со значением ключа , определяемым драйвером. Другая подпрограмма в драйвере позже выводит IRP из очереди, определяет, следует ли разделить запрошенную длину на операции частичной передачи, и программирует устройство для передачи данных.
Как правило, драйвер устройства, который должен разделить большие запросы на передачу в соответствии с ограничениями своего устройства, должен отложить эти операции до тех пор, пока не будет настроено устройство для данного запроса на передачу. Подпрограмма DispatchReadWrite такого драйвера устройства не должна проверка расположение стека ввода-вывода входящих irp для каких-либо ограничений передачи, относящихся к устройству, и не пытаться вычислить диапазоны частичной передачи, когда драйвер может отложить эти проверки до тех пор, пока непосредственно перед запуском (или другой подпрограммой драйвера) не запрограммирует устройство для операции передачи.