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


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

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

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

  1. При переходе с KMDF на UMDF создайте пустой проект UMDF в Visual Studio, используя шаблон проекта "Драйвер пользовательского режима, пустой (UMDF версии 2)". При переходе с UMDF на KMDF создайте пустой проект KMDF в Visual Studio, используя шаблон проекта "Kernel Mode Driver, Empty (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, как описано в разделе "Как включить средство записи трассировки Inflight в Visual Studio".

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

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