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


Набор правил предупреждения (KMDF)

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

В этом разделе

Раздел Описание

DeferredRequestCompleted

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

DriverAttributeChanged

Правило DriverAttributeChanged указывает, что драйвер не должен изменять уровень выполнения или синхронизацию область драйвера KMDF.

DrvAckIoStop

Правило DrvAckIoStop проверяет, что драйвер знает об ожидающих запросах, в то время как его очередь, управляемая питанием, отключается, а драйвер подтверждает, завершает или отменяет ожидающие запросы соответствующим образом. В случае самоуправляемых запросов ввода-вывода драйвер также должен правильно обрабатывать эти запросы из своей функции EvtDeviceSelfManagedIoSuspend . Драйвер, который не может обработать эти запросы во время выключения питания, вызовет 0x9F проверки ошибок: DRIVER_POWER_STATE_FAILURE.

EvtIoResumeGetParam

Правило EvtIoResumeGetParam указывает, что WdfRequestGetParameters не вызывается в функции обратного вызова EvtIoResumeGetParam .

EvtIoStopGetParam

Правило EvtIoStopGetParam проверяет, не вызывается ли WdfRequestGetParameters в обратном вызове EvtIoStop .

EvtIoStopResume

Правило EvtIoStopResume указывает, что если драйвер регистрирует функцию обратного вызова EvtIoStop , а затем вызывает WdfRequestStopAcknowledge с параметром Requeue , равным FALSE, драйвер должен зарегистрировать функцию обратного вызова EvtIoResume . Платформа доставляет запросы к функции обратного вызова EvtIoResume , когда устройство снова переходит в состояние D0.

EvtSurpriseRemoveNoRequestComplete

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

FDOPowerPolicyOwnerAPI

Правило FDOPowerPolicyOwnerAPI указывает, что если драйвер FDO отказался от владения политикой управления питанием, методы WdfDeviceInitPowerPolicyEventCallbacks, WdfDeviceAssignS0IdleSettings и WdfDeviceAssignSxWakeSettings могут вызываться только по путям выполнения, где драйвер является владельцем политики питания. SDV выдает предупреждение для этого правила.

NoCancelFromEvtSurpriseRemove

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

PagedCodeAtD0

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

ParentObjectCheck

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

ReqNotCanceledLocal

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

ReqSendFail

Правило ReqSendFail указывает, что драйвер должен задать правильное состояние завершения в случаях, когда метод WdfRequestSend может завершиться ошибкой.

RequestCompletedLocal

Правило RequestCompletedLocal указывает, что если запрос ввода-вывода не выполнен ни в одной из функций обратного вызова EvtIoDefault, EvtIoRead, EvtIoWrite, EvtIoDeviceControl и EvtIoInternalDeviceControl и если wdfRequestMarkCancelable не был вызван для запроса в функции обратного вызова, может возникнуть проблема с завершением запроса в коде драйвера.

RequestForUrbXrb

Если драйвер клиента вызывает WdfUsbTargetDeviceCreateWithParameters и задает версию контракта клиента, USBD_CLIENT_CONTRACT_VERSION_602 в структуре WDF_USB_DEVICE_CREATE_CONFIG (для использования новых возможностей стека драйверов USB для Windows 8), DDIs, использующие URB внутри, будут использовать контекст URB только в том случае, если применяются какие-либо из следующих предварительных условий:

SyncReqSend

Правило SyncReqSend указывает, что все синхронные запросы на отправку выполняются с помощью синхронных методов интерфейса драйвера устройства KMDF и что для методов задано ненулевое значение времени ожидания.

SyncReqSend2

Правило SyncReqSend2 указывает, что синхронные отправки запросов имеют ненулевое значение времени ожидания.

Выбор набора правил предупреждения

  1. Выберите проект драйвера (.vcxProj) в Microsoft Visual Studio. В меню Драйвер щелкните Запустить средство проверки статических драйверов....

  2. Перейдите на вкладку Правила . В разделе Наборы правил выберите Предупреждение.

    Чтобы выбрать набор правил по умолчанию в окне командной строки разработчика Visual Studio, укажите Warning.sdv с параметром /проверка. Пример:

    msbuild /t:sdv /p:Inputs="/check:Warning.sdv" mydriver.VcxProj /p:Configuration="Win8 Release" /p:Platform=Win32
    

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