この記事では、Kernel-Mode Driver Framework (KMDF) を使用して ユニバーサル Windows ドライバー を作成する方法について説明します。 Microsoft Visual Studio テンプレートから始めて、別のコンピューターにドライバーを展開してインストールします。
[前提条件]
手順に従って Windows Driver Kit (WDK) をインストールします。 WDK をインストールすると、Windows 用のデバッグ ツールが含まれます。
Visual Studio 2022 をインストールします。 Visual Studio 2022 をインストールするときに、 C++ によるデスクトップ開発 ワークロードを選択し、[ 個々のコンポーネント ] で次の追加を選択します。
- MSVC v143 - VS 2022 C++ ARM64/ARM64EC Spectre対策済みライブラリ (最新)
- MSVC v143 - VS 2022 C++ x64/x86 Spectre 軽減ライブラリ (最新)
- 最新の v143 ビルド ツール (ARM64/ARM64EC) に対応した Spectre 軽減策付き C++ ATL
- Spectre 軽減策を使用した最新の v143 ビルド ツール用 C++ ATL (x86 および x64)
- Spectre 軽減策を使用した最新の v143 ビルド ツール用 C++ MFC (ARM64/ARM64EC)
- Spectre 軽減策を使用した最新の v143 ビルド ツール用 C++ MFC (x86 および x64)
- Windowsドライバ キット
ドライバーの作成とビルド
Microsoft Visual Studio を開きます。 [ ファイル ] メニューの [ 新しい > プロジェクト] を選択します。
[ 新しいプロジェクトの作成 ] ダイアログ ボックスで、左側のドロップダウンで [C++ ] を選択し、中央のドロップダウンで [Windows ] を選択し、右側のドロップダウンで [ ドライバー ] を選択します。
プロジェクトの種類の一覧から カーネル モード ドライバー (KMDF) を選択します。 [次へ] を選択します。
ヒント
Visual Studio でドライバー プロジェクト テンプレートが見つからない場合、WDK Visual Studio 拡張機能が正しくインストールされませんでした。 この問題を解決するには、Visual Studio インストーラーを起動し、[変更] を選択し、[個々のコンポーネント] タブで Windows ドライバー キットを追加して、[変更] を選択します。
[ 新しいプロジェクトの構成 ] ダイアログ ボックスで、[ プロジェクト名 ] フィールドに「KmdfDriver」と入力します。
注
新しい KMDF ドライバーまたは UMDF ドライバーを作成するときは、32 文字以下のドライバー名を選択する必要があります。 この長さの制限は wdfglobals.h で定義されています。
[ 場所 ] フィールドに、新しいプロジェクトを作成するディレクトリを入力します。
[ ソリューションとプロジェクトを同じディレクトリに配置する ] をオンにして、[ 作成] を選択します。
Visual Studio では、1 つのプロジェクトとソリューションが作成されます。 ソリューション エクスプローラー ウィンドウで確認できます。 ([ソリューション エクスプローラー] ウィンドウが表示されない場合は、[表示] メニューから [ソリューション エクスプローラー] を選択します)。ソリューションには、KmdfDriver という名前のドライバー プロジェクトがあります。 ドライバーのソース コードを表示するには、[ ソース ファイル] の下にあるファイルのいずれかを開きます。 Driver.c と Device.c は、開始するのに適した場所です。
ソリューション エクスプローラー ウィンドウで、KmdfDriver を長押し (または右クリック) し、[プロパティ] を選択します。 [構成プロパティ] > [ドライバーの設定] > [全般] に移動し、ターゲット プラットフォームの既定値が [ユニバーサル] に設定されていることに注意してください。
ドライバーをビルドするには、[ビルド] メニューから [ソリューション の ビルド ] を選択します。 Microsoft Visual Studio の [出力] ウィンドウにビルドの進行状況が表示されます。 ([出力] ウィンドウが表示されない場合は、[表示] メニューから [出力] を選択します)。
ビルド出力に次のものが含まれていることを確認します。
> Driver is 'Universal'.ソリューションが正常にビルドされたことを確認したら、Visual Studio を閉じます。
ビルドされたドライバーを表示するには、エクスプローラーで KmdfDriver フォルダーに移動し、 x64\Debug\KmdfDriver に移動します。 ディレクトリには、次のファイルが含まれています。
- KmdfDriver.sys-- カーネル モード ドライバー ファイル
- ドライバーのインストール時に Windows が使用する KmdfDriver.inf――情報ファイル
ドライバーを展開する
通常、ドライバーをテストしてデバッグする場合、デバッガーとドライバーは別のコンピューターで実行されます。 デバッガーを実行するコンピューターは ホスト コンピューターと呼ばれ、ドライバーを実行するコンピューターは ターゲット コンピューターと呼ばれます。 ターゲット コンピューターは 、テスト コンピューターとも呼ばれます。 ドライバーのデバッグの詳細については、「 Windows 用デバッグ ツール」を参照してください。
ここまでは、Visual Studio を使用してホスト コンピューター上にドライバーをビルドしました。 次に、ターゲット コンピューターを構成する必要があります。
「ドライバーの展開とテスト用にコンピューターをプロビジョニングする (WDK 10)」の手順に従います。
ヒント
ネットワーク ケーブルを使用してターゲット コンピューターを自動的にプロビジョニングする手順に従う場合は、ポートとキーをメモします。 デバッグ手順の後半で使用します。 この例では、ポートとして 50000 を使用し、キーとして 1.2.3.4 を使用します。
実際のドライバー デバッグ シナリオでは、KDNET で生成されたキーを使用することをお勧めします。 KDNET を使用してランダム キーを生成する方法の詳細については、 デバッグ ドライバー - ステップ バイ ステップ ラボ (Sysvad カーネル モード) に関する記事を参照してください。
ホスト コンピューターで、Visual Studio でソリューションを開きます。 KmdfDriver フォルダー内のソリューション ファイル (KmdfDriver.sln) をダブルクリックできます。
ソリューション エクスプローラー ウィンドウで、KmdfDriver プロジェクトを長押し (または右クリック) し、[プロパティ] を選択します。
KmdfDriver パッケージ のプロパティ ページ ウィンドウの左側のウィンドウで、[構成プロパティ] > [ドライバーのインストール] >展開に移動します。
[デプロイ前に以前のドライバー バージョンを削除する] にチェックを入れます。
[ リモート コンピューター名] で、テストとデバッグ用に構成したコンピューターの名前を選択します。 この演習では、MyTestComputer という名前のコンピューターを使用します。
[ ハードウェア ID ドライバーの更新] を選択し、ドライバーのハードウェア ID を入力します。 この演習では、ハードウェア ID は Root\KmdfDriver です。 [OK] を選択.
注
この演習では、ハードウェア ID は実際のハードウェアを識別しません。 これは、ルート ノードの子として デバイス ツリー 内の場所が与えられる架空のデバイスを識別します。 実際のハードウェアの場合は、[ ハードウェア ID ドライバーの更新] を選択しないでください。代わりに、[ インストールして確認] を選択します。 ドライバーの情報 (INF) ファイルにハードウェア ID が表示されます。 ソリューション エクスプローラー ウィンドウで、KmdfDriver > ドライバー ファイルに移動し、KmdfDriver.inf をダブルクリックします。 ハードウェア ID は [Standard.NT$ARCH$] にあります。
[Standard.NT$ARCH$] %KmdfDriver.DeviceDesc%=KmdfDriver_Device, Root\KmdfDriver[ ビルド ] メニューの [ ソリューションのデプロイ] を選択します。 Visual Studio は、ドライバーのインストールと実行に必要なファイルをターゲット コンピューターに自動的にコピーします。
ドライバーを展開すると、ドライバー ファイルがテスト コンピューターの %Systemdrive%\drivertest\drivers フォルダーにコピーされます。 展開中に問題が発生した場合は、ファイルがテスト コンピューターにコピーされているかどうかを確認できます。 .inf、.cat、test cert、.sys ファイル、およびその他の必要なファイルが、%systemdrive%\drivertest\drivers フォルダーに存在することを確認します。
ドライバーの展開の詳細については、「 テスト コンピューターへのドライバーの展開」を参照してください。
ドライバーをインストールする
ターゲット コンピューターに KMDF ドライバーを展開したら、ドライバーをインストールします。 自動オプションを使用してターゲット コンピューターを Visual Studio で事前にプロビジョニングした場合、Visual Studio は、プロビジョニング プロセスの一環としてテスト署名済みドライバーを実行するようにターゲット コンピューターを設定します。 DevCon ツールを使用してドライバーをインストールするだけで済みます。
ホスト コンピューターで、WDK インストールの [ツール] フォルダーに移動し、DevCon ツールを見つけます。 たとえば、次のフォルダーを探します。
C:\Program Files (x86)\Windows Kits\10\Tools\x64\devcon.exe
DevCon ツールをリモート コンピューターにコピーします。
ターゲット コンピューターで、ドライバー ファイルを含むフォルダーに移動し、DevCon ツールを実行してドライバーをインストールします。
ドライバーのインストールに使用する devcon ツールの一般的な構文を次に示します。
devcon install <INF ファイル><ハードウェア ID>
このドライバーをインストールするために必要な INF ファイルは KmdfDriver.inf です。 INF ファイルには、ドライバー バイナリをインストールするためのハードウェア ID KmdfDriver.sys含まれています 。 INF ファイルにあるハードウェア ID が Root\KmdfDriver であることを思い出してください。
管理者としてコマンド プロンプト ウィンドウを開きます。 ドライバー パッケージ フォルダーに移動し、次のコマンドを入力します。
devcon install kmdfdriver.inf root\kmdfdriver
devcon が認識されないというエラー メッセージが表示される場合は、devcon ツールへのパスを追加してみてください。 たとえば、 C:\Tools という名前のターゲット コンピューター上のフォルダーにコピーした場合は、次のコマンドを使用してみてください。
c:\tools\devcon install kmdfdriver.inf root\kmdfdriver
テスト ドライバーが署名されていないドライバーであることを示すダイアログ ボックスが表示されます。 続行するには、[このドライバをインストールする] を選択します。
ドライバーをデバッグする
ターゲット コンピューターに KMDF ドライバーをインストールしたら、ホスト コンピューターからリモートでデバッガーをアタッチします。
ホスト コンピューターで、管理者としてコマンド プロンプト ウィンドウを開きます。 WinDbg.exe ディレクトリに移動します。 Windows キットのインストールの一部としてインストールされた Windows Driver Kit (WDK) の x64version of WinDbg.exe を使用します。 WinDbg.exeの既定のパスを次に示します。
C:\Program Files (x86)\Windows Kits\10\Debuggers\x64
WinDbg を起動し、次のコマンドを使用して、ターゲット コンピューター上のカーネル デバッグ セッションに接続します。 ポートとキーの値は、ターゲット コンピューターのプロビジョニングに使用した値と同じである必要があります。 ポートには 50000 、キーには 1.2.3.4 (デプロイ手順で使用した値) を使用します。 k フラグは、これがカーネル デバッグ セッションであることを示します。
WinDbg -k net:port=50000,key=1.2.3.4
[ デバッグ ] メニューの [ 中断] を選択します。 ホストコンピューターのデバッガーがターゲットコンピューターに侵入します。 [デバッガー コマンド] ウィンドウに、カーネル デバッグコマンド プロンプト kd> が表示されます。
この時点で、 kd-> プロンプトでコマンドを入力して、デバッガーを試すことができます。 たとえば、次のコマンドを試すことができます。
ターゲット コンピューターをもう一度実行するには、[デバッグ] メニューから [Go] を選択するか、"g" キーを押してから "Enter" キーを押します。
デバッグ セッションを停止するには、[デバッグ] メニューから [デバッグ対象のデタッチ] を選択します。
Important
"go" コマンドを使用して、デバッガーを終了する前にターゲット コンピューターを再度実行するか、ターゲット コンピューターがデバッガーと通信しているため、マウスとキーボードの入力に応答しないままであることを確認します。
ドライバーのデバッグ プロセスの詳細なチュートリアルについては、「 ユニバーサル ドライバーのデバッグ - ステップ バイ ステップ ラボ (Echo Kernel-Mode)」を参照してください。
リモート デバッグの詳細については、「 WinDbg を使用したリモート デバッグ」を参照してください。
ドライバー モジュール フレームワーク (DMF) の使用
ドライバー モジュール フレームワーク (DMF) は、WDF ドライバー開発者向けの追加機能を有効にする WDF の拡張機能です。 これは、開発者があらゆる種類の WDF ドライバーをより迅速に記述するのに役立ちます。
フレームワークとしての DMF では、DMF モジュールと呼ばれる WDF オブジェクトを作成できます。 これらの DMF モジュールのコードは、異なるドライバー間で共有できます。 さらに、DMF は、ドライバー用に開発した DMF モジュールのライブラリをバンドルし、他のドライバー開発者に価値を提供すると感じています。
DMF は WDF を置き換えません。 DMF は、WDF で使用される 2 つ目のフレームワークです。 DMF を使用する開発者は、WDF とそのすべてのプリミティブを引き続き使用して、デバイス ドライバーを記述します。
詳細については、「 ドライバー モジュール フレームワーク (DMF)」を参照してください。