デバイスドライバ開発初心者がサンプルドライバを動かしてみた話

## はじめに
デバイスドライバ開発未経験者が、入門の第一歩として Microsoft が提供するサンプルドライバを、ソースコードからビルド・インストール・動作確認まで実際に行ってみました。
本記事では、その過程を詳しく記録しています。
デバイスドライバ開発に興味はあるものの、敷居が高く感じている方にとって、最初の一歩を踏み出す助けになれば嬉しいです。

### 今回使用するサンプル（echo ドライバ）について
今回は、Microsoft が提供しているサンプルドライバ「echo」を使います。
このドライバは、送ったデータをそのまま返すだけのシンプルな仮想デバイスです。
実際のハードウェアは必要なく、ドライバ開発の基本を学ぶのにちょうど良い題材です。

## 開発環境の準備
echo ドライバをビルド・インストール・テストするには、以下の環境が必要です。

- Windows 10 / 11（64bit）
- Visual Studio 2022（Community EditionでOK）
- Windows 11 SDK
- Windows Driver Kit (WDK) 

### ■ 準備手順
以降の手順に沿って echo ドライバの開発環境を構築していきます。

---
**Visual Studio 2022 とデバイスドライバ開発用ライブラリのインストール（または更新）**

   Visual Studio インストーラーを起動し、[ワークロード] タブで以下にチェックを入れます：
   - C++によるデスクトップ開発

   次に [個別のコンポーネント] タブで、以下のコンポーネントにチェックを入れます：

   - MSVC v143 - VS 2022 C++ ARM64/ARM64EC Spectre 軽減ライブラリ（最新）
   - MSVC v143 - VS 2022 C++ x64/x86 Spectre 軽減ライブラリ（最新）
   - Spectre 軽減策を備えた最新の C++ ATL v143 ビルドツール（ARM64/ARM64EC）
   - Spectre の軽減策を含む、最新の V143 ビルドツール用 C++ MFC（ARM64/ARM64EC）
   - Spectre の軽減策を含む、最新の V143 ビルドツール用 C++ ATL（x86 および x64）
   - Spectre の軽減策を含む、最新の V143 ビルドツール用 C++ MFC（x86 および x64）
   - Windows Driver Kit

---
**Windows SDK のインストール**
   以下のリンクから Windows SDK（10.0.26100 for Windows 11）をダウンロード・インストールします：

   https://developer.microsoft.com/windows/downloads/windows-sdk/

---
**Windows Driver Kit（WDK）のインストール**
   以下のリンクから WDK（10.0.26100.3323）をダウンロード・インストールします：

   https://go.microsoft.com/fwlink/?linkid=2307500
   
   > ※ Visual Studio インストーラーの「個別コンポーネント」にある [Windows Driver Kit]は Visual Studio 拡張機能であり、WDK 本体ではありません。  
   > そのため、Microsoft 公式サイトから WDK を別途インストールする必要があります。

## echo ドライバのビルド
Microsoft が公開しているドライバサンプル一式をダウンロードし、その中に含まれる echo ドライバをビルドします。

#### ■ ドライバサンプルをダウンロード
以下の GitHub リポジトリをクローンします：
https://github.com/microsoft/Windows-driver-samples

#### ■ echoドライバをビルド
echo ドライバは、以下のフォルダにあります：
```
Windows-driver-samples\general\echo\kmdf
```

この中にある `kmdfecho.sln` を Visual Studio で開きます。
ビルド構成を Release/x64 に設定し、Driver/DriverSync/echo_2 プロジェクトをビルドします。

#### ■ 出力ファイルの確認
ビルドが成功すると、以下のフォルダに成果物が出力されます：
```
Windows-driver-samples\general\echo\kmdf\driver\DriverSync\x64\Release\echo_2
```

以下の 2つのファイルが存在することを確認してください。
- `echo_2.inf`
- `echo_2.sys`

## echo ドライバの署名
作成したドライバは、そのままでは Windows にインストールできません。  
セキュリティ対策として、**ドライバには署名が必要**です。

本来は認証機関（CA）による正式な証明書で署名する必要がありますが、今回は Microsoft のサンプルに含まれる開発用証明書を使ってテスト署名を行います。

#### ■ Windows 10/11 をテストモードで起動
テスト署名されたドライバをインストールするには、**Windows をテストモードで起動**する必要があります。
コマンドプロンプト（管理者として実行）で以下を実行してください：
```
bcdedit /set testsigning on
```
実行後、OSを再起動します。
再起動後、デスクトップ右下に「テストモード」と表示されていれば成功です。

