Асинхронная отправка запросов ввода-вывода
Перед асинхронной отправкой запроса ввода-вывода в целевой объект ввода-вывода необходимо отформатировать запрос. В следующей таблице перечислены методы целевого объекта ввода-вывода, которые драйвер может вызывать для форматирования запросов ввода-вывода.
Метод | Цель |
---|---|
Форматирует запрос на чтение |
|
Форматирует запрос на запись |
|
Форматирует запрос на управление устройством |
|
Форматирует внутренний запрос на управление устройством |
|
Форматирует нестандартный внутренний запрос на управление устройством |
Чтобы отправить запрос ввода-вывода асинхронно, драйвер должен:
Отформатируйте запрос.
Используйте один из методов, перечисленных в предыдущей таблице, для форматирования запросов. Подробные сведения об использовании этих методов см. на справочных страницах методов.
Зарегистрируйте функцию обратного вызова CompletionRoutine .
Если вы отправляете запросы асинхронно, обычно требуется, чтобы платформа уведомляла драйвер о завершении каждого запроса другим драйвером. Драйвер должен определить функцию обратного вызова CompletionRoutine и зарегистрировать ее, вызвав WdfRequestSetCompletionRoutine. Дополнительные сведения см. в разделе Завершение запросов ввода-вывода.
Отправьте запрос.
После того как драйвер форматирует запрос и регистрирует функцию обратного вызова CompletionRoutine , драйвер должен вызвать WdfRequestSend. Этот метод позволяет отправлять запросы синхронно или асинхронно в зависимости от флагов, заданных в параметре RequestOptions . Более простой способ синхронной отправки запросов ввода-вывода см. в статье Синхронная отправка запросов ввода-вывода. Сведения о том, как получить состояние завершения для асинхронного запроса или любого запроса, отправляемого путем вызова WdfRequestSend, см. в разделе Завершение запросов ввода-вывода.
Драйвер, вызывающий WdfRequestSend для отправки запроса ввода-вывода, может попытаться отменить запрос позже. Дополнительные сведения см. в разделе Отмена запросов ввода-вывода.
Некоторые драйверы могут отправлять один запрос ввода-вывода нескольким устройствам и, следовательно, нескольким целевым объектам ввода-вывода, вызывая WdfRequestSend несколько раз для каждого запроса. Эти драйверы должны вызывать WdfRequestChangeTarget перед каждым вызовом WdfRequestSend после первого, чтобы убедиться, что запрос может быть отправлен в следующий целевой объект ввода-вывода.