Поделиться через


Создание драйвера WDF для нескольких версий Windows

WDF всегда позволял вам один раз создать драйвер и использовать полученный двоичный файл на нескольких версиях Windows, но до версии Windows 10 1803 (Redstone 4) это было ограничено принципом "сборка на старой версии, запуск на новой". Начиная с Windows 10 версии 1803, WDF добавляет возможность "сборка на новой версии, запуск на старой" с дополнительным преимуществом условного выполнения. Подведение итогов.

  • Существующие: двоичные файлы, созданные с более старыми версиями платформы, выполняются в версиях Windows, включающих более новые версии платформы, при условии соответствия основных версий. Например, драйвер, созданный с помощью KMDF 1.9 (Windows 7), работает в системе Windows 8 (KMDF 1.11). В этом примере драйвер ограничен функциональными возможностями KMDF 1.9.
  • добавлена: начиная с KMDF версии 1.25 и UMDF версии 2.25 на Windows 10 версии 1803, можно создать драйвер с более новой версией платформы и результирующий двоичный файл драйвера работает на более ранних версиях Windows (по крайней мере на Windows 10 версии 1803). Кроме того, драйвер может условно использовать функциональные возможности, доступные только в более новых версиях платформы.

Это означает, что ваш драйвер работает не только на будущих версиях Windows, как это было всегда, но и на прошлых версиях, вплоть до Windows 10 версии 1803.

Для этого необходимо выполнить два шага: указание параметров сборки в Visual Studio и проверка среды выполнения перед вызовом API или доступом к структуре или полю, которые могут или не присутствовать.

Примечание. Эта функция является необязательной, и драйвер должен включить её только для создания драйвера, использующего последнюю функциональность WDF, при этом оставаясь загружаемым на более ранних версиях Windows, которые не поддерживают последнюю функциональность WDF.

Если вы не установите Минорную Версию (Целевая версия) или Минорную Версию (Минимально требуемая), управление версиями останется прежним.

Указание минимально необходимого

Новые параметры конфигурации в Visual Studio:

  • Версия Minor KMDF (минимально необходимая)
  • Минорная версия UMDF (минимально необходимая)

В соответствии с этим изменением имена двух существующих параметров были обновлены:

  • младшая версия KMDF ->младшая версия KMDF (целевая версия)
  • Минорная версия UMDF ->Минорная версия UMDF (целевая версия)

Если вы не настроили минимальный обязательный, Visual Studio создает сборки для целевой версии и более поздних версий и не предоставляет поддержку нижнего уровня. Это соответствует поведению старых свойств версии Minor.

Если задать минимально необходимый , применяются следующие требования:

  • 25 <= минимальная требуемая <= целевая версия
  • В свойствах конфигурации,>параметры драйвера,>общие, задайте параметру _NT_TARGET_VERSION значение 0x0A000005 (RS4) или более поздней версии.

Проверка наличия функциональных возможностей

Перед каждым использованием API, структуры или члена, который может или не присутствовать, необходимо вызвать один из следующих макросов, определенных в WdfFuncEnum.h:

BOOLEAN
WDF_IS_FUNCTION_AVAILABLE (
    FunctionName
    );

BOOLEAN
WDF_IS_STRUCTURE_AVAILABLE (
    StructName
    );

BOOLEAN
WDF_IS_FIELD_AVAILABLE (
    StructName,
    FieldName
    );

Рассмотрим следующий пример. При выпуске WDF версии 29 он добавляет новый API: WdfSomeNewFeature. Если целевая версия установлена на 29, а минимальная требуемая версия на 25, результирующий драйвер загружается на любую версию платформы от 25 до 29 (и более поздние версии, если основная версия не изменяется), вызывает API версии 25 как раньше, и выполняет следующую проверку перед каждым вызовом API версии 29:

if (WDF_IS_FUNCTION_AVAILABLE(WdfSomeNewFeature)) {
    WdfSomeNewFeature();
}

Если вы не выполняете условную проверку, может появиться следующее:

  • Если API возвращает NTSTATUS, вызов возвращает код сбоя.
  • Если API возвращает что-либо, отличное от NTSTATUS:
    • KMDF: проверка ошибок компьютера.
    • UMDF: процесс WudfHost завершает работу с ошибкой DriverStop.
  • Если средство проверки драйверов включено, драйвер также завершает работу. Это помогает определить проблему в тестовой среде.
  • Незаметное повреждение памяти (при доступе к структуре или полю).

Сбой драйвера содержит имя неисправного драйвера, имя фреймворка и индекс сбоя API. Имя API можно получить, выполнив поиск значения WDFFUNCENUM в WdfFuncEnum.h.

Дополнительные сведения о свойствах Visual Studio для WDF см. в разделе Свойства параметров модели драйверов для проектов драйверов.