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


Асинхронная отправка запросов ввода-вывода

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

Метод Цель

WdfIoTargetFormatRequestForRead

Форматирует запрос на чтение

WdfIoTargetFormatRequestForWrite

Форматирует запрос на запись

WdfIoTargetFormatRequestForIoctl

Форматирует запрос на управление устройством

WdfIoTargetFormatRequestForInternalIoctl

Форматирует внутренний запрос на управление устройством

WdfIoTargetFormatRequestForInternalIoctlOthers

Форматирует нестандартный внутренний запрос на управление устройством

Чтобы отправить запрос ввода-вывода асинхронно, драйвер должен:

  1. Отформатируйте запрос.

    Используйте один из методов, перечисленных в предыдущей таблице, для форматирования запросов. Подробные сведения об использовании этих методов см. на справочных страницах методов.

  2. Зарегистрируйте функцию обратного вызова CompletionRoutine .

    Если вы отправляете запросы асинхронно, обычно требуется, чтобы платформа уведомляла драйвер о завершении каждого запроса другим драйвером. Драйвер должен определить функцию обратного вызова CompletionRoutine и зарегистрировать ее, вызвав WdfRequestSetCompletionRoutine. Дополнительные сведения см. в разделе Завершение запросов ввода-вывода.

  3. Отправьте запрос.

    После того как драйвер форматирует запрос и регистрирует функцию обратного вызова CompletionRoutine , драйвер должен вызвать WdfRequestSend. Этот метод позволяет отправлять запросы синхронно или асинхронно в зависимости от флагов, заданных в параметре RequestOptions . Более простой способ синхронной отправки запросов ввода-вывода см. в статье Синхронная отправка запросов ввода-вывода. Сведения о том, как получить состояние завершения для асинхронного запроса или любого запроса, отправляемого путем вызова WdfRequestSend, см. в разделе Завершение запросов ввода-вывода.

Драйвер, вызывающий WdfRequestSend для отправки запроса ввода-вывода, может попытаться отменить запрос позже. Дополнительные сведения см. в разделе Отмена запросов ввода-вывода.

Некоторые драйверы могут отправлять один запрос ввода-вывода нескольким устройствам и, следовательно, нескольким целевым объектам ввода-вывода, вызывая WdfRequestSend несколько раз для каждого запроса. Эти драйверы должны вызывать WdfRequestChangeTarget перед каждым вызовом WdfRequestSend после первого, чтобы убедиться, что запрос может быть отправлен в следующий целевой объект ввода-вывода.