Использование средства проверки статических драйверов для поиска дефектов в драйверах Windows
Средство проверки статических драйверов (SDV) использует набор правил интерфейса и модель операционной системы для определения правильности взаимодействия драйвера с операционной системой Windows. SDV находит дефекты в коде драйвера, которые могут указывать на потенциальные ошибки в драйверах.
SDV может анализировать драйверы в режиме ядра, соответствующие одной из следующих моделей драйверов: WDM, KMDF, NDIS или Storport. Дополнительные сведения см. в статье "Поддерживаемые драйверы " и "Определение того, поддерживает ли средство проверки статических драйверов" драйвер или библиотеку. Кроме того, SDV обеспечивает ограниченную поддержку (строго ограниченный набор правил, сфокусированный на общем наборе ошибок, таких как разыменование NULL) для драйверов, которые не соответствуют приведенным выше архитектурам драйверов.
Это важно
SDV больше не поддерживается, а SDV недоступен в выпусках Windows 24H2 WDK или EWDK. Он недоступен в версиях WDK, выпущенных позже сборки 26017, и не включен в WDK Windows 24H2 RTM.
SDV по-прежнему можно использовать, скачав Windows 11, версии 22H2 EWDK (выпущенный 24 октября 2023 г.) с инструментами сборки Visual Studio 17.1.5 с скачать пакет драйверов Windows (WDK). Рекомендуется использовать только enterprise WDK для запуска SDV. Использование более старых версий стандартной WDK в сочетании с последними выпусками Visual Studio не рекомендуется, так как это, скорее всего, приведет к сбоям анализа.
В будущем CodeQL будет основным средством статического анализа драйверов. CodeQL предоставляет мощный язык запросов, который обрабатывает код как базу данных для запроса, что упрощает запись запросов для конкретных поведения, шаблонов и многого другого.
Дополнительные сведения об использовании CodeQL см. в CodeQL и тесте логотипа статических инструментов.
Подготовка исходного кода
Чтобы подготовить код к анализу, выполните следующие действия.
Объявление функций, предоставляемых драйвером, с помощью типов ролей функций
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. Для получения полного списка типов ролей функций для моделей драйверов см. в разделе "Использование объявлений типов ролей функций."
Выполнение анализа кода для C/C++
Чтобы определить, подготовлен ли исходный код, запустите средство анализа кода в Visual Studio. Средство анализа кода проверяет объявления типов ролей функций, которые требуются SDV. Средство анализа кода может помочь определить все объявления функций, которые могли быть пропущены или предупреждать вас, если параметры определения функции не соответствуют значениям в типе роли функции.
- Откройте проект драйвера в Visual Studio.
- В меню "Сборка" щелкните "Выполнить анализ кода" в решении.
Результаты отображаются в окне "Анализ кода ". Исправьте все объявления функций, которые вы могли пропустить. Вы также можете настроить средство анализа кода, чтобы оно выполнялось всякий раз при сборке решения.
В следующей таблице показаны некоторые предупреждения о том, что средство анализа кода может найти в коде драйвера. Чтобы запустить средство проверки статических драйверов, драйвер должен быть свободным от этих дефектов.
Анализ кода для выявления предупреждений в C/C++ Описание C28101 Модуль Drivers вывел, что текущая функция является <функцией типа> C28022 Класс функции (es) для этой функции не соответствует классам функций (es) в типдефе, используемому для его определения. C28023 Функция, которая назначается или передается, должна иметь аннотацию _Function_class_ по крайней мере для одного из классов. C28024 Указатель функции, к которому производится присвоение, аннотирован классом функции, не входящим в список классов функций. C28169 Функция <function> диспетчеризации не содержит аннотаций типа _Dispatch_type_ C28208 Сигнатура функции не совпадает с объявлениями функций
Запуск средства проверки статических драйверов
Откройте файл проекта драйвера (.vcxProj) в Visual Studio. В меню драйвера щелкните Запустить средство проверки статических драйверов....
Откроется приложение средства проверки статических драйверов, где можно управлять, настраивать и планировать, когда средство проверки статических драйверов выполняет анализ.
Если драйвер включает библиотеку, щелкните вкладку "Библиотеки " и нажмите кнопку "Добавить библиотеку ", чтобы добавить библиотеку.
Перейдите к каталогу исходного кода библиотеки и выберите файл проекта (.vcxProj). Добавьте все библиотеки, которые включает драйвер. Библиотеки необходимо добавить, прежде чем SDV анализирует драйвер. При запуске анализа драйвера SDV также анализирует библиотеки, которые не были обработаны. После обработки библиотеки он хранится в глобальном кэше SDV. Дополнительные сведения см. в разделе "Обработка библиотеки в Static Driver Verifier"
Проверьте параметры конфигурации для средства проверки статических драйверов. Перейдите на вкладку "Настройка ".
Конфигурация проекта В конфигурации проекта показаны параметры конфигурации и платформы, выбранные в Visual Studio.
Ресурсы В большинстве случаев можно использовать параметры по умолчанию. Если SDV сообщает timeout, GiveUp или Spaceout, попробуйте настроить эти параметры. Дополнительные сведения см. в рекомендациях по устранению неполадок с проверкой статических драйверов.
Расписание Выберите время начала проверки. Параметр по умолчанию — начать анализ сразу после нажатия кнопки "Пуск " на вкладке Main . В зависимости от размера драйвера и его сложности статический анализ может занять много времени. Вам может потребоваться запланировать начало анализа, когда это удобнее всего для вас; например, в конце дня.
Примечание.
Не забудьте проверить план управления питанием компьютера, чтобы убедиться, что компьютер не перейдет в состояние спящего режима во время анализа.
Щелкните вкладку "Правила" , чтобы выбрать правила использования API драйверов, чтобы проверить при запуске анализа.
Средство проверки статических драйверов обнаруживает тип анализируемого драйвера (WDF, WDM, NDIS или Storport) и выбирает набор правил по умолчанию для типа драйвера. Если это первый раз, когда вы запускаете SDV на драйвере, следует запустить набор правил по умолчанию.
Сведения о правилах см. в разделе "Правила соответствия DDI".
Запустите статический анализ. Перейдите на вкладку Main и нажмите кнопку "Пуск". При нажатии кнопки "Пуск" отображается сообщение, позволяющее узнать, что статический анализ запланирован и что анализ может занять много времени. Нажмите кнопку ОК, чтобы продолжить. Анализ начинается с запланированного времени.
Просмотр и анализ результатов
По мере продолжения статического анализа SDV сообщает о состоянии анализа. По завершении анализа SDV сообщает результаты и статистику. Если драйвер не удовлетворяет правилу использования API, результат сообщается как дефект.
Если возникли проблемы, SDV отображает их на страницах предупреждений и ошибок . На странице "Свойства драйвера" отображаются результаты тестов для определенных свойств драйвера. Тесты свойств драйвера используются для идентификации функций драйвера для дальнейшего определения анализа. Результаты свойств драйвера можно использовать для подтверждения ожидаемых свойств и поддерживаемых возможностей драйвера.
Чтобы просмотреть определенные дефекты в отчете средства проверки статического драйвера, щелкните "Дефект" в области результатов . Откроется средство просмотра трассировки, отображающее трассировку пути кода к нарушению правила. Дополнительные сведения см. в разделе "Интерпретация результатов проверки статического драйвера".
Примечание.
Средство проверки статических драйверов сохраняет результаты и параметры из анализа. Чтобы очистить результаты, нажмите кнопку "Очистить".
Устранение неполадок результатов проверки статических драйверов
Если SDV сообщает, что дефекты не найдены, проверьте вкладку Main , чтобы убедиться, что точки входа обнаружены. Если драйвер не объявляет функции с помощью типов ролей функций, SDV не сможет анализировать и находить дефекты в коде драйвера. Дополнительные сведения см. в разделе Использование объявлений типов ролей функции.
Если SDV сообщает о тайм-аутах или не возвращает полезные результаты, возможно, вам потребуется изменить несколько параметров конфигурации SDV. Дополнительные сведения об устранении неполадок с SDV см. в рекомендациях по устранению неполадок с проверкой статических драйверов.
Связанные темы
Определение того, поддерживает ли средство проверки статических драйверов драйвер или библиотеку
Использование объявлений типов ролей функций