#### ■ ルート証明書を信頼済みとして登録
以下のフォルダに開発用のルート証明書 `echo_2.cer` があります：
```
Windows-driver-samples\general\echo\kmdf\driver\DriverSync\x64\Release
```
この .cer ファイルをダブルクリックし、「証明書のインストール」を選択してください。
ウィザードでは以下のように手動でストアを指定します：
- 証明書のストアの場所 → 「ローカルコンピューター」
- 証明書ストアを選択 → 「信頼されたルート証明機関」

#### ■ infcat で .cat を生成
`.cat` ファイルとは、ドライバパッケージに含まれる各ファイル（INF、SYS など）のハッシュ値をまとめた「目録ファイル（カタログファイル）」です。  
この `.cat` に署名することで、ドライバインストール時に Windows が**パッケージ全体の改ざん有無**を検証できるようになります。

Windows 10 / 11 では、カーネルモードドライバのインストールには**署名済みカタログファイルが必須**です。

---

まず、以下のフォルダに移動します：
```
Windows-driver-samples\general\echo\kmdf\driver\DriverSync\x64\Release\echo_2
```
次に、以下のコマンドを実行して `.cat` ファイルを生成します：
```
inf2cat /driver:. /os:10_X64
```
- `/driver:.` … INF ファイルのあるカレントディレクトリを指定  
- `/os:10_X64` … Windows 10 64bit 向けカタログを生成する指定

> 💡 Windows 11 の場合は `/os:11_X64` に変更してください。

---

⚠️ `inf2cat` へのパスが通っていない場合は、コマンドが失敗します。  
私の環境では以下のパスに存在していました：
```
C:\Program Files (x86)\Windows Kits\10\bin\10.0.26100.0\x86
```
パスを通すか、コマンド実行時にフルパスで指定してください。

---
正常に実行されると、`kmdfsamples.cat` というファイルが生成されます。
この `.cat` ファイルは次のステップで署名に使用します。

#### ■ signtool で .cat および .sys に署名
`signtool` を使用して、ドライバファイル（`.sys`）およびカタログファイル（`.cat`）にテスト署名を行います。
まず、以下のフォルダに移動します：
```
Windows-driver-samples\general\echo\kmdf\driver\DriverSync\x64\Release\echo_2
```
次に、以下のコマンドを実行してテスト署名を行います：
```
signtool sign /fd SHA256 /a /s "My" /n "<証明書のCN>" echo_2.sys
signtool sign /fd SHA256 /a /s "My" /n "<証明書のCN>" kmdfsamples.cat
```
- `/fd SHA256` … 署名に使用するハッシュアルゴリズム（SHA256を推奨）
- `/a` … 自動で適切な証明書を選択
- `/s "My"` … 使用する証明書ストア（通常 "My" = 個人）
- `/n "<証明書のCN>"` … 使用する証明書の名前（CN）

---
🔍 `<証明書のCN>` の確認方法：

`echo_2.cer` をダブルクリック → [詳細] タブ → [サブジェクト] を確認します。

---

## echo ドライバをインストール
echo ドライバを動作させるには、ドライバをインストールした上で仮想デバイスを作成する必要があります。

---

#### ■ pnputil でドライバをインストール

まず、ドライバパッケージ（INF）をシステムに登録し、インストールします：

```cmd
pnputil /add-driver echo_2.inf /install
```
> ※ 管理者権限のコマンドプロンプトで実行してください。

#### ■ devcon で仮想デバイスを作成
次に、ドライバを割り当てる仮想デバイスを作成します：
```
devcon install echo_2.inf root\ECHO_2
```

--

⚠️ `devcon` へのパスが通っていない場合は、コマンドが失敗します。  
私の環境では以下のパスに存在していました：
```
C:\Program Files (x86)\Windows Kits\10\Tools\10.0.26100.0\x64
```
パスを通すか、コマンド実行時にフルパスで指定してください。

---

#### ■ デバイスマネージャーで確認
ドライバとデバイスが正しく登録されているか、デバイスマネージャーで確認します。
- [Win + R] キー →「ファイル名を指定して実行」で `devmgmt.msc` を入力
`Sample Device` と `Sample WDF ECHO Driver (DriverSync)` が存在するか確認してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2534529/85e1aba6-2889-45a6-ba02-10c64720dabf.png)

## 動作確認
サンプルに付属しているテストアプリケーション (`echoapp`) を使用して、 echo ドライバの動作確認ができます。

---

#### ■ echoapp.exe のビルド
Visual Studio で kmdfecho.sln を開いている状態から、Exe フォルダ > echo app を右クリックしてビルドします。
ビルドが成功すると、以下のフォルダに成果物が出力されます：
```
Windows-driver-samples\general\echo\kmdf\exe\x64\Release
```

