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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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