Поделиться через


Создание объектов запросов платформы

Объекты запросов Framework представляют собой запросы на операции ввода-вывода, которые менеджер ввода-вывода отправил к драйверу. Драйверы на основе платформы обрабатывают каждый запрос ввода-вывода путем вызова методов объекта запроса платформы.

Каждый запрос ввода-вывода содержит пакет запросов ввода-вывода WDM (структура IRP), но драйверы на основе платформы обычно не нуждаются в доступе к структуре IRP .

Большинство объектов запросов платформы создаются платформой, но драйвер также может создавать объекты запросов.

Запрос объектов, созданных платформой

Когда драйвер на основе платформы получает пакет запроса ввода-вывода (IRP) из диспетчера операций ввода-вывода, платформа перехватывает IRP и создает объект запроса платформы. Платформа помещает объект запроса в очередь ввода-вывода и, если драйвер зарегистрировал обработчики запросов для очереди, вызывает соответствующий обработчик.

На следующей схеме показаны шаги, возникающие при создании платформы объекта запроса для операции чтения.

Схема, демонстрирующая шаги по созданию объекта запроса для операции чтения в драйвере на основе платформы.

Следующие шаги соответствуют числам на предыдущей схеме:

  1. Приложение в пользовательском режиме считывает файл, вызвав функцию Microsoft Win32 ReadFile .

  2. Функция ReadFile вызывает диспетчер ввода-вывода, который выполняется в режиме ядра.

  3. Диспетчер ввода-вывода выделяет структуру IRP и сохраняет код функции IRP_MJ_READ в структуре.

  4. Диспетчер ввода-вывода вызывает стандартную подпрограмму драйвера DispatchRead для драйвера x, передав указатель на структуру IRP. Поскольку драйвер x является драйвером, основанным на фреймворке, фреймворк предоставляет подпрограмму DispatchRead драйвера.

  5. Платформа создает объект запроса, представляющий структуру IRP. Платформа добавляет объект запроса к одному из объектов очереди драйвера.

  6. Платформа вызывает обработчик запроса EvtIoRead драйвера, передав дескриптор объекта очереди и дескриптор объекта запроса.

Запрос объектов, созданных драйвером

Драйверы на основе платформы также могут создавать объекты запросов. Например, драйвер может создавать объекты запроса, если он получает запрос на чтение или запись для объема данных, который превышает способность целевых объектов ввода-вывода драйвера обрабатывать их одновременно. В такой ситуации драйвер может разделить данные на несколько небольших запросов и использовать дополнительные объекты запросов для отправки этих небольших запросов одному или нескольким целевым объектам ввода-вывода.

Чтобы создать объект запроса, драйвер должен вызвать WdfRequestCreate , за которыми следует методы объекта платформы, которые инициализируют запрос, например WdfUsbTargetPipeFormatRequestForRead.

Если драйвер получает IRP в подпрограмме отправки WDM и затем обрабатывает или перенаправляет их, используя фреймворк, драйвер может вызвать WdfRequestCreateFromIrp.