Правило 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 . Чтобы выполнить анализ кода, выполните следующие действия.
Дополнительные сведения см. в статье Использование средства проверки статических драйверов для поиска дефектов в драйверах. |
Применяется к
WdfDeviceEnqueueRequestWdfDmaTransactionInitializeWdfDmaTransactionInitializeUsingRequestWdfIoTargetSendInternalioctlOthersSynchronouslyWdfIoTargetSendInternalioctlSynchronouslyWdfIoTargetSendIoctlSynchronouslyWdfIoTargetSendReadSynchronouslyWdfIoTargetSendWriteSynchronouslyWdfRequestCompleteWdfRequestCompleteWithInformationWdfRequestCompleteWithPriorityBoostWdfRequestForwardToIoQueueWdfRequestMarkCancelableWdfRequestMarkCancelableExWdfRequestSendWdfRequestStopAcknowledgeWdfRequestUnmarkCancelableWdfWorkItemEnqueue