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

UptoLike

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

46
Самый простой выходиспользовать асинхронный IRP, и инициировать
событие в функции завершения.
В таблице 3.1 показаны типы синхронных IRP.
Таблица 3.1 – типы синхронных IRP
Функция Типы создаваемых IRP
IoBuildSynchronousFsdRequest IRP_MJ_READ
IRP_MJ_WRITE
IRP_MJ_FLUSH_BUFFERS
IRP_MJ_SHUTDOWN
IRP_MJ_PNP
IRP_MJ_POWER
IoBuildDeviceControlRequest IRP_MJ_DEVICE_CONTROL
IRP_MJ_INTERNAL_DEVICE_CONTROL
3.5 Создание асинхронных IRP
Для создания асинхронных IRP используются две другие функции:
Функция Типы создаваемых IRP
IoBuildAsynchronousFsdRequest IRP_MJ_READ
IRP_MJ_WRITE
IRP_MJ_FLUSH_BUFFERS
IRP_MJ_SHUTDOWN
IRP_MJ_PNP
IRP_MJ_POWER
(только для IRP_MJ_POWER_SEQUENCE)
IoAllocateIrp
Любые (при этом необходимо
инициализировать поле MajorFunction в
первом элементе стека)
Асинхронные IRP не принадлежат породившему их потоку. Диспетчер
ввода-вывода не планирует ACP и не выполняет их деинициализацию при
завершении IRP. Особенности асинхронных IRP:
при завершении потока диспетчер ввода-вывода не пытается отменить
все асинхронные IRP, созданные в этом потоке,
      − Самый простой выход – использовать асинхронный IRP, и инициировать
          событие в функции завершения.
      В таблице 3.1 показаны типы синхронных IRP.

                       Таблица 3.1 – типы синхронных IRP
Функция                         Типы создаваемых IRP
IoBuildSynchronousFsdRequest    IRP_MJ_READ
                                IRP_MJ_WRITE
                                IRP_MJ_FLUSH_BUFFERS
                                IRP_MJ_SHUTDOWN
                                IRP_MJ_PNP
                                IRP_MJ_POWER
IoBuildDeviceControlRequest     IRP_MJ_DEVICE_CONTROL
                                IRP_MJ_INTERNAL_DEVICE_CONTROL


      3.5 Создание асинхронных IRP
      Для создания асинхронных IRP используются две другие функции:
Функция                         Типы создаваемых IRP
IoBuildAsynchronousFsdRequest   IRP_MJ_READ
                                IRP_MJ_WRITE
                                IRP_MJ_FLUSH_BUFFERS
                                IRP_MJ_SHUTDOWN
                                IRP_MJ_PNP
                                IRP_MJ_POWER
                                (только для IRP_MJ_POWER_SEQUENCE)
IoAllocateIrp                   Любые        (при      этом        необходимо
                                инициализировать    поле      MajorFunction   в
                                первом элементе стека)
      Асинхронные IRP не принадлежат породившему их потоку. Диспетчер
ввода-вывода не планирует ACP и не выполняет их деинициализацию при
завершении IRP. Особенности асинхронных IRP:
      − при завершении потока диспетчер ввода-вывода не пытается отменить
          все асинхронные IRP, созданные в этом потоке,


                                        46