誰でもわかるデバドラ講座（５） ドライバサンプルをビルドしてみよう

# はじめに
今回はWindows上でドライバのビルド環境を構築し、Microsoftが提供しているドライバサンプルのビルド、およびインストールをしてみたいと思います。

以前のドライバのビルド方法は、WDKに含まれるコマンドライン用ビルドツールを使用することが一般的でした。コマンド操作に慣れている人であれば特に問題はないかもしれませんが、私のようにあまりコマンド操作を経験していない身としては、コマンドなどを覚えたり、スクリプトを作成したりと少しハードルが上がります。

今回紹介する方法は、統合開発環境であるVisual StudioにWDKをプラグインする形でGUIにて開発が行えるものです。GUIですと細かいコマンドを覚えていなくてもメニューから操作でき、インテリセンスやリファクタリングなどのVSの機能も使えるので、コマンドラインで開発されていた時よりも、開発効率は良くなったのではないでしょうか。


# 開発環境構築

構築する開発環境は以下となります。

* Visual Studio Community 2019 Version 16.10.0
* Windows Software Development Kit 10.0.19041.685
* Windows Driver Kit 10.0.19041.685
  * Windows Driver Kit Visual Studio extension


以下のページに沿ってビルド環境の構築をしていきます。

Windows Driver Kit (WDK) のダウンロード
https://docs.microsoft.com/ja-jp/windows-hardware/drivers/download-the-wdk

「Windows Driver Kit (WDK) のダウンロード」とありますが、WDKとはMicrosoftが提供しているWindows OS用のデバイスドライバを作成するための開発キットです。開発のためのドキュメントやビルド環境、ツールなどを含んでいます。

注意事項として、WDKのインストールは必ずVisual Studioのインストール後に実施してください。

## Visual Studio 2019 をインストール
以下のリンクよりVisual Studio 2019のインストーラーをダウンロードします。
https://visualstudio.microsoft.com/ja/downloads/

インストーラーを起動すると以下のようなワークロードの選択画面が表示されるため、「C++によるデスクトップ開発」を選択します。
<div align="center">
<img src=https://user-images.githubusercontent.com/73565470/123942292-f533b480-d9d5-11eb-9c26-6567af9cc6c2.png title="図1：Visual studio 2019 ワークロード選択">
</div>


次に「個別のコンポーネント」タブで自分のPCにインストールされている最新バージョンの MSVCと同じバージョンのビルドツールとSpectre 軽減ライブラリを選択します。
<div align="center">
<img src=https://user-images.githubusercontent.com/73565470/123942253-eea53d00-d9d5-11eb-800a-008f69643c33.png title="図2：Visual studio 2019 個別のコンポーネント選択">
</div>

また、WDKをインストールするには、互換性のある**Windows Software Development Kit**のインストールが必要です。個別のコンポーネント選択画面では、**Windows 10 SDK(10.0.19041.0)**と表示されているものが対象となります。(「C++によるデスクトップ開発」を選択した際に自動で選択されている場合は個別でインストールする必要はありません。)
なお、インストールするWDKのバージョンによっては、個別のコンポーネントには表示されない場合があります。その場合は後述する「Windows SDKをインストール」を実施してください。

必要なコンポーネントを選択後にインストールを開始してください。

## Windows SDKをインストール

Visual Studioインストール時に個別のコンポーネントでWindows SDKをインストールできない場合のみこの処理を実施ください。

以下のリンクより該当するSDKをインストールします。
https://developer.microsoft.com/ja-jp/windows/downloads/sdk-archive/


## WDKをインストール

以下のリンクよりWDKのインストーラーをダウンロードし、**WDK(10.0.19041.685)**をインストールします。
https://go.microsoft.com/fwlink/?linkid=2128854

上記のリンクより対象バージョンのWDKがインストールできない場合は以下のリンクより対象バージョンのWDKをインストールしてください。
https://docs.microsoft.com/ja-jp/windows-hardware/drivers/other-wdk-downloads

インストール最終画面に**Windows Driver Kit Visual Studio extension**が表示されます。これにチェックをすることで、WDKの拡張機能がインストールされ、Visual Studio 2019で使用できるようになります。

Visual Studio をインストールする前にインストールした場合など、Visual Studio 拡張機能が正常にインストールできていない場合には、以下のファイルを実行することで、拡張機能をインストール可能です。
`C:\Program Files (x86)\Windows Kits\10\Vsix\VS2019\WDK.vsix`


以上で環境構築は終了です。

# ドライバサンプルのダウンロード

