Преобразование драйвера KMDF в драйвер UMDF 2 (и наоборот)

В этом разделе описывается преобразование драйвера Kernel-Mode Driver Framework (KMDF) в драйвер User-Mode Driver Framework (UMDF) версии 2 и наоборот.

Преобразование драйверов с помощью Visual Studio

  1. При переключении с KMDF на UMDF создайте пустой проект UMDF в Visual Studio с помощью шаблона проекта Драйвер пользовательского режима, пустой (UMDF V2). При переключении с UMDF на KMDF создайте пустой проект KMDF в Visual Studio с помощью шаблона проекта Драйвер режима ядра, пустой (KMDF).

    Visual Studio создает пустой проект драйвера с соответствующими параметрами, а также INF-файл, предназначенный для указанной платформы.

  2. Скопируйте исходный код и файлы заголовков из предыдущего драйвера в новый проект.

  3. Обновите файлы заголовков. Для UMDF включите Windows.h. Для KMDF включите Ntddk.h. Wdf.h является общим для KMDF и UMDF, поэтому включите его в оба типа драйверов.

    При необходимости используйте макрос препроцессора _KERNEL_MODE , чтобы условно добавить правильный системный заголовок:

    #ifndef _KERNEL_MODE
    // This is a user-mode driver
    #include <windows.h>
    
    #else
    // This is a kernel-mode driver
    #include <ntddk.h>
    #define NTSTRSAFE_LIB
    #include <ntstrsafe.h>
    #endif
    
    // This is a common WDF header (for both KMDF and UMDF)
    #include <wdf.h> 
    
  4. Обновите исходный код, чтобы удалить или условно скомпилировать (с помощью макроса _KERNEL_MODE ) все функции, которые не поддерживаются в целевой модели драйвера. Пример:

    • Если драйвер использует трассировку WPP, обновите макрос WPP_INIT_TRACING . Этот макрос принимает различные параметры в пользовательском режиме и режиме ядра.

      WPP_INIT_TRACING ( DriverObject, RegistryPath ); // KMDF and UMDF 2
      WPP_INIT_TRACING ( “<MyDriverNameString>” ); // UMDF 1
      

      Обратите внимание, что для UMDF 2 также необходимо добавить WPP_MACRO_USE_KM_VERSION_FOR_UM=1, как описано в разделе Включение встроенной записи трассировки в Visual Studio.

    • При преобразовании драйвера KMDF, который вызывает подпрограммы WDM, такие как ExAllocatePoolWithTag, замените их соответствующими методами WDF, например WdfMemoryCreate. Аналогичным образом, при преобразовании драйвера UMDF, который вызывает функции пользовательского режима, замените их эквивалентными подпрограммами режима ядра.

    • Некоторые методы поддерживаются только в KMDF, а другие — только в UMDF. Список всех методов Windows Driver Framework (WDF) и их применимости см. в разделе Сводка по обратным вызовам и методам WDF.