Набор правил предупреждения (KMDF)
Используйте эти правила, чтобы убедиться, что драйвер может правильно обрабатывать IRP в различных контекстах и следовать рекомендациям Майкрософт.
В этом разделе
Раздел | Описание |
---|---|
Правило DeferredRequestCompleted указывает, что если запрос ввода-вывода, представленный в очередь ввода-вывода драйвера по умолчанию, не завершен в функции обратного вызова, но откладывается для последующей обработки, запрос должен быть выполнен в функции обратного вызова отложенной обработки, если запрос не перенаправлен и доставлен в платформу, или если не вызывается метод WdfRequestStopAcknowledge . |
|
Правило DriverAttributeChanged указывает, что драйвер не должен изменять уровень выполнения или синхронизацию область драйвера KMDF. |
|
Правило DrvAckIoStop проверяет, что драйвер знает об ожидающих запросах, в то время как его очередь, управляемая питанием, отключается, а драйвер подтверждает, завершает или отменяет ожидающие запросы соответствующим образом. В случае самоуправляемых запросов ввода-вывода драйвер также должен правильно обрабатывать эти запросы из своей функции EvtDeviceSelfManagedIoSuspend . Драйвер, который не может обработать эти запросы во время выключения питания, вызовет 0x9F проверки ошибок: DRIVER_POWER_STATE_FAILURE. |
|
Правило EvtIoResumeGetParam указывает, что WdfRequestGetParameters не вызывается в функции обратного вызова EvtIoResumeGetParam . |
|
Правило EvtIoStopGetParam проверяет, не вызывается ли WdfRequestGetParameters в обратном вызове EvtIoStop . |
|
Правило EvtIoStopResume указывает, что если драйвер регистрирует функцию обратного вызова EvtIoStop , а затем вызывает WdfRequestStopAcknowledge с параметром Requeue , равным FALSE, драйвер должен зарегистрировать функцию обратного вызова EvtIoResume . Платформа доставляет запросы к функции обратного вызова EvtIoResume , когда устройство снова переходит в состояние D0. |
|
Правило EvtSurpriseRemoveNoRequestComplete указывает, что драйверы WDF не должны выполнять запросы от EvtDeviceSurpriseRemoval обратного вызова, вместо этого следует использовать самоуправляемые функции обратного вызова ввода-вывода. Обратный вызов EvtDeviceSurpriseRemoval не синхронизирован с путем выключения питания. |
|
Правило FDOPowerPolicyOwnerAPI указывает, что если драйвер FDO отказался от владения политикой управления питанием, методы WdfDeviceInitPowerPolicyEventCallbacks, WdfDeviceAssignS0IdleSettings и WdfDeviceAssignSxWakeSettings могут вызываться только по путям выполнения, где драйвер является владельцем политики питания. SDV выдает предупреждение для этого правила. |
|
Правило NoCancelFromEvtSurpriseRemove указывает, что драйверы WDF не должны отменять запросы от функции обратного вызова EvtDeviceSurpriseRemoval , вместо этого следует использовать самоуправляемые функции обратного вызова ввода-вывода. Функция обратного вызова EvtDeviceSurpriseRemoval не синхронизируется с путем выключения питания. |
|
Правило PagedCodeAtD0 указывает, что драйвер не должен помечать код как доступный для страницы в функциях обратного вызова, которые находятся в пути кода питания. |
|
Правило ParentObjectCheck указывает, что драйвер должен вызывать WdfMemoryCreate , указывая родительский объект с помощью структуры WDF_OBJECT_ATTRIBUTES . Если драйвер не задает родительский объект для объекта памяти платформы, платформа устанавливает драйвер в качестве родительского объекта по умолчанию, поэтому, если драйвер не удалит объект памяти платформы явным образом, он будет оставаться в памяти до тех пор, пока объект драйвера не выгрузится. |
|
Правило ReqNotCanceledLocal указывает, что если запрос, помеченный как отменяемый, завершается функцией обратного вызова очереди ввода-вывода по умолчанию, метод WdfRequestUnmarkCancelable должен вызываться в запросе ввода-вывода перед завершением. Запрос ввода-вывода должен быть завершен, если он не будет отменен до вызова WdfRequestUnmarkCancelable. |
|
Правило ReqSendFail указывает, что драйвер должен задать правильное состояние завершения в случаях, когда метод WdfRequestSend может завершиться ошибкой. |
|
Правило RequestCompletedLocal указывает, что если запрос ввода-вывода не выполнен ни в одной из функций обратного вызова EvtIoDefault, EvtIoRead, EvtIoWrite, EvtIoDeviceControl и EvtIoInternalDeviceControl и если wdfRequestMarkCancelable не был вызван для запроса в функции обратного вызова, может возникнуть проблема с завершением запроса в коде драйвера. |
|
Если драйвер клиента вызывает WdfUsbTargetDeviceCreateWithParameters и задает версию контракта клиента, USBD_CLIENT_CONTRACT_VERSION_602 в структуре WDF_USB_DEVICE_CREATE_CONFIG (для использования новых возможностей стека драйверов USB для Windows 8), DDIs, использующие URB внутри, будут использовать контекст URB только в том случае, если применяются какие-либо из следующих предварительных условий: |
|
Правило SyncReqSend указывает, что все синхронные запросы на отправку выполняются с помощью синхронных методов интерфейса драйвера устройства KMDF и что для методов задано ненулевое значение времени ожидания. |
|
Правило SyncReqSend2 указывает, что синхронные отправки запросов имеют ненулевое значение времени ожидания. |
Выбор набора правил предупреждения
Выберите проект драйвера (.vcxProj) в Microsoft Visual Studio. В меню Драйвер щелкните Запустить средство проверки статических драйверов....
Перейдите на вкладку Правила . В разделе Наборы правил выберите Предупреждение.
Чтобы выбрать набор правил по умолчанию в окне командной строки разработчика Visual Studio, укажите Warning.sdv с параметром /проверка. Пример:
msbuild /t:sdv /p:Inputs="/check:Warning.sdv" mydriver.VcxProj /p:Configuration="Win8 Release" /p:Platform=Win32
Дополнительные сведения см. в разделах Использование статического средства проверки драйверов для поиска дефектов в драйверах и Команд статического средства проверки драйверов (MSBuild).