テンプレートを使ったユニバーサル Windows ドライバー (KMDF) の作成

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

続行する前に、「Windows Driver Kit (WDK) のダウンロード」に記載されているインストール手順に従う必要があります。

Windows 用デバッグ ツールは、WDK をインストールするときに組み込まれます。

ドライバーの作成とビルド

  1. Microsoft Visual Studio を開く。 [ファイル] メニューで [新規] > [プロジェクト] を選択します。

  2. [新しいプロジェクトの作成] ダイアログ ボックスの左側のドロップダウンで [C++] を選択し、中央のドロップダウンで [Windows] を選択し、右側のドロップダウンで [ドライバー] を選択します。

  3. プロジェクトの種類の一覧から [Kernel Mode Driver (KMDF)]\(カーネル モード ドライバー (KMDF)\) を選択します。 [次へ] を選択します。

    Screen shot of the new project dialog box, showing kernel mode driver selected.

  4. [新しいプロジェクトの構成] ダイアログ ボックスで、[プロジェクト名] フィールドに「KmdfDriver」と入力します。

    Note

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

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

  6. [ソリューションとプロジェクトを同じディレクトリに配置する] をオンにし、[作成] を選択します。

    Screen shot of the project configuration dialog box.

    Visual Studio により、1 つのプロジェクトと 1 つのソリューションが作成されます。 これらはソリューション エクスプローラー ウィンドウで確認できます。 ([ソリューション エクスプローラー] ウィンドウが表示されない場合は、[表示] メニューの [ソリューション エクスプローラー] を選択します)。このソリューションには、KmdfDriver という名前のドライバー プロジェクトがあります。 ドライバーのソース コードを表示するには、[ソース ファイル] の下にあるファイルのいずれかを開きます。 Driver.c と Device.c から始めることをお勧めします。

    Screen shot of solution explorer showing the files in the driver project.

  7. [ソリューション エクスプローラー] ウィンドウで、[KmdfDriver] を選択して長押し (または右クリック) し、[プロパティ] をクリックします。 [構成プロパティ] > [Driver Settings] (ドライバーの設定) > [全般] の順に移動します。[ターゲット プラットフォーム] が既定で [ユニバーサル] に設定されていることに注意してください。

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

    ビルド出力に次のものが含まれていることを確認します。

    >    Driver is 'Universal'.
    

    ソリューションが正常にビルドされたことを確認したら、Visual Studio を閉じることができます。

  9. ビルドされたドライバーを確認するには、エクスプローラーで [KmdfDriver] フォルダーに移動し、x64\Debug\KmdfDriver に移動します。 ディレクトリには、次のファイルが含まれています。

    • KmdfDriver.sys -- カーネルモード ドライバー ファイル
    • KmdfDriver.inf -- ドライバーのインストール時に Windows が使用する情報ファイル

ドライバーを展開する

ドライバーをテストしてデバッグする場合、通常はデバッガーとドライバーを別個のコンピューターで実行します。 デバッガーを実行するコンピューターはホスト コンピューターと呼ばれ、ドライバーを実行するコンピューターはターゲット コンピューターと呼ばれます。 ターゲット コンピューターはテスト コンピューターとも呼ばれます。 ドライバーのデバッグの詳細については、「Windows 用デバッグ ツール」を参照してください。

