Проверка драйверов Windows

Используйте средства InfVerif, Проверки изоляции драйверов и ApiValidator, чтобы проверить пакет драйверов на соответствие требованиям к драйверам Windows, описанным в разделе начало работы с драйверами Windows.

InfVerif

InfVerif — это средство, которое проверяет синтаксис INF и соответствие INF требованиям и ограничениям.

Используйте InfVerif с /w и /v , чтобы убедиться, что драйвер Windows:

Дополнительные сведения см. в разделе Запуск InfVerif из командной строки.

Нацеливание на текущую и более ранние версии Windows

Каждый запуск InfVerif проверяет один набор правил, например /w (совместимость драйверов Windows) или /k (отправка в Центр разработки оборудования). Если inf содержит синтаксис, представленный в более поздней версии Windows, и вы также хотите использовать предыдущие версии Windows, используйте оформление INF для пометки записей INF для конкретной версии, а затем запустите InfVerif несколько раз, например:

infverif /k <INF file>
infverif /w /wbuild NTAMD64.10.0.0.<build number where w is a requirement> <INF file>

Если ошибок нет, INF-файл соответствует требованию к изоляции пакета драйверов Windows.

Например, директива INF AddEventProvider доступна начиная с Windows 10, версия 1809. Чтобы использовать эту директиву в INF-файле, предназначенном для версии ОС до Windows 10, версия 1809, украсите раздел установки с помощью устаревшего синтаксиса INF для регистрации поставщиков событий трассировки событий Windows, а также раздел установки с использованием обновленного синтаксиса.

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

Проверка драйверов Проверка изоляции драйверов

Чтобы квалифицироваться как драйвер Windows, пакет драйверов должен соответствовать требованиям к изоляции пакета драйвера . Начиная с Windows 11, средство проверки драйверов (DV) может отслеживать двоичные файлы ядра для операций чтения и записи реестра, которые не разрешены для изолированных пакетов драйверов.

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

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

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

verifier /rc 33 36 /driver myDriver.sys

Чтобы проверка несколько драйверов, разделите имена каждого драйвера пробелом:

verifier /rc 33 36 /driver myDriver1.sys myDriver2.sys

Чтобы настроить DV для проверки ошибок при нарушении, используйте следующий синтаксис:

verifier /onecheck /rc 33 36 /driver myDriver1.sys

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

shutdown /r /t 0

Ниже приведено несколько примеров сообщений об ошибках.

Пример . ZwCreateKey предоставляет полный абсолютный путь:

DRIVER_ISOLATION_VIOLATION: <driver name>: Registry operations should not use absolute paths. Detected creation of unisolated registry key \Registry\Machine\SYSTEM

Пример . ZwCreateKey предоставляет путь относительно дескриптора, который не является утвержденным API:

DRIVER_ISOLATION_VIOLATION: <driver name>: Registry operations should only use key handles returned from WDF or WDM APIs. Detected creation of unisolated registry key \REGISTRY\MACHINE\SYSTEM\SomeKeyThatShouldNotExist

Рассмотрите возможность запуска тестов "Основы устройства " с включенными проверками изоляции драйвера DV в драйвере, чтобы помочь перехватывать нарушения изоляции драйвера на ранних этапах.

Драйверы KMDF

Когда драйверы KMDF используют API WDF для доступа к реестру, например WdfRegistryCreateKey, WdfRegistryOpenKey или WdfRegistryQueryValue, доступ к реестру осуществляется через wdf01000.sys, а не через двоичный файл драйвера KMDF напрямую. Чтобы просмотреть нарушения, вызванные двоичным файлом драйвера KMDF, включите проверки изоляции драйвера на wdf01000.sys в дополнение к двоичному файлу драйвера KMDF. Обратите внимание, что при этом вы увидите нарушения со всех драйверов KMDF в системе, которые используют WDF для доступа к реестру.

ApiValidator

Средство ApiValidator проверяет, допустимы ли API-интерфейсы, вызываемые двоичными файлами, для драйвера Windows. Средство возвращает ошибку, если двоичные файлы вызывают API, который находится за пределами набора допустимых API для драйверов Windows. Это средство входит в состав WDK для Windows 10.

ApiValidator проверяет, поддерживает ли драйвер наложение API, что является одним из требований для драйверов Windows. Полный список требований см. в разделе начало работы с драйверами Windows.

Запуск ApiValidator в Visual Studio

Если для свойства Целевая платформа проекта драйвера задано значение Драйвер Windows, Visual Studio автоматически запускает ApiValidator в качестве шага после сборки.

