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

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

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

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

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

  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++ Описание
    C28101 Модуль Drivers вывел вывод о том, что текущая <функция является функцией типа> функции.
    C28022 Классы функций в этой функции не соответствуют классу функции в определении типа, используемом для его определения.
    C28023 Функция, назначаемая или передаваемая, должна иметь _Function_class_ заметку по крайней мере для одного из классов.
    C28024 Указатель функции, которому назначается, аннотируется классом функции, который не содержится в списке классов функций.
    C28169 Функция> диспетчеризации <не имеет примечаний _Dispatch_type_
    C28208 Сигнатура функции не соответствует объявлениям функций

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

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

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

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

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

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

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

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

    Расписание Выберите время начала проверки. По умолчанию анализ начинается сразу после нажатия кнопки Пуск на вкладке Главная . В зависимости от размера драйвера и его сложности статический анализ может занять много времени. Вы можете запланировать начало анализа, когда он будет наиболее удобным для вас; например, в конце дня.

    Примечание

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

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

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

    Дополнительные сведения о правилах см. в разделе Правила соответствия DDI.

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

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

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

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

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

Примечание

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

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

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

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

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

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

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

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