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

Средство проверки статических драйверов (SDV) использует набор правил интерфейса и модель операционной системы для определения правильности взаимодействия драйвера с операционной системой Windows. SDV находит дефекты в коде драйвера, которые могут указывать на потенциальные ошибки в драйверах.

SDV может анализировать драйверы в режиме ядра, соответствующие одной из следующих моделей драйверов: WDM, KMDF, NDIS или Storport. Дополнительные сведения см. в статье "Поддерживаемые драйверы" и "Определение того, поддерживает ли средство проверки статических драйверов" драйвер или библиотеку. Кроме того, SDV обеспечивает ограниченную поддержку (строго ограниченный набор правил, ориентированный на общие ошибки, такие как отмена ссылок NULL) для драйверов, которые не соответствуют приведенным выше моделям драйверов.

Внимание

SDV больше не поддерживается, а SDV недоступен в выпусках Windows 24H2 WDK или EWDK. Он недоступен в WDKs более поздней сборки 26017 и не включен в windows 24H2 RTM WDK. SDV по-прежнему можно использовать, скачав Windows 11 версии 22H2 EWDK (выпущено 24 октября 2023 г.) с инструментами сборки Visual Studio 17.1.5 из скачивания комплекта драйверов Windows (WDK). Рекомендуется использовать только enterprise WDK для запуска SDV. Использование более старых версий стандартной WDK в сочетании с последними выпусками Visual Studio не рекомендуется, так как это, скорее всего, приведет к сбоям анализа.
В будущем CodeQL будет основным средством статического анализа драйверов. CodeQL предоставляет мощный язык запросов, который обрабатывает код как базу данных для запроса, что упрощает запись запросов для конкретных поведения, шаблонов и многого другого. Дополнительные сведения об использовании CodeQL см. в разделе CodeQL и проверка логотипа статических инструментов.

Подготовка исходного кода

Чтобы подготовить код к анализу, выполните следующие действия.

  1. Объявление функций, предоставляемых драйвером, с помощью типов ролей функций

    ДЛЯ SDV требуется, чтобы функции объявлялись с помощью объявлений типов ролей функции. Например, подпрограмма DriverEntry должна быть объявлена с помощью типа роли функции DRIVER_INITIALIZE:

    DRIVER_INITIALIZE DriverEntry;
    

    После объявления вы реализуете (или определяете) подпрограмму обратного вызова следующим образом:

    /
    // Driver initialization routine
    //
    NTSTATUS
      DriverEntry(
        _In_ struct _DRIVER_OBJECT  *DriverObject,
        _In_ PUNICODE_STRING  RegistryPath
        )
      {
          // Function body
      }
    

    Каждая поддерживаемая модель драйверов содержит набор типов ролей функций для функций обратного вызова драйвера и подпрограмм отправки. Эти типы ролей функций объявляются в файлах заголовков WDK. Например, ниже приведен прототип функции для типа роли DRIVER_INITIALIZE, как он отображается в Wdm.h.

    /
    // Define driver initialization routine type.
    //
    _Function_class_(DRIVER_INITIALIZE)
    _IRQL_requires_same_
    typedef
    NTSTATUS
    DRIVER_INITIALIZE (
        _In_ struct _DRIVER_OBJECT *DriverObject,
        _In_ PUNICODE_STRING RegistryPath
        );
    
    typedef DRIVER_INITIALIZE *PDRIVER_INITIALIZE;
    

    Так как типы ролей функций уже определены в файлах заголовков WDK, необходимо объявить функции обратного вызова только для этого типа. В этом случае вы объявляете DriverEntry типом DRIVER_INITIALIZE. Полный список типов ролей функций для моделей драйверов см. в разделе "Использование объявлений типов ролей функции".

  2. Выполнение анализа кода для C/C++

    Чтобы определить, подготовлен ли исходный код, запустите средство анализа кода в Visual Studio. Средство анализа кода проверяет объявления типов ролей функции, для которых требуется SDV. Средство анализа кода может помочь определить все объявления функций, которые могли быть пропущены или предупреждать вас, если параметры определения функции не соответствуют значениям в типе роли функции.

    • Откройте проект драйвера в Visual Studio.
    • В меню "Сборка " щелкните "Выполнить анализ кода" в решении.

    Результаты отображаются в окне "Анализ кода". Исправьте все объявления функций, которые вы могли пропустить. Вы также можете настроить средство анализа кода, чтобы оно выполнялось всякий раз при сборке решения.

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

    Анализ кода для предупреждения C/C++ Description
    C28101 Модуль Drivers вывел, что текущая функция является <функцией типа> функции
    C28022 Класс функции (es) для этой функции не соответствует классам функций (es) в типдефе, используемому для его определения.
    C28023 Назначаемая или передаваемая функция должна иметь _Function_class_ заметку по крайней мере для одного из классов(es)
    C28024 Указатель функции, которому назначается, аннотирован с классом функции, который не содержится в списке классов функций.
    C28169 Функция диспетчеризации <> не содержит никаких заметок _Dispatch_type_
    C28208 Сигнатура функции не совпадает с объявлениями функций

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

  1. Откройте файл проекта драйвера (.vcxProj) в Visual Studio. В меню "Драйвер" нажмите кнопку "Запустить средство проверки статического драйвера...".

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

  2. Если драйвер включает библиотеку, щелкните вкладку "Библиотеки" и нажмите кнопку "Добавить библиотеку", чтобы добавить библиотеку.

    Перейдите к каталогу исходного кода библиотеки и выберите файл проекта (.vcxProj). Добавьте все библиотеки, которые включает драйвер. Библиотеки необходимо добавить, прежде чем SDV анализирует драйвер. При запуске анализа драйвера SDV также анализирует библиотеки, которые не были обработаны. После обработки библиотеки он хранится в глобальном кэше SDV. Дополнительные сведения см. в разделе "Обработка библиотеки" в средство проверки статических драйверов

  3. Проверьте параметры конфигурации для средства проверки статических драйверов. Выберите вкладку Настройка .

    Конфигурация проекта отображает параметры конфигурации и платформы, выбранные в Visual Studio.

    В большинстве случаев ресурсы можно использовать параметры по умолчанию. Если SDV сообщает timeout, GiveUp или Spaceout, попробуйте настроить эти параметры. Дополнительные сведения см . в рекомендациях по устранению неполадок с проверкой статических драйверов.

    Запланируйте время начала проверки. Параметр по умолчанию — начать анализ сразу после нажатия кнопки "Пуск " на вкладке Main . В зависимости от размера драйвера и его сложности статический анализ может занять много времени. Вам может потребоваться запланировать начало анализа, когда это удобнее всего для вас; например, в конце дня.

    Примечание.

    Не забудьте проверить план управления питанием компьютера, чтобы убедиться, что компьютер не перейдет в состояние спящего режима во время анализа.

  4. Щелкните вкладку "Правила", чтобы выбрать правила использования API драйверов, чтобы проверить при запуске анализа.

    Средство проверки статических драйверов обнаруживает тип анализируемого драйвера (WDF, WDM, NDIS или Storport) и выбирает набор правил по умолчанию для типа драйвера. Если это первый раз, когда вы запускаете SDV на драйвере, следует запустить набор правил по умолчанию.

    Сведения о правилах см. в разделе "Правила соответствия DDI".

  5. Запустите статический анализ. Перейдите на вкладку Main и нажмите кнопку "Пуск". При нажатии кнопки "Пуск" отображается сообщение, позволяющее узнать, что статический анализ запланирован и что анализ может занять много времени. Чтобы продолжить, нажмите кнопку ОК . Анализ начинается с запланированного времени.

