Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Каждый драйвер на основе платформы должен в конечном итоге завершить каждый запрос ввода-вывода, получаемый из платформы. Драйверы выполняют запросы, вызывая метод объекта запроса WdfRequestComplete, WdfRequestCompleteWithInformation или WdfRequestCompleteWithPriorityBoost.
Когда требуется завершить запрос
Драйвер должен завершить запрос, когда определяется, что какой-то из следующих случаев верен:
Запрошенная операция ввода-вывода успешно завершена.
Запрошенная операция ввода-вывода была запущена, но завершилась сбоем.
Запрошенная операция ввода-вывода не поддерживается или не была действительна на момент получения и не может быть запущена.
Запрошенная операция ввода-вывода была отменена.
Если драйвер обслуживает запрос ввода-вывода путем создания действия ввода-вывода на устройстве, драйвер обычно вызывает WdfRequestComplete из функции обратного вызова EvtInterruptDpc или EvtDpcFunc .
Если драйвер получает неподдерживаемый или недопустимый запрос, обычно вызывает WdfRequestComplete из обработчика запросов , который получил запрос.
Если операция ввода-вывода отменена, драйвер обычно вызывает WdfRequestComplete из функции обратного вызова EvtRequestCancel .
Если драйвер перенаправит запрос ввода-вывода в целевой объект ввода-вывода, драйвер завершает запрос после завершения запроса, как показано ниже.
Если ваш драйвер перенаправит запрос ввода-вывода синхронно в целевой объект ввода-вывода, вызов драйвера целевого объекта ввода-вывода возвращается только после того, как более низкоуровневый драйвер завершит обработку запроса (если не произойдет ошибка). После возврата целевого объекта ввода-вывода драйвер должен вызвать WdfRequestComplete.
Если драйвер перенаправит запрос ввода-вывода асинхронно, вы хотите, чтобы ваш драйвер был уведомлен, когда драйвер нижнего уровня завершит запрос. Если драйвер регистрирует функцию обратного вызова CompletionRoutine, платформа вызывает эту функцию обратного вызова после завершения запроса. Функция обратного вызова CompletionRoutine обычно вызывает WdfRequestComplete.
Чтобы зарегистрировать функцию обратного вызова CompletionRoutine , драйвер должен вызвать WdfRequestSetCompletionRoutine , прежде чем он перенаправит запрос ввода-вывода в целевой объект ввода-вывода.
Если драйверу не нужно получать уведомления, когда целевой объект ввода-вывода завершает асинхронно переадресованный запрос ввода-вывода, драйвер не должен зарегистрировать функцию обратного вызова CompleteRoutine . Вместо этого драйвер может задать флаг WDF_REQUEST_SEND_OPTION_SEND_AND_FORGET при вызове WdfRequestSend. В этом случае драйвер не вызывает WdfRequestComplete.
Драйвер не завершает запрос ввода-вывода, созданный путем вызова WdfRequestCreate или WdfRequestCreateFromIrp. Вместо этого драйвер должен вызвать WdfObjectDelete , чтобы удалить объект запроса, как правило, после завершения запроса целевого объекта ввода-вывода.
Например, драйвер может получить запрос на чтение или запись для объема данных, который превышает возможности целевых устройств ввода-вывода драйвера обрабатывать их за один раз. Драйвер должен разделить данные на несколько небольших запросов и отправить эти небольшие запросы одному или нескольким целевым объектам ввода-вывода. Ниже приведены методы обработки этой ситуации:
Вызов WdfRequestCreate для создания одного дополнительного объекта запроса, представляющего меньший запрос.
Драйвер может отправлять этот запрос синхронно в целевой объект ввода-вывода. Функция обратного вызова CompletionRoutine меньшего запроса может вызывать WdfRequestReuse, чтобы драйвер смог повторно использовать запрос и отправить его в цель ввода/вывода еще раз. После завершения последнего меньшего запроса функция обратного вызова CompleteRoutine может вызвать WdfObjectDelete , чтобы удалить созданный драйвером объект запроса, и драйвер может вызвать WdfRequestComplete , чтобы завершить исходный запрос.
Вызов WdfRequestCreate для создания нескольких дополнительных объектов запроса, представляющих меньшие запросы.
Целевые объекты ввода-вывода драйвера могут обрабатывать эти несколько небольших запросов асинхронно. Драйвер может зарегистрировать функцию обратного вызова CompletionRoutine для каждого из небольших запросов. Каждый раз, когда вызывается функция обратного вызова CompletionRoutine , он может вызывать WdfObjectDelete , чтобы удалить созданный драйвером объект запроса. После того как целевой объект ввода-вывода завершит обработку всех небольших запросов, драйвер может вызвать WdfRequestComplete, чтобы завершить исходный запрос.
Предоставление сведений о завершении
Когда драйвер завершает запрос, он может предоставить дополнительные сведения, к которым могут получить доступ другие драйверы. Например, драйвер может указать количество байтов, которые были переданы для запроса на чтение или запись. Чтобы предоставить эти сведения, драйвер может выполнить одно из следующих действий:
Вызов WdfRequestSetInformation перед вызовом WdfRequestComplete.
Вызовите WdfRequestCompleteWithInformation.
Получение сведений о завершении
Чтобы получить сведения о запросе ввода-вывода, завершенном другим драйвером, драйвер может:
Вызовите WdfRequestGetStatus, чтобы получить значение состояния завершения, указанное драйвером нижнего уровня при вызове WdfRequestComplete.
Вызовите WdfRequestGetCompletionParams, чтобы получить WDF_REQUEST_COMPLETION_PARAMS структуру, содержащую дополнительные сведения о завершенном запросе, например дескриптор для объектов памяти, представляющих буферы запроса или сведения о шине.
Драйвер может вызывать WdfRequestGetCompletionParams только после вызова WdfRequestSend для отправки запроса ввода-вывода синхронно или асинхронно в целевой объект ввода-вывода. Драйвер не должен вызывать WdfRequestGetCompletionParams после вызова одного из методов, которые отправляют запросы ввода-вывода в целевые объекты ввода-вывода только синхронно (например, WdfIoTargetSendReadSynchronous).
Вызовите WdfRequestGetInformation , чтобы получить дополнительные сведения о завершении ввода-вывода, указанные драйвером нижнего уровня, указанным при вызове WdfRequestSetInformation или WdfRequestCompleteWithInformation, если драйверы в стеке драйверов предоставляют такие сведения.
Если драйвер отправляет запрос ввода-вывода синхронно, обычно он вызывает WdfRequestGetStatus, WdfRequestGetCompletionParams и WdfRequestGetInformation после синхронного вызова. Если драйвер отправляет запрос ввода-вывода асинхронно, обычно вызывает эти методы из функции обратного вызова CompletionRoutine .
Дополнительные сведения о выполнении запросов ввода-вывода см. в разделе Синхронизация кода отмены и завершения.