Правило DeferredRequestCompleted (kmdf)

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

Правило DeferredRequestCompleted требует идентификации отложенных запросов с помощью макросов __sdv_save_request и __sdv_retrieve_request . Сведения об использовании этих макросов см. в статье Использование __sdv_save_request и __sdv_retrieve_request для отложенных вызовов процедур. Правило предварительного условия AliasWithinTimerDpc проверяет наличие этих макросов.

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

  • Запрос ввода-вывода был перенаправлен в целевой объект ввода-вывода или в другую очередь.

  • Запрос ввода-вывода был доставлен в платформу (путем вызова WdfDeviceEnqueueRequest)

  • Был вызван метод WdfRequestStopAcknowledge .

Правило проверяется при выходе драйвера из следующих функций обратного вызова:

  • EvtIoStop, EvtCleanupCallback или EvtDegradCallback для очереди

  • EvtCleanupCallback или EvtDegradCallback для объекта файла

  • EvtFileClose, EvtFileCleanup, EvtDeviceSelfManagedIoSuspend, EvtDeviceSelfManagedIoFlush, EvtDeviceSelfManagedIoCleanup, EvtDeviceShutdownNotification, EvtDeviceSurpriseRemoval, EvtCleanupCallback или EvtDepilCallback для устройства

  • EvtDriverUnload

Функции обратного вызова очереди ввода-вывода для презентации запроса ввода-вывода: EvtIoDefault, EvtIoRead, EvtIoWrite, EvtIoDeviceControl и EvtIoInternalDeviceControl.

Функции обратного вызова отложенной обработки для запроса ввода-вывода: EvtTimerFunc, EvtDpcFunc, EvtInterruptDpc, EvtInterruptEnable, EvtInterruptDisable и EvtWorkItem.

Правило DeferredRequestCompleted использует вызовы методов WdfRequestMarkCancelable, WdfDmaTransactionInitializeUsingRequest, WdfDmaTransactionInitialize или WdfWorkItemEnqueue , чтобы указать, что запрос ввода-вывода откладывается.

Модель драйвера: KMDF

Как тестировать

Во время компиляции

Запустите средство проверки статических драйверов и укажите правило DeferredRequestCompleted .

Чтобы выполнить анализ кода, выполните следующие действия.
  1. Подготовьте код (используйте объявления типов ролей).
  2. Запустите средство проверки статических драйверов.
  3. Просмотр и анализ результатов.

Дополнительные сведения см. в статье Использование средства проверки статических драйверов для поиска дефектов в драйверах.

Применяется к

WdfDeviceEnqueueRequestWdfDmaTransactionInitializeWdfDmaTransactionInitializeUsingRequestWdfIoTargetSendInternalioctlOthersSynchronouslyWdfIoTargetSendInternalioctlSynchronouslyWdfIoTargetSendIoctlSynchronouslyWdfIoTargetSendReadSynchronouslyWdfIoTargetSendWriteSynchronouslyWdfRequestCompleteWdfRequestCompleteWithInformationWdfRequestCompleteWithPriorityBoostWdfRequestForwardToIoQueueWdfRequestMarkCancelableWdfRequestMarkCancelableExWdfRequestSendWdfRequestStopAcknowledgeWdfRequestUnmarkCancelableWdfWorkItemEnqueue