以下のMicrosoftのドライバサンプルのページにアクセスし、ドライバサンプルをダウンロードします。
https://github.com/Microsoft/Windows-driver-samples


# ドライバサンプルのビルド

今回はダウンロードしたドライバサンプルの以下のディレクトリにあるechoドライバをビルドしてみます。
Windows-driver-samples-master\Windows-driver-samples-master\general\echo\kmdf

このドライバは、書き込み要求で受け取ったデータをドライバ内のキューに保持し、読み込み要求でそのデータをキューから取り出してデータを返却するものです。

kmdfecho.slnを開くと Visual Studio 2019 が立ち上がり、以下のような画面が表示されます。

<div align="center">
<img src=https://user-images.githubusercontent.com/73565470/123941928-9d954900-d9d5-11eb-8bed-0001be80b546.png title="図3：Visual studio 2019 slnオープン">
</div>

画面上部で作成したい環境のビルド構成を選択します。
今回の環境はWindows10x64なので**Release**, **x64**を選択します。
<div align="center">
<img src=https://user-images.githubusercontent.com/73565470/123942026-b6056380-d9d5-11eb-8901-6ba646074388.png title="図4：Visual studio 2019 ビルド構成">
</div>

ソリューションエクスプローラーのDriver/DriverSync/echo_2を右クリックしビルドを選択します。

<div align="center">
<img src=https://user-images.githubusercontent.com/73565470/123941982-aab23800-d9d5-11eb-8253-800e8998b4f1.png title="図5：Visual studio 2019 ビルド">
</div>

ビルドが成功すると、以下のパスにecho_2.inf、echo_2.sys、kmdfsamples.catが出力されます。
Windows-driver-samples-master\Windows-driver-samples-master\general\echo\kmdf\driver\DriverSync\x64\Release\echo_2

<div align="center">
<img src=https://user-images.githubusercontent.com/73565470/123942052-bc93db00-d9d5-11eb-8503-efb0a5d49773.png title="図6：ファイル出力">
</div>

#ドライバのインストール

ドライバをインストールするためにはドライバに署名がされている必要があります。
ドライバの署名を行うには、EV証明書が必要です。しかし、今回は正式な証明書ではなくビルド時に付加されるテスト署名にてインストールを行います。

テスト署名されたドライバをインストールするにはPCをテストモードで起動する必要があります。
テストモードとはテスト署名されたドライバーのインストールを有効にするモードです。以下のページで詳細について説明されています。

テスト署名されたドライバーの読み込みの有効化
https://docs.microsoft.com/ja-jp/windows-hardware/drivers/install/the-testsigning-boot-configuration-option

Windowsボタン＋Rで「ファイル名を指定して実行」を開き、"hdwwiz.exe"と入力してEnterを押します。
起動したハードウェアの追加ウィザードを使用してビルド時に生成したinfファイルを指定し、ドライバをインストールします。
<div align="center">
<img src=https://user-images.githubusercontent.com/73565470/123942087-c3bae900-d9d5-11eb-8955-5c380e60e80b.png title="図7：ドライバインストール">
</div>

デバイスマネージャーでデバイスが追加されていることを確認できました。

<div align="center">
<img src=https://user-images.githubusercontent.com/73565470/123942114-c9183380-d9d5-11eb-9ef9-0bff0513e572.png title="図8：デバイスマネージャー">
</div>


# 動作確認

ドライバサンプルに付属しているテストアプリechoappをビルドし、実行しました。以下画像のような結果となり、Write処理・Read処理が成功することを確認できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/825028/ebfe6cbf-6fce-b590-b05c-9ce8e55d791d.png)






# まとめ
今回はドライバのビルド環境を構築してサンプルドライバのビルド、インストールの流れについて紹介しました。いざ、ドライバを作ってみよう!!となっても環境構築で詰まってしまうことがあるかもしれません。そんな時は参考にしてみてください。

今回の投稿はGUI環境の紹介でしたが、コマンドラインにてビルドが可能な**EWDK**も存在しております。以前のCUI環境を好まれる方は挑戦してみてはいかがでしょうか。こちらからダウンロード可能です。(なお、ファイルはISO形式による公開となり、サイズは16GB程度となります。)
https://docs.microsoft.com/ja-jp/windows-hardware/drivers/download-the-wdk#enterprise-wdk-ewdk


また、今回はテスト署名にてインストールを行いましたが、正式にドライバをリリースするためにはEV証明書およびマイクロソフト社への開発者登録が必要となります。ドライバの署名については今後の連載にて説明をしたいと思います。