ここまでは、Visual Studio を使用してホスト コンピューター上でドライバーをビルドしました。 次に、ターゲット コンピューターを構成する必要があります。

  1. ドライバーの展開およびテストのためのコンピューターのプロビジョニング (WDK 10)」の手順に従ってください。

    ヒント

    ネットワーク ケーブルを使用してターゲット コンピューターを自動的にプロビジョニングする手順に従う場合は、ポートとキーをメモしておきます。 これらはデバッグ手順の後半で使用します。 この例では、ポートとして 50000 を使用し、キーとして 1.2.3.4 を使用します。

    実際のドライバーのデバッグ シナリオでは、KDNET によって生成されたキーを使用することをお勧めします。 KDNET を使用してランダム キーを生成する方法の詳細については、「ドライバーのデバッグ - ステップ バイ ステップ ラボ (Sysvad カーネル モード)」のトピックを参照してください。

  2. ホスト コンピューターで、Visual Studio でソリューションを開きます。 KmdfDriver フォルダー内のソリューション ファイル (KmdfDriver.sln) をダブルクリックできます。

  3. [ソリューション エクスプローラー] ウィンドウで、[KmdfDriver] プロジェクトを選択して長押し (または右クリック) し、[プロパティ] をクリックします。

  4. KmdfDriver パッケージのプロパティ ページ ウィンドウの左ペインで、[構成プロパティ] > [Driver Install] (ドライバーのインストール) > [Deployment] (展開) の順に移動します。

  5. [デプロイ前に以前のドライバー バージョンを削除する] にチェックを入れます。

  6. [リモート コンピューター名] で、テストとデバッグ用に構成したコンピューターの名前を選択します。 この演習では、MyTestComputer という名前のコンピューターを使用します。

  7. [Hardware ID Driver Update] (ハードウェア ID のドライバーの更新) を選択し、ドライバーのハードウェア ID を入力します。 この作業のハードウェア ID は Root\KmdfDriver です。 [OK] を選択します。

    screen shot of the kmdfdriver package property pages window, showing deployment driver install selected

    Note

    この演習のハードウェア ID は実際のハードウェアを識別するものではありません。 これは、ルート ノードの子としてデバイス ツリー内の場所が与えられる架空のデバイスを識別します。 実際のハードウェアの場合は、[Hardware ID Driver Update] (ハードウェア ID のドライバーの更新) を選択しないでください。代わりに、[インストールと検証] を選択します。 ハードウェア ID は、ドライバーの情報 (INF) ファイルで確認できます。 [ソリューション エクスプローラー] ウィンドウで、[KmdfDriver] > [Driver Files] (ドライバー ファイル) の順に移動し、KmdfDriver.inf をダブルクリックします。 ハードウェア ID は [Standard.NT$ARCH$] の下に記載されています。

    [Standard.NT$ARCH$]
    %KmdfDriver.DeviceDesc%=KmdfDriver_Device, Root\KmdfDriver
    
  8. [ビルド] メニューの [ソリューションの配置] を選択します。 Visual Studio により、ドライバーのインストールと実行に必要なファイルがターゲット コンピューターに自動的にコピーされます。 この処理には 1 ~ 2 分かかる可能性があります。

    ドライバーを展開すると、ドライバー ファイルがテスト コンピューターの %Systemdrive%\drivertest\drivers フォルダーにコピーされます。 展開中に問題が発生した場合は、ファイルがテスト コンピューターにコピーされているかどうかを確認できます。 .inf、.cat、test cert、.sys など、必要なファイルがすべて %systemdrive%\drivertest\drivers フォルダーに存在することを確認します。

    ドライバーの展開の詳細については、「テスト コンピューターへのドライバーの展開」を参照してください。

ドライバーをインストールする

ターゲット コンピューターに KMDF ドライバーを展開したら、ドライバーをインストールします。 事前に Visual Studio で自動オプションを使用してターゲット コンピューターをプロビジョニングしている場合、Visual Studio により、プロビジョニング プロセスの一環としてテスト署名済みドライバーを実行するようにターゲット コンピューターが設定されます。 ここでは、DevCon ツールを使用してドライバーをインストールするだけです。

  1. ホスト コンピューターで、WDK インストールの [ツール] フォルダーに移動し、DevCon ツールを見つけます。 たとえば、次のフォルダー内を探します。

    C:\Program Files (x86)\Windows Kits\10\Tools\x64\devcon.exe

    DevCon ツールをリモート コンピューターにコピーします。

  2. ターゲット コンピューターで、ドライバー ファイルが含まれているフォルダーに移動し、DevCon ツールを実行してドライバーをインストールします。

    1. ドライバーのインストールに使用する devcon ツールの一般的な構文を次に示します。

      devcon install <INF ファイル><ハードウェア ID>

      このドライバーのインストールに必要な INF ファイルは KmdfDriver.inf です。 この INF ファイルには、ドライバーのバイナリ (KmdfDriver.sys) をインストールするためのハードウェア ID が含まれています。 INF ファイルにあるハードウェア ID が Root\KmdfDriver であることを思い出してください。

    2. 管理者として [コマンド プロンプト] ウィンドウを開きます。 ドライバー パッケージのフォルダーに移動し、このコマンドを入力します。

      devcon install kmdfdriver.inf root\kmdfdriver

      devcon が認識されないというエラー メッセージが表示される場合は、devcon ツールへのパスを追加してみてください。 たとえば、対象のコンピューター上の C:\Tools という名前のフォルダーにコピーする場合は、次のコマンドを使ってみてください。

      c:\tools\devcon install kmdfdriver.inf root\kmdfdriver

      テスト ドライバーが署名されていないドライバーであることを示すダイアログ ボックスが表示されます。 [かまわず続行] を選択して続行します。

      screenshot of driver installation warning.

