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


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

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

Метод Цель

WdfIoTargetFormatRequestForRead

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

WdfIoTargetFormatRequestForWrite

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

WdfIoTargetFormatRequestForIoctl

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

WdfIoTargetFormatRequestForInternalIoctl

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

Форматирование запроса цели WDF для внутреннего IOCTL других

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

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

  1. Форматирование запроса.

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

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

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

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

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

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

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