ユニバーサル Hello World ドライバー (KMDF) の作成
このトピックでは、カーネルモード ドライバー フレームワーク (KMDF) を使ってユニバーサル Windows ドライバーを作成する方法について説明します。Microsoft Visual Studio テンプレートを使って開始し、別のコンピューターにドライバーを展開してインストールします。
最初に、Visual Studio 2015 と Windows Driver Kit (WDK) 10 がインストールされていることを確認します。これらは、Windows ハードウェア デベロッパー センターからダウンロードできます。
Debugging Tools for Windows は、WDK のインストールに含まれています。
ドライバー パッケージの作成とビルド
Microsoft Visual Studio を開きます。[ファイル] メニューで、[新規]、[プロジェクト] の順にクリックします。
[新しいプロジェクト] ダイアログ ボックスで、[WDF] をクリックします。
中央のウィンドウで、[Kernel Mode Driver, Empty (KMDF)] (カーネル モード ドライバー, 空 (KMDF)) をクリックします。
[名前] フィールドに、プロジェクト名として「KmdfHelloWorld」と入力します。
注 *新しい KMDF ドライバーか UMDF ドライバーを作成する場合、32 文字以下のドライバー名を選ぶ必要があります。この長さの制限は、wdfglobals.h で定義されています。
"場所" フィールドに、新規プロジェクトを作るディレクトリを入力します。
[ソリューションのディレクトリを作成] チェック ボックスをオンにします。[OK] をクリックします。
Visual Studio により、1 つのプロジェクトと 1 つのソリューションが作られます。これらは、次に示すように、[ソリューション エクスプローラー] ウィンドウに表示されます ([ソリューション エクスプローラー] ウィンドウが表示されていない場合は、[表示] メニューの [ソリューション エクスプローラー] をクリックします)。ソリューションには、KmdfHelloWorld という名前のドライバー プロジェクトがあります。
[ソリューション エクスプローラー] ウィンドウで、[KmdfHelloWorld] を右クリックして、[プロパティ] をクリックします。 [構成プロパティ]、[ドライバーの設定]、[全般] の順に移動し、[ターゲット プラットフォーム] が既定で [ユニバーサル] に設定されていることを確認します。
[ソリューション エクスプローラー] ウィンドウで、[KmdfHelloWorld] を右クリックして、[追加]、[新しい項目] の順にクリックします。
[新しい項目の追加] ダイアログ ボックスで、[C++ File] (C++ ファイル) をクリックします。[名前] に「Driver.c」と入力します。
注 ファイル名拡張子は、.cpp ではなく .c です。
[追加] をクリックします。次に示すように、Driver.c ファイルが [ソース ファイル] の下に追加されます。
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; }
Driver.c を保存します。
[ソリューション エクスプローラー] ウィンドウで、[ソリューション 'KmdfHelloWorld' (1 件のプロジェクト)] を右クリックして [構成マネージャー] をクリックします。ドライバー プロジェクトとパッケージ プロジェクトの両方に対する構成とプラットフォームを選びます。この作業では、Debug と x64 を選びます。
[ソリューション エクスプローラー] ウィンドウで、[KmdfHelloWorld] を右クリックして、[プロパティ] をクリックします。[Wpp トレース]、[すべてのオプション] で、[Wpp トレースの実行] を [いいえ] に設定します。[適用] をクリックし、[OK] をクリックします。
ドライバーをビルドし、ドライバー パッケージを作るには、[ビルド] メニューの [ソリューションのビルド] をクリックします。Visual Studio の [出力] ウィンドウにビルドの進行状況が表示されます ([出力] ウィンドウが表示されていない場合は、[表示] メニューの [出力] をクリックします)。
ソリューションのビルドが成功したことを確認したら、Visual Studio を閉じることができます。
ビルドされたドライバーを確認するには、エクスプローラーで [KmdfHelloWorld] フォルダーに移動し、[C:\KmdfHelloWorld\x64\Debug] に移動します。フォルダーには以下が含まれています。
- KmdfHelloWorld.sys -- カーネル モード ドライバー ファイル
- KmdfHelloWorld.inf -- ドライバーをインストールするときに Windows で使われる情報ファイル
- KmdfHelloWorld.cat -- ドライバー パッケージのテスト署名を検証するときにインストーラーで使われるカタログ ファイル
ドライバーの展開とインストール
通常、ドライバーのテストと展開には、デバッガーとドライバーがそれぞれ別のコンピューター上で実行されます。デバッガーを実行するコンピューターをホスト コンピューター、ドライバーを実行するコンピューターをターゲット コンピューターと呼びます。ターゲット コンピューターはテスト コンピューターとも呼ばれます。
ここまでは、ホスト コンピューター上の Visual Studio を使ってドライバーのビルドを行いました。次にターゲット コンピューターの構成が必要です。「ドライバーの展開およびテストのためのコンピューターのプロビジョニング (WDK 10)」の手順に従ってください。その後で、ドライバーの展開、インストール、読み込み、デバッグを行います。
ホスト コンピューター上で、Visual Studio でソリューションを開きます。KmdfHelloWorld フォルダーにあるソリューション ファイル (KmdfHelloWorld.sln) をダブルクリックしてソリューションを開くこともできます。
[ソリューション エクスプローラー] ウィンドウで、[KmdfHelloWorld] プロジェクトを右クリックして、[プロパティ] をクリックします。
次に示すように、[KmdfHelloWorld プロパティ ページ] ウィンドウで、[構成プロパティ]、[ドライバーのインストール]、[展開] の順に移動します。
[展開前にドライバーの以前のバージョンを削除する] チェック ボックスをオンにします。
[Target Device Name (ターゲット デバイス名)] については、テストとデバッグ用に構成したコンピューターの名前を選んでください。この作業では、MyTestComputer というコンピューターを使います。
[ハードウェア ID のドライバーの更新] をクリックして、ドライバーのハードウェア ID を入力します。この例では、ハードウェア ID は Root\KmdfHelloWorld です。[OK] をクリックします。
注 この作業のハードウェア 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
[デバッグ] メニューの [デバッグ開始] をクリックするか、キーボードで F5 キーを押します。
Visual Studio では、最初に [出力] ウィンドウに進行状況が表示されます。次に、[デバッガー イミディエイト] ウィンドウが開き、引き続き進行状況が表示されます。
ドライバーがターゲット コンピューターに展開、インストールされ、読み込まれるまで待機します。この処理は、1 ~ 2 分かかる場合があります。
[デバッグ] メニューの [すべて中断] をクリックします。ホスト コンピューター上のデバッガーが、ターゲット コンピューターに割り込みます。[DEBUGGER IMMEDIATE WINDOW] (デバッガー イミディエイト ウィンドウ) に、カーネルのデバッグ コマンド プロンプト kd> が表示されます。
この段階で、kd> プロンプトに対してコマンドを入力することにより、デバッガーの操作を試してみることができます。たとえば、次のようなコマンドを試すことができます。
ターゲット コンピューターを再び実行するには、[デバッグ] メニューの [続行] をクリックします。
デバッグ セッションを停止するには、[デバッグ] メニューの [デバッグの停止] をクリックします。