ドライバーをデバッグする

ターゲット コンピューターに KMDF ドライバーをインストールしたら、ホスト コンピューターからリモートでデバッガーをアタッチします。

  1. ホスト コンピューターで、管理者として [コマンド プロンプト] ウィンドウを開きます。 WinDbg.exe ディレクトリに移動します。 Windows キットのインストールの一部としてインストールされた Windows Driver Kit (WDK) に含まれる WinDbg.exe の x64 バージョンを使用します。 WinDbg.exe の既定のパスを次に示します。

    C:\Program Files (x86)\Windows Kits\10\Debuggers\x64

  2. 次のコマンドを使用して、WinDbg を起動し、ターゲット コンピューター上のカーネル デバッグ セッションに接続します。 ポートとキーの値は、ターゲット コンピューターをプロビジョニングするために使用した値と同じである必要があります。 ここでは、ポートとして 50000、キーとして 1.2.3.4 を使用します。これらは展開の手順で使用した値です。 k フラグは、これがカーネル デバッグ セッションであることを示します。

    WinDbg -k net:port=50000,key=1.2.3.4

  3. [デバッグ] メニューの [Break] (中断) を選択します。 ホスト コンピューター上のデバッガーが、ターゲット コンピューターに割り込みます。 デバッガーのコマンド ウィンドウに、カーネルのデバッグ コマンド プロンプト kd> が表示されます。

  4. この時点で、kd> プロンプトに対してコマンドを入力して、デバッガーの操作を試すことができます。 たとえば、これらのコマンドを試すことができます。

  5. ターゲット コンピューターをもう一度実行するには、[デバッグ] メニューの [Go] を選択するか、g キーを押してから Enter キーを押します。

  6. デバッグ セッションを停止するには、[デバッグ] メニューから [デバッグ対象のデタッチ] を選択します。

    重要

    デバッガーを終了する前に、必ず [Go] コマンドを使用してターゲット コンピューターをもう一度実行してください。ターゲット コンピューターはまだデバッガーとやり取りをしている状態であるため、この操作を行わないと、ターゲット コンピューターはマウスとキーボードの入力に対して応答を停止したままになります。

ドライバーのデバッグ プロセスの詳細なチュートリアルについては、「ユニバーサル ドライバーのデバッグ - ステップ バイ ステップ ラボ (エコー カーネルモード)」を参照してください。

リモート デバッグの詳細については、「WinDbg を使用したリモート デバッグ」を参照してください。

Driver Module Framework (DMF) の使用

Driver Module Framework (DMF) は、WDF ドライバー開発者向けの追加機能が有効になる WDF の拡張機能です。 開発者は、どのような種類の WDF ドライバーでも適切にに短時間で作成できるようになります。

フレームワークとしての DMF によって、DMF モジュールという WDF オブジェクトを作成できます。 これらの DMF モジュールのコードは、異なるドライバー間で共有できます。 さらに、DMF は、ドライバー用に開発された DMF モジュールのライブラリをバンドルしており、他のドライバー開発者にも役立ちます。

DMF は WDF に置き換わるものではありません。 DMF は WDF と共に使用される 2 つ目のフレームワークです。 DMF を利用している開発者は引き続き WDF とそのすべてのプリミティブを使用してデバイス ドライバーを作成します。

詳細については、Driver Module Framework (DMF)を参照してください。