Поддерживаемые драйверы
Чтобы sdV проверял драйвер, он должен интерпретировать код драйвера, в частности точки входа драйвера и код в функциях и подпрограммах, поддерживающих необходимые функции драйвера.
В следующих разделах описываются основные требования для драйверов и конкретный синтаксис, который SDV ожидает от проверенных драйверов. SDV не проверяет, соответствуют ли драйверы этим требованиям, но если драйвер не соответствует требованиям, SDV может не выполняться и в редких ситуациях он сообщает о ложноположительных или ложных отрицательных результатах из-за неправильной интерпретации.
Внимание
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 и проверка логотипа статических инструментов.
Основные характеристики драйвера
SDV может проверить только драйверы со следующими характеристиками:
SDV проверяет драйверы и библиотеки, написанные на C и C++.
SDV выполняет полную проверку только для драйверов устройств, совместимых с KMDF и WDM (драйверы функций, драйверы фильтров и шины), драйверы NDIS (фильтры, минипорт и драйверы протокола), а также драйверы Storport.
SDV пытается выполнить ограниченную проверку универсальных свойств (например , NullCheck) на драйверах, которые не соответствуют приведенным выше категориям.
SDV может проверить драйверы WDM, объявляющие их функции обратного вызова драйвера с помощью типов ролей функций WDM. Сведения о том, как объявлять функции, см. в разделе "Объявление функций" с помощью типов ролей функций для драйверов WDM.
SDV может проверить драйверы, созданные из платформы Driver Framework в режиме ядра, если вы объявляете каждую функцию обратного вызова с помощью типа функции обратного вызова SDV-KMDF. Дополнительные сведения см. в разделе "Объявление функций с помощью типов ролей функций для драйверов KMDF".
SDV может проверить драйверы NDIS, если вы заметите каждую функцию обратного вызова с объявлением функции с помощью типа функции обратного вызова SDV-NDIS. Дополнительные сведения см. в разделе "Объявление функций с помощью типов ролей функций для драйверов NDIS".
SDV может проверить драйверы Storport, если вы заметите каждую функцию обратного вызова с объявлением функции. Для этого используется тип функции обратного вызова SDV-Storport. Дополнительные сведения см. в разделе "Объявление функций с помощью типов ролей функций для драйверов Storport".
Основные требования к драйверу
Чтобы проверить драйвер WDM, драйвер должен:
Включить Wdm.h или Ntddk.h (Wdm.h — это подмножество ntddk.h).
Создайте объекты устройства с помощью методов, описанных в разделе "Введение в объекты устройства" и приведенные ниже.
У вас есть подпрограмма выгрузки, написанная как рекомендуется при написании подпрограммы выгрузки.
Объявите каждую функцию диспетчера с помощью объявления типа роли функции, описанного в разделе "Использование объявлений типов ролей функции". Сведения о типах ролей WDM и заметках _Dispatch_type_ (тип) см. в разделе "Объявление функций с использованием типов ролей функций для драйверов WDM".
Чтобы проверить драйвер KMDF, драйвер должен:
Включите Wdf.h и Ntddk.h.
Создайте объекты KMDF, описанные в разделе "Использование платформы для разработки драйвера".
Заметите каждую функцию обратного вызова с помощью типа функции обратного вызова SDV-KMDF, описанную в разделе "Использование объявлений типов ролей функции". Список поддерживаемых типов ролей см . в объявлениях функций KMDF средства проверки статических драйверов.
Чтобы проверить драйвер NDIS, драйвер должен:
Включите Ndis.h и Ntddk.h.
Следуйте инструкциям в руководстве по проектированию сети, чтобы создать драйверы NDIS.
Заметите каждую функцию обратного вызова с помощью типа функции обратного вызова SDV-NDIS, как описано в разделе "Использование объявлений типов ролей функции". Список поддерживаемых типов ролей см . в объявлениях функций NDIS для проверки статических драйверов.
Кроме того, SDV может проверить драйверы, поддерживающие:
Инструментарий управления Windows (WMI).
Зарезервированные имена функций
Подсистема проверки SDV не работает должным образом, если код драйвера или библиотеки использует те же шаблоны функций, что и SDV, которые используются внутренне.
В частности, SDV неправильно интерпретирует код, если:
Код содержит имена функций, которые начинаются с __init и за которыми следует одно или несколько целых чисел, например __init123.
Код содержит имена функций, которые начинаются с sdv_, например sdv_Func, или включают строку _sdv_, например Func_sdv_ или Func_sdv_foo.
Библиотека использует
.def
файл для переименования экспортируемой функции, а внешнее имя совпадает с именем другой статической функции в библиотеке.
Если код драйвера или код библиотеки включает эти элементы, SDV пытается проверить драйвер или обработать библиотеку, но результат не поддерживается функцией (NSF). Дополнительные сведения о результатах SDV см. в разделе "Интерпретация результатов проверки статических драйверов".