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

UptoLike

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

61
приостановленной очереди до тех пор, пока кто-нибудь не отменит приостановку
очереди, и диспетчер не сможет возобновить отправку IRP функции StartIo.
3.17 Объект DEVQUEUE
Для решения проблем, связанных с очередями, в [3] предложен пакет
функций управления объектом очереди, который автор назвал DEVQUEUE и
включил его в структуру DEVICE_EXTENSION.
typedef struct _DEVICE_EXTENSION {
DEVQUEUE dqReadWrite;
} DEVICE_EXTENSION, *DEVICE_EXTENSION;
На
рисунке 3.7 показана типичная обработка IRP драйвером,
использующим объекты DEVICE_EXTENSION [3].
Рисунок 3.7 – Логика обработки IRP с участием объекта DEVQUEUE и функции
StartIo
Каждый объект DEVQUEUE обладает собственной функцией StartIo,
которая указывается при инициализации объекта в AddDevice.
NTSTATUS AddDevice(…)
{
PDEVICE_EXTENSION pdx = …;
InitializeQueue(&pdx->dqReadWrite, StartIo);
приостановленной очереди до тех пор, пока кто-нибудь не отменит приостановку
очереди, и диспетчер не сможет возобновить отправку IRP функции StartIo.


     3.17 Объект DEVQUEUE
     Для решения проблем, связанных с очередями, в [3] предложен пакет
функций управления объектом очереди, который автор назвал DEVQUEUE и
включил его в структуру DEVICE_EXTENSION.
     typedef struct           _DEVICE_EXTENSION {
          …
          DEVQUEUE dqReadWrite;
          …
          } DEVICE_EXTENSION, *DEVICE_EXTENSION;
     На       рисунке   3.7   показана   типичная   обработка   IRP   драйвером,
использующим объекты DEVICE_EXTENSION [3].




Рисунок 3.7 – Логика обработки IRP с участием объекта DEVQUEUE и функции
                                   StartIo
     Каждый объект DEVQUEUE обладает собственной функцией StartIo,
которая указывается при инициализации объекта в AddDevice.
     NTSTATUS AddDevice(…)
          {
          …
          PDEVICE_EXTENSION pdx = …;
          InitializeQueue(&pdx->dqReadWrite, StartIo);

                                         61