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


IRP_MJ_READ

Каждый драйвер устройства, который передает данные со своего устройства в систему, должен обрабатывать запросы на чтение в подпрограмме DispatchRead или DispatchReadWrite , как и любой драйвер более высокого уровня, наложенный на такой драйвер устройства.

При отправке

В любой момент после успешного выполнения запроса на создание.

Возможно, приложение пользовательского режима или компонент Win32 с дескриптором для объекта file, представляющего целевой объект устройства, запросил передачу данных с устройства. Возможно, драйвер более высокого уровня создал и настроил IRP чтения.

Входные параметры

Расположение стека ввода-вывода драйвера в IRP указывает, сколько байтов необходимо передать в Parameters.Read.Length.

Некоторые драйверы используют значение Parameters.Read.Key для сортировки входящих запросов на чтение в определенном драйвером порядке в очереди устройств или во внутренней очереди IRP, управляемой драйвером.

Некоторые типы драйверов также используют значение Parameters.Read.ByteOffset, которое указывает начальное смещение для операции передачи. Например, см. раздел IRP_MJ_READ документации по устанавливаемой файловой системе (IFS).

Выходные параметры

В зависимости от того, настраивает ли базовый драйвер устройства флаги целевого объекта устройства с DO_BUFFERED_IO или с DO_DIRECT_IO, данные передаются в одно из следующих объектов:

  • Буфер в Irp-AssociatedIrp.SystemBuffer, если драйвер использует буферизованные операции ввода-вывода>.

  • Буфер, описываемый MDL в Irp-MdlAddress, если базовый драйвер устройства использует прямой ввод-вывод> (DMA или PIO).

Операция

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

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

Требования

Заголовок

Wdm.h (включая Wdm.h, Ntddk.h или Ntifs.h)

См. также раздел

DispatchRead

DispatchReadWrite

IoCallDriver

IoSetCompletionRoutine