ユニバーサル Hello World ドライバー (KMDF) の作成

このトピックでは、カーネルモード ドライバー フレームワーク (KMDF) を使ってユニバーサル Windows ドライバーを作成する方法について説明します。Microsoft Visual Studio テンプレートを使って開始し、別のコンピューターにドライバーを展開してインストールします。

最初に、Visual Studio 2015 と Windows Driver Kit (WDK) 10 がインストールされていることを確認します。これらは、Windows ハードウェア デベロッパー センターからダウンロードできます。

Debugging Tools for Windows は、WDK のインストールに含まれています。

ドライバー パッケージの作成とビルド

  1. Microsoft Visual Studio を開きます。[ファイル] メニューで、[新規]、[プロジェクト] の順にクリックします。

  2. [新しいプロジェクト] ダイアログ ボックスで、[WDF] をクリックします。

  3. 中央のウィンドウで、[Kernel Mode Driver, Empty (KMDF)] (カーネル モード ドライバー, 空 (KMDF)) をクリックします。

  4. [名前] フィールドに、プロジェクト名として「KmdfHelloWorld」と入力します。

      *新しい KMDF ドライバーか UMDF ドライバーを作成する場合、32 文字以下のドライバー名を選ぶ必要があります。この長さの制限は、wdfglobals.h で定義されています。

     

  5. "場所" フィールドに、新規プロジェクトを作るディレクトリを入力します。

  6. [ソリューションのディレクトリを作成] チェック ボックスをオンにします。[OK] をクリックします。

    [新しいプロジェクト] ダイアログ ボックスのスクリーン ショット

    Visual Studio により、1 つのプロジェクトと 1 つのソリューションが作られます。これらは、次に示すように、[ソリューション エクスプローラー] ウィンドウに表示されます ([ソリューション エクスプローラー] ウィンドウが表示されていない場合は、[表示] メニューの [ソリューション エクスプローラー] をクリックします)。ソリューションには、KmdfHelloWorld という名前のドライバー プロジェクトがあります。

    [ソリューション エクスプローラー] ウィンドウのスクリーン ショット (パッケージ プロジェクト (KmdfHelloWorld Packages) と空のドライバー プロジェクト (KmdfHelloWorld) を表示した状態)

  7. [ソリューション エクスプローラー] ウィンドウで、[KmdfHelloWorld] を右クリックして、[プロパティ] をクリックします。 [構成プロパティ]、[ドライバーの設定]、[全般] の順に移動し、[ターゲット プラットフォーム] が既定で [ユニバーサル] に設定されていることを確認します。

  8. [ソリューション エクスプローラー] ウィンドウで、[KmdfHelloWorld] を右クリックして、[追加]、[新しい項目] の順にクリックします。

  9. [新しい項目の追加] ダイアログ ボックスで、[C++ File] (C++ ファイル) をクリックします。[名前] に「Driver.c」と入力します。

      ファイル名拡張子は、.cpp ではなく .c です。

     

    [追加] をクリックします。次に示すように、Driver.c ファイルが [ソース ファイル] の下に追加されます。

    [ソリューション エクスプローラー] ウィンドウのスクリーン ショット (ドライバー プロジェクトに Driver.c ファイルが追加された状態)

  10. Driver.c ファイルを開き、次のコードを入力します。

    
    #include <ntddk.h>
    #include <wdf.h>
    DRIVER_INITIALIZE DriverEntry;
    EVT_WDF_DRIVER_DEVICE_ADD KmdfHelloWorldEvtDeviceAdd;
    
    NTSTATUS DriverEntry(_In_ PDRIVER_OBJECT  DriverObject, _In_ PUNICODE_STRING RegistryPath)
    {
        NTSTATUS status;
        WDF_DRIVER_CONFIG config;
    
        KdPrintEx(( DPFLTR_IHVDRIVER_ID, DPFLTR_INFO_LEVEL, "KmdfHelloWorld: DriverEntry\n" ));
        WDF_DRIVER_CONFIG_INIT(&config, KmdfHelloWorldEvtDeviceAdd);
        status = WdfDriverCreate(DriverObject, RegistryPath, WDF_NO_OBJECT_ATTRIBUTES, &config, WDF_NO_HANDLE);
        return status;
    }
    
    NTSTATUS KmdfHelloWorldEvtDeviceAdd(_In_ WDFDRIVER Driver, _Inout_ PWDFDEVICE_INIT DeviceInit)
    {
        NTSTATUS status;
        WDFDEVICE hDevice;
        UNREFERENCED_PARAMETER(Driver);
    
        KdPrintEx(( DPFLTR_IHVDRIVER_ID, DPFLTR_INFO_LEVEL, "KmdfHelloWorld: KmdfHelloWorldEvtDeviceAdd\n" ));
        status = WdfDeviceCreate(&DeviceInit, WDF_NO_OBJECT_ATTRIBUTES, &hDevice);
        return status;
    }
    
  11. Driver.c を保存します。

  12. [ソリューション エクスプローラー] ウィンドウで、[ソリューション 'KmdfHelloWorld' (1 件のプロジェクト)] を右クリックして [構成マネージャー] をクリックします。ドライバー プロジェクトとパッケージ プロジェクトの両方に対する構成とプラットフォームを選びます。この作業では、Debug と x64 を選びます。

  13. [ソリューション エクスプローラー] ウィンドウで、[KmdfHelloWorld] を右クリックして、[プロパティ] をクリックします。[Wpp トレース]、[すべてのオプション] で、[Wpp トレースの実行][いいえ] に設定します。[適用] をクリックし、[OK] をクリックします。

  14. ドライバーをビルドし、ドライバー パッケージを作るには、[ビルド] メニューの [ソリューションのビルド] をクリックします。Visual Studio の [出力] ウィンドウにビルドの進行状況が表示されます ([出力] ウィンドウが表示されていない場合は、[表示] メニューの [出力] をクリックします)。

    ソリューションのビルドが成功したことを確認したら、Visual Studio を閉じることができます。

  15. ビルドされたドライバーを確認するには、エクスプローラーで [KmdfHelloWorld] フォルダーに移動し、[C:\KmdfHelloWorld\x64\Debug] に移動します。フォルダーには以下が含まれています。

    • KmdfHelloWorld.sys -- カーネル モード ドライバー ファイル
    • KmdfHelloWorld.inf -- ドライバーをインストールするときに Windows で使われる情報ファイル
    • KmdfHelloWorld.cat -- ドライバー パッケージのテスト署名を検証するときにインストーラーで使われるカタログ ファイル

