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


DispatchReadWrite Using Buffered I/O

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

Следовательно, подпрограмма DispatchReadWrite такого драйвера устройства обычно выполняет следующие действия при получении запроса на передачу:

  1. Вызывает IoGetCurrentIrpStackLocation и определяет направление запроса на передачу.

  2. Проверяет допустимость параметров для запроса.

    • Для запроса на чтение подпрограмма обычно проверяет значение Драйвера IoStackLocation-Parameters.Read.Length>, чтобы определить, достаточно ли большой буфер для получения данных, передаваемых с устройства.

      Например, драйвер класса системной клавиатуры обрабатывает запросы на чтение, поступающие только из потока ввода пользователя Win32. Этот драйвер определяет структуру, KEYBOARD_INPUT_DATA, в которой хранятся нажатия клавиш с устройства, и в любой момент удерживает некоторое количество этих структур во внутреннем кольцевом буфере для удовлетворения запросов на чтение по мере их прихода.

    • Для запроса на запись подпрограмма обычно проверяет значение в Parameters.Write.Length и данные в Irp-AssociatedIrp.SystemBuffer> на допустимость при необходимости: то есть, если устройство принимает только пакеты структурированных данных, содержащие члены с определенными диапазонами значений.

  3. Если какие-либо параметры недопустимы, подпрограмма DispatchReadWrite немедленно завершает IRP, как уже описано в разделе Завершение IRP. В противном случае подпрограмма передает IRP для дальнейшей обработки другими подпрограммами драйвера, как описано в разделе Передача IRP в стек драйверов.

Драйверы устройств нижнего уровня, использующие буферизированные операции ввода-вывода, обычно должны удовлетворять запросу на передачу путем чтения или записи данных размера, указанного инициатором запроса. Такой драйвер, скорее всего, определит структуру данных, поступающих с устройства или отправляемых на нее, и, скорее всего, будет буферировать структурированные данные внутри системы, как это делает драйвер класса системной клавиатуры.

Драйверы, буферизующие данные внутри системы, должны поддерживать запросы IRP_MJ_FLUSH_BUFFERS , а также могут поддерживать запросы IRP_MJ_SHUTDOWN .

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