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) |