KMDF ドライバーを UMDF 2 ドライバーに (およびその逆に) 変換する方法

このトピックでは、カーネル モード ドライバー フレームワーク (KMDF) ドライバーをユーザー モード ドライバー フレームワーク (UMDF) バージョン 2 ドライバーに変換する方法、およびその逆について説明します。

Visual Studio を使用したドライバー変換

  1. KMDF から UMDF に切り替える場合は、 User Mode Driver, Empty (UMDF V2)プロジェクト テンプレートを使用してVisual Studio で空の UMDF プロジェクトを作成します。 UMDF から KMDF に切り替える場合は、 Kernel Mode Driver, Empty (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 の場合は、How to enable Inflight Trace Recorder in Visual Studioの説明に従って、WPP_MACRO_USE_KM_VERSION_FOR_UM=1も追加する必要があることに注意してください。

    • ExAllocatePoolWithTagなどのWDM ルーチンを呼び出す KMDF ドライバーを変換する場合は、WdfMemoryCreateなどの対応する WDF メソッドに置き換えます。 同様に、ユーザー モード関数を呼び出す UMDF ドライバーを変換する場合は、これらを同等のカーネル モード ルーチンに置き換えます。

    • KMDF でのみサポートされるメソッドもあれば、UMDF でのみサポートされるメソッドもあります。 すべての Windows Driver Framework (WDF) メソッドのリストとそのフレームワークの適用性については、 Summary of WDF Callbacks and Methodsをご参照ください。