Чтобы просмотреть все сообщения, отображаемые ApiValidator, перейдите в меню Сервис-Параметры-Проекты>> и Решения-Сборка> и запуск и задайте для параметра Подробный уровень детализации выходных данных сборки проекта MSBuild. При сборке из командной строки добавьте параметр /v:detailed или /v:diag в команду сборки, чтобы повысить уровень детализации.

Для примера драйвера umdf2_fx2 ошибки проверки API выглядят следующим образом:

Warning  1   warning : API DecodePointer in kernel32.dll is not supported. osrusbfx2um.dll calls this API.   C:\Program Files (x86)\Windows Kits\10\src\usb\umdf2_fx2\driver\ApiValidator.exe    osrusbfx2um
Warning 2   warning : API DisableThreadLibraryCalls in kernel32.dll is not supported. osrusbfx2um.dll calls this API.   C:\Program Files (x86)\Windows Kits\10\src\usb\umdf2_fx2\driver\ApiValidator.exe    osrusbfx2um
Warning 3   warning : API EncodePointer in kernel32.dll is not supported. osrusbfx2um.dll calls this API.   C:\Program Files (x86)\Windows Kits\10\src\usb\umdf2_fx2\driver\ApiValidator.exe    osrusbfx2um
Warning 4   warning : API GetCurrentProcessId in kernel32.dll is not supported. osrusbfx2um.dll calls this API. C:\Program Files (x86)\Windows Kits\10\src\usb\umdf2_fx2\driver\ApiValidator.exe    osrusbfx2um
Warning 5   warning : API GetCurrentThreadId in kernel32.dll is not supported. osrusbfx2um.dll calls this API.  C:\Program Files (x86)\Windows Kits\10\src\usb\umdf2_fx2\driver\ApiValidator.exe    osrusbfx2um
Warning 6   warning : API GetSystemTimeAsFileTime in kernel32.dll is not supported. osrusbfx2um.dll calls this API. C:\Program Files (x86)\Windows Kits\10\src\usb\umdf2_fx2\driver\ApiValidator.exe    osrusbfx2um
Warning 7   warning : API IsDebuggerPresent in kernel32.dll is not supported. osrusbfx2um.dll calls this API.   C:\Program Files (x86)\Windows Kits\10\src\usb\umdf2_fx2\driver\ApiValidator.exe    osrusbfx2um
Warning 8   warning : API IsProcessorFeaturePresent in kernel32.dll is not supported. osrusbfx2um.dll calls this API.   C:\Program Files (x86)\Windows Kits\10\src\usb\umdf2_fx2\driver\ApiValidator.exe    osrusbfx2um
Warning 9   warning : API QueryPerformanceCounter in kernel32.dll is not supported. osrusbfx2um.dll calls this API. C:\Program Files (x86)\Windows Kits\10\src\usb\umdf2_fx2\driver\ApiValidator.exe    osrusbfx2um
Error   10  error MSB3721: The command ""C:\Program Files (x86)\Windows Kits\10\bin\x64\ApiValidator.exe" -DriverPackagePath:"C:\Program Files (x86)\Windows Kits\10\src\usb\umdf2_fx2\Debug\\" -SupportedApiXmlFiles:"C:\Program Files (x86)\Windows Kits\10\build\universalDDIs\x86\UniversalDDIs.xml" -ApiExtractorExePath:"C:\Program Files (x86)\Windows Kits\10\bin\x64"" exited with code -1.    C:\Program Files (x86)\Windows Kits\10\build\WindowsDriver.common.targets   1531    5   osrusbfx2um

Исправление ошибок проверки

  1. Если вы переключили устаревший классический проект драйвера UMDF на Драйвер Windows, убедитесь, что вы включили правильные библиотеки при создании двоичных файлов. Выберите и удерживайте (или щелкните правой кнопкой мыши) проект и выберите свойства. Перейдите в раздел Компоновщик-входные> данные. Дополнительные зависимости должны содержать:

    %AdditionalDependencies);$(SDK_LIB_PATH)\OneCoreUAP.lib
    

    Дополнительные сведения о других параметрах компоновщика для нацеливания OneCore SKU см. в статье Сборка для OneCore.

  2. Удалите или замените вызовы API, которые не разрешены по одному, и повторно запустите средство, пока не возникнет ошибок.

  3. В некоторых случаях эти вызовы можно заменить альтернативными DDI, которые перечислены на страницах ссылок для DDI, доступного только для настольных компьютеров. Возможно, вам придется назначить обходной путь, если нет подходящей замены. При необходимости напишите новый драйвер Windows, начиная с шаблонов драйверов в WDK.

Если вы видите ошибки, подобные приведенным ниже, ознакомьтесь с руководством в статье Сборка для OneCore.