Просмотр и анализ результатов

По мере продолжения статического анализа SDV сообщает о состоянии анализа. По завершении анализа SDV сообщает результаты и статистику. Если драйвер не удовлетворяет правилу использования API, результат сообщается как дефект.

Если возникли проблемы, SDV отображает их на страницах предупреждений и ошибок. На странице "Свойства драйвера" отображаются результаты тестов для определенных свойств драйвера. Тесты свойств драйвера используются для идентификации функций драйвера для дальнейшего определения анализа. Результаты свойств драйвера можно использовать для подтверждения ожидаемых свойств и поддерживаемых возможностей драйвера.

Чтобы просмотреть определенные дефекты в отчете средства проверки статического драйвера, щелкните "Дефект" в области результатов. Откроется средство просмотра трассировки, отображающее трассировку пути кода к нарушению правила. Дополнительные сведения см. в разделе "Интерпретация результатов проверки статического драйвера".

Примечание.

Средство проверки статических драйверов сохраняет результаты и параметры из анализа. Чтобы очистить результаты, нажмите кнопку "Очистить".

Устранение неполадок результатов проверки статических драйверов

Если SDV сообщает, что дефекты не найдены, проверьте вкладку Main , чтобы убедиться, что точки входа обнаружены. Если драйвер не объявляет функции с помощью типов ролей функций, SDV не сможет анализировать и находить дефекты в коде драйвера. Дополнительные сведения см. в разделе "Использование объявлений типов ролей функции".

Если время ожидания sdV сообщает или не возвращает полезные результаты, может потребоваться изменить несколько параметров конфигурации SDV. Дополнительные сведения об устранении неполадок с SDV см . в рекомендациях по устранению неполадок с проверкой статических драйверов.

Определение того, поддерживает ли средство проверки статических драйверов драйвер или библиотеку

Использование объявлений типов ролей функции

Правила проверки статических драйверов

Средство анализа кода