Создание драйвера 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:

  • Дополнительный номер версии KMDF (минимальный обязательный)
  • Дополнительный номер версии UMDF (минимальный обязательный)

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

  • Дополнительный номер версии KMDF ->дополнительный номер версии KMDF (целевая версия)
  • UMDF Version Minor ->UMDF Version Minor (Target Version)

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

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

  • 25 <= минимальная обязательная <= целевая версия
  • В разделе Свойства конфигурации—>Параметры драйвера—>Общие задайте значение _NT_TARGET_VERSION0x0A000005 (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 см. в разделе Свойства параметров модели драйвера для проектов драйверов.