ApiValidation: Error: FlexLinkTest.exe has a dependency on 'wtsapi32.dll!WTSEnumerateSessionsW' but is missing: IsApiSetImplemented("ext-ms-win-session-wtsapi32-l1-1-0")
ApiValidation: Error: FlexLinkTest.exe has a dependency on 'wtsapi32.dll!WTSFreeMemory' but is missing: IsApiSetImplemented("ext-ms-win-session-wtsapi32-l1-1-0")
ApiValidation: NOT all binaries are Universal

Запуск ApiValidator из командной строки

Вы также можете запустить Apivalidator.exe из командной строки. В установке WDK перейдите к C:\Program Files (x86)\Windows Kits\10\bin<arch> и C:\Program Files (x86)\Windows Kits\10\build\universalDIs<arch>.

Важные примечания.

  • Для ApiValidator требуются следующие файлы: ApiValidator.exe, Aitstatic.exe, Microsoft.Kits.Drivers.ApiValidator.dll и UniversalDDIs.xml.
  • UniversalDDIs.xml должен соответствовать проверяемой двоичной архитектуре, например для драйвера x64 используйте x64 UniversalDDI.xml
  • ApiValidator тестирует только одну архитектуру за раз
  • Дополнительные сведения см. в разделе Известные проблемы с ApiValidator ниже.

Используйте следующий синтаксис:

Apivalidator.exe -DriverPackagePath: <driver folder path> -SupportedApiXmlFiles: (path to XML files containing supported APIs for Windows drivers)

Например, чтобы проверить API, вызванные примером действия в WDK, сначала выполните сборку примера в Visual Studio. Затем откройте командную строку и перейдите в каталог, содержащий средство, например C:\Program Files (x86\Windows Kits\10\bin\x64. Введите следующую команду:

apivalidator.exe -DriverPackagePath:"C:\Program Files (x86)\Windows Kits\10\src\usb\umdf2\_fx2\Debug" -SupportedApiXmlFiles:"c:\Program Files (x86)\Windows Kits\10\build\universalDDIs\x64\UniversalDDIs.xml"

Команда выводит следующие выходные данные:

ApiValidator.exe: Warning: API DecodePointer in kernel32.dll is not supported. osrusbfx2um.dll calls this API.
ApiValidator.exe: Warning: API DisableThreadLibraryCalls in kernel32.dll is not supported. osrusbfx2um.dll calls this API.
ApiValidator.exe: Warning: API EncodePointer in kernel32.dll is not supported. osrusbfx2um.dll calls this API.
ApiValidator.exe: Warning: API GetCurrentProcessId in kernel32.dll is not supported. osrusbfx2um.dll calls this API.
ApiValidator.exe: Warning: API GetCurrentThreadId in kernel32.dll is not supported. osrusbfx2um.dll calls this API.
ApiValidator.exe: Warning: API GetSystemTimeAsFileTime in kernel32.dll is not supported. osrusbfx2um.dll calls this API.
ApiValidator.exe: Warning: API IsDebuggerPresent in kernel32.dll is not supported. osrusbfx2um.dll calls this API.
ApiValidator.exe: Warning: API IsProcessorFeaturePresent in kernel32.dll is not supported. osrusbfx2um.dll calls this API.
ApiValidator.exe: Warning: API QueryPerformanceCounter in kernel32.dll is not supported. osrusbfx2um.dll calls this API.

ApiValidator.exe Driver located at C:\Program Files (x86)\Windows Kits\10\src\usb\umdf2_fx2\Debug is NOT a Universal Driver

Устранение неполадок с ApiValidator

Если ApiValidator.exe выводит ошибку неправильного формата, например:

Error      1              error : AitStatic output file has incorrect format or analysis run on incorrect file types.     C:\Program Files (x86)\Windows Kits\10\src\usb\umdf2_fx2\driver\ApiValidator.exe            osrusbfx2um

Используйте этот обходной путь:

  1. Откройте свойства проекта, перейдите в раздел Общие и переименуйте выходной каталог следующим образом:

    $(SolutionDir)$(Platform)\$(ConfigurationName)\
    
  2. Выполните повторную сборку решения.

Известные проблемы с ApiValidator

  • ApiValidator не выполняется в Arm64, так как AitStatic не работает в Arm64.
  • Двоичные файлы Arm64 можно тестировать на компьютерах x64, но не на компьютерах x86.
  • ApiValidator может выполняться на x86 для тестирования двоичных файлов x86 и двоичных файлов Arm.
  • ApiValidator может выполняться в x64 для тестирования двоичных файлов x86, x64, Arm и Arm64.