Организация ввода-вывода. Драйверы WDM. Рощин А.В. - 40 стр.

UptoLike

Составители: 

40
Поле AssociatedIrp объединяет три возможных указателя. Указатель для
стандартного WDM-драйвера называется AssociatedIrp.SystemBuffer. Он
содержит адрес системного буфера в неперемещаемой памяти режима ядра.
Диспетчер ввода-вывода создает этот буфер для запросов чтения и записи
(IRP_MJ_READ и IRP_MJ_WRITE), если флаги объекта верхнего устройства
указывают режим DO_DIRECT_IO.
Для запроса IRP_MJ_DEVICE_CONTROL диспетчер
ввода-вывода создает
это буфер при наличии в управляющем коде флагов METOD_IN_DIRECT или
METOD_OUT_DIRECT.
Диспетчер ввода-вывода копирует в этот буфер данные, отправленные
драйверу кодом пользовательского режима при создании IRP. Это происходит
при запросах записи и управления устройством (IRP_MJ_DEVICE_CONTROL).
При запросах чтения этот буфер заполняется драйвером устройства.
Позднее диспетчер ввода-вывода
копирует эти данные в буфер пользовательского
режима.
Поле IoStatus (IO_STATUS_BLOCK) содержит структуру с двумя полями,
которые заполняет драйвер при завершении обработки запроса ввода-вывода.
Поле IoStatus.Status содержит код NTSTATUS, а поле IoStatusInformation
дополнительные данные, зависящие от типа IRP и статуса завершения. Для
запросов чтения при удачном его завершении в этом
поле может указываться
общее количество переданных байтов. Некоторые запросы PnP передают в этом
поле указатель на структуру, которая и является ответом на запрос.
Поле RequestorMode содержит одну из констант перечеслимого типа
{UserMode или KernelMode}. Значение зависит от источника запроса.
Поле PendingReturned (BOOLEAN) показывает, вернула ли диспетчерская
функция нижнего уровня код STATUS_PENDING
.
Поле Cancel (BOOLEAN) имеет значение TRUE, если для отмены запроса
была вызвана функция IOCancelIrp, или FALSE в противном случае.
     Поле AssociatedIrp объединяет три возможных указателя. Указатель для
стандартного   WDM-драйвера      называется    AssociatedIrp.SystemBuffer.   Он
содержит адрес системного буфера в неперемещаемой памяти режима ядра.
     Диспетчер ввода-вывода создает этот буфер для запросов чтения и записи
(IRP_MJ_READ и IRP_MJ_WRITE), если флаги объекта верхнего устройства
указывают режим DO_DIRECT_IO.
     Для запроса IRP_MJ_DEVICE_CONTROL диспетчер ввода-вывода создает
это буфер при наличии в управляющем коде флагов METOD_IN_DIRECT или
METOD_OUT_DIRECT.
     Диспетчер ввода-вывода копирует в этот буфер данные, отправленные
драйверу кодом пользовательского режима при создании IRP. Это происходит
при запросах записи и управления устройством (IRP_MJ_DEVICE_CONTROL).
     При запросах чтения этот буфер заполняется драйвером устройства.
Позднее диспетчер ввода-вывода копирует эти данные в буфер пользовательского
режима.
     Поле IoStatus (IO_STATUS_BLOCK) содержит структуру с двумя полями,
которые заполняет драйвер при завершении обработки запроса ввода-вывода.
     Поле IoStatus.Status содержит код NTSTATUS, а поле IoStatusInformation
дополнительные данные, зависящие от         типа IRP и статуса завершения. Для
запросов чтения при удачном его завершении в этом поле может указываться
общее количество переданных байтов. Некоторые запросы PnP передают в этом
поле указатель на структуру, которая и является ответом на запрос.
     Поле RequestorMode содержит одну из констант перечеслимого типа
{UserMode или KernelMode}. Значение зависит от источника запроса.
     Поле PendingReturned (BOOLEAN) показывает, вернула ли диспетчерская
функция нижнего уровня код STATUS_PENDING.
     Поле Cancel (BOOLEAN) имеет значение TRUE, если для отмены запроса
была вызвана функция IOCancelIrp, или FALSE в противном случае.




                                       40