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

UptoLike

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

39
3 Пакеты запросов ввода-вывода IRP
При обработке запросов ввода-вывода наиболее важными являются две
структуры данных. Сам пакет и стек ввода-вывода.
3.1 Структура IRP
Структура данных IRP показана на рисунке 3.1. Как и ранее закрытые поля
отмечены серым фоном.
Type Size
MdlAddress
Flags
AssociatedIrp
ThreadListEntry
IoStatus
RequestorMode PendingReturned StackCount CurrentLocation
Cancel CancelIrql ApcEnvironment AllocftionFlags
UserIosb
UserEvent
Overlay
CancelRoutine
UserBuffer
Tail
Рисунок 3.1 – Структура данных IRP
Поле MdlAddress (PMDL) содержит адрес таблицы дескрипторов памяти
(Memory Descriptor List). В этой таблице описан буфер пользовательского режима,
связанный с данным запросом. MDL создается диспетчером ввода-вывода.
Для запросов чтения и записи (IRP_MJ_READ и IRP_MJ_WRITE), если
флаги объекта верхнего устройства указывают режим DO_DIRECT_IO.
Для запроса IRP_MJ_DEVICE_CONTROL MDL создается при наличии в
управляющем коде флагов METOD_IN_DIRECT или METOD_OUT_DIRECT.
Таблица описывает виртуальный буфер пользовательского режима и
содержит физические адреса заблокированных страниц с этим буфером.
Поле Flags (ULONG) содержит флаги, которые драйвер устройства может
читать, но не может изменять.
     3 Пакеты запросов ввода-вывода IRP
     При обработке запросов ввода-вывода наиболее важными являются две
структуры данных. Сам пакет и стек ввода-вывода.
     3.1 Структура IRP
     Структура данных IRP показана на рисунке 3.1. Как и ранее закрытые поля
отмечены серым фоном.
                  Type                                    Size
                                MdlAddress
                                     Flags
                               AssociatedIrp
                             ThreadListEntry
                                   IoStatus
     RequestorMode   PendingReturned       StackCount       CurrentLocation
        Cancel          CancelIrql       ApcEnvironment     AllocftionFlags
                                  UserIosb
                                 UserEvent
                                   Overlay
                              CancelRoutine
                                 UserBuffer

                                    Tail


                     Рисунок 3.1 – Структура данных IRP
     Поле MdlAddress (PMDL) содержит адрес таблицы дескрипторов памяти
(Memory Descriptor List). В этой таблице описан буфер пользовательского режима,
связанный с данным запросом. MDL создается диспетчером ввода-вывода.
     Для запросов чтения и записи (IRP_MJ_READ и IRP_MJ_WRITE), если
флаги объекта верхнего устройства указывают режим DO_DIRECT_IO.
     Для запроса IRP_MJ_DEVICE_CONTROL MDL создается при наличии в
управляющем коде флагов METOD_IN_DIRECT или METOD_OUT_DIRECT.
     Таблица описывает виртуальный буфер пользовательского режима и
содержит физические адреса заблокированных страниц с этим буфером.
     Поле Flags (ULONG) содержит флаги, которые драйвер устройства может
читать, но не может изменять.



                                       39