---

#### ■ テストの実行
コマンドプロンプトで上記フォルダへ移動し `echoapp.exe` を実行します。
このアプリケーションは、バイト列をデバイスに書き込んでから読み戻し、内容が一致しているか検証することで、ドライバの読み書き処理が正常か確認します。

```cmd
>echoapp.exe
DevicePath: \\?\ROOT#SAMPLE#0000#{cdc35b6e-0be4-4936-bf5f-5537380a7c1a}
Opened device successfully
512 Pattern Bytes Written successfully
512 Pattern Bytes Read successfully
Pattern Verified successfully
30720 Pattern Bytes Written successfully
30720 Pattern Bytes Read successfully
Pattern Verified successfully
```

#### ■ 補足：このサンプルアプリの仕様
- 同期動作（DriverSync） バージョンでは、SpinLock による明示的な排他制御を実装
- アプリケーションは Write → Read を順に実行し、同一内容であるか検証
- `-Async` オプションを付けると、非同期で多数の I/O を投げて挙動を確認可能

https://learn.microsoft.com/ja-jp/samples/microsoft/windows-driver-samples/kmdf-echo-sample/

## 環境の復元
echo ドライバの動作確認が終わったら、テストのために変更した環境を元に戻します。  
特に **開発用証明書の登録** や **テストモードの有効化** はセキュリティリスクにつながる可能性があるため、忘れずに復元を行うことが重要です。

#### ■ echo ドライバの削除

まず、インストールした echo ドライバパッケージをシステムから削除します。

```cmd
pnputil /delete-driver echo_2.inf /uninstall /force
```
- `/uninstall` … 実際に使用中のドライバを削除対象とする
- `/force` … 強制的に削除（警告ありでも継続）

---
#### ■ devcon で作成した仮想デバイスの削除
次に、devcon で作成した仮想デバイスを削除します。

```cmd
devcon remove root\ECHO_2
```
このコマンドを実行すると、`Sample Device` がデバイスマネージャーからも削除されます。
`devmgmt.msc` で確認できます。

---
#### ■ 開発用証明書の除去
次に、テストのために信頼済みとして登録した開発用証明書（echo_2.cer）を削除します。
1. `certlm.msc`（証明書マネージャ）を起動
1. 「信頼されたルート証明機関」>「証明書」フォルダを開く
1. 一覧から echo_2 の証明書を右クリック → 削除

---
#### ■ Windows 10/11 テストモード無効化
最後に、Windows のテストモードを無効化して再起動します。
```cmd
bcdedit /set testsigning off
```
> 実行後、PCを再起動してください。
再起動後にデスクトップ右下の「テストモード」の表示が消えていれば完了です。

これで、echo ドライバの検証に使用した一連の環境を元の状態へ戻すことができます。

## つまずいたポイントと対処法
ここでは、私が検証中に実際につまずいたポイントと、その対処法について紹介します。

#### ■ echo ドライバのビルド失敗
**事象：**  
ビルドに失敗し、以下のエラーメッセージが表示されました。
```
error MSB8040: Spectre 軽減のライブラリは、このプロジェクトに必要です。...
```
**原因：**
Visual Studio に必要なコンポーネントがインストールされていなかったことが原因でした。  
具体的には、以下のコンポーネントが不足していました：
- MSVC v143 - VS 2022 C++ x64/x86 Spectre 軽減ライブラリ (最新)


**対処：**
Visual Studio インストーラーを起動し、[個別のコンポーネント] タブから上記のライブラリを追加インストールすることで解決しました。

## おわりに

この記事では、ドライバ開発未経験の立場から、Microsoft 提供の echo ドライバサンプルを使って「ビルド」「署名」「インストール」「動作確認」までの一連の流れを実際に試してみました。

初めてのデバイスドライバ開発ということで、慣れない用語や手順も多く、いくつかのつまずきもありましたが、手順を追ってひとつひとつ乗り越えていくことで、「自分でカーネルモードのドライバを動かせた」という実感を得ることができました。

今回の記事が、これからデバイスドライバ開発に挑戦してみたいという方の最初の一歩を後押しできれば幸いです。

最後までお読みいただきありがとうございました。

## 参考リンク
誰でもわかるデバドラ講座（５） ドライバサンプルをビルドしてみよう
https://qiita.com/spc_canbe/items/a6653534088823e7eb7b
Windows Driver Kit (WDK) のダウンロード
https://learn.microsoft.com/ja-jp/windows-hardware/drivers/download-the-wdk
KMDF Echo Sample
https://learn.microsoft.com/ja-jp/samples/microsoft/windows-driver-samples/kmdf-echo-sample/