ドライバーの展開とインストール

通常、ドライバーのテストと展開には、デバッガーとドライバーがそれぞれ別のコンピューター上で実行されます。デバッガーを実行するコンピューターをホスト コンピューター、ドライバーを実行するコンピューターをターゲット コンピューターと呼びます。ターゲット コンピューターはテスト コンピューターとも呼ばれます。

ここまでは、ホスト コンピューター上の Visual Studio を使ってドライバーのビルドを行いました。次にターゲット コンピューターの構成が必要です。「ドライバーの展開およびテストのためのコンピューターのプロビジョニング (WDK 10)」の手順に従ってください。その後で、ドライバーの展開、インストール、読み込み、デバッグを行います。

  1. ホスト コンピューター上で、Visual Studio でソリューションを開きます。KmdfHelloWorld フォルダーにあるソリューション ファイル (KmdfHelloWorld.sln) をダブルクリックしてソリューションを開くこともできます。

  2. [ソリューション エクスプローラー] ウィンドウで、[KmdfHelloWorld] プロジェクトを右クリックして、[プロパティ] をクリックします。

  3. 次に示すように、[KmdfHelloWorld プロパティ ページ] ウィンドウで、[構成プロパティ]、[ドライバーのインストール]、[展開] の順に移動します。

  4. [展開前にドライバーの以前のバージョンを削除する] チェック ボックスをオンにします。

  5. [Target Device Name (ターゲット デバイス名)] については、テストとデバッグ用に構成したコンピューターの名前を選んでください。この作業では、MyTestComputer というコンピューターを使います。

  6. [ハードウェア ID のドライバーの更新] をクリックして、ドライバーのハードウェア ID を入力します。この例では、ハードウェア ID は Root\KmdfHelloWorld です。[OK] をクリックします。

    [KmdfHelloWorld Package プロパティ ページ] ウィンドウのスクリーン ショット ([ドライバーのインストール] と [展開] が選ばれた状態)  この作業のハードウェア ID は特定のハードウェアを識別するものではありません。デバイス ツリー上でルート ノードの子として設定される架空のデバイスを表します。実際のハードウェアについては、[Hardware ID Driver Update] (ハードウェア ID のドライバーの更新) ではなく、[Install and Verify] (インストールと確認) をクリックします。

    ハードウェア ID は、ドライバーの情報ファイル (INF) に記載されています。[ソリューション エクスプローラー] ウィンドウで、[KmdfHelloWorld] の [ドライバー ファイル] に移動し、KmdfHelloWorld.inf をダブルクリックします。ハードウェア ID は [Standard.NT$ARCH$] の下に記載されています。

    [Standard.NT$ARCH$]
    %KmdfHelloWorld.DeviceDesc%=KmdfHelloWorld_Device, Root\KmdfHelloWorld
    

     

  7. [デバッグ] メニューの [デバッグ開始] をクリックするか、キーボードで F5 キーを押します。

  8. Visual Studio では、最初に [出力] ウィンドウに進行状況が表示されます。次に、[デバッガー イミディエイト] ウィンドウが開き、引き続き進行状況が表示されます。

    ドライバーがターゲット コンピューターに展開、インストールされ、読み込まれるまで待機します。この処理は、1 ~ 2 分かかる場合があります。

  9. [デバッグ] メニューの [すべて中断] をクリックします。ホスト コンピューター上のデバッガーが、ターゲット コンピューターに割り込みます。[DEBUGGER IMMEDIATE WINDOW] (デバッガー イミディエイト ウィンドウ) に、カーネルのデバッグ コマンド プロンプト kd> が表示されます。

    [DEBUGGER IMMEDIATE WINDOW] (デバッガー イミディエイト ウィンドウ) のコマンド プロンプトのスクリーン ショット

  10. この段階で、kd> プロンプトに対してコマンドを入力することにより、デバッガーの操作を試してみることができます。たとえば、次のようなコマンドを試すことができます。

  11. ターゲット コンピューターを再び実行するには、[デバッグ] メニューの [続行] をクリックします。

  12. デバッグ セッションを停止するには、[デバッグ] メニューの [デバッグの停止] をクリックします。

関連トピック

ドライバーの開発、テスト、および展開

Debugging Tools for Windows

初めてのドライバーの作成