Top 最新情報 会社概要 セミナー 製品 開発者向 サポート download 問い合せ English
Windows Linux NETMF H8マイコン FPGA SHSMOD E-Kit WDDDC techmemo

Windowsデバイスドライバー 開発のためのヒント



3月5日 Windows 11 開発者セミナー

Windows 10 ドライバー開発セミナー (終了) Video
Windows 10 ドライバー開発入門 配布資料
Windows 11 対応ドライバー開発環境のインストールと使い方
Windows 11 対応ドライバーHLK テスト環境のインストール

Windows 11 時代の デバイスドライバー 開発情報

Visual Studio 対応

2022年2月時点での最近のドライバー開発環境は、Visual Studio 2019 に Windows 11 SDK (22000.1) オプションをインストールして、さらに最新版ドライバー開発キットである Windows 11 WDK をインストールして環境を構築します。

この環境で Windows 7 以降と、Windows Server 2008 SP1 以降の全オペレーティングシステム 用のドライバー開発が可能です。
参考情報: サポート終了日にご注意ください!

Visual Studio 2022 は現在利用できないので、十分注意してください。

開発ツール

最初に訪問するサイト: Windows Hardware Developer Center

ドライバー開発ツールがダウンロードできる上記のサイトです。忘れてしまった場合は、Windows Hardware で検索できます。Windows Driver Kit (WDK)今すぐダウンロード をクリックすると最新ツールが入手できる Windows Driver Kit (WDK) のダウンロード ページに移動します。

インストール

開発用ホストマシン(PC)に、@Visual Studio、AWDKの順番にインストールします。開発用ホストPCとしては、サポート対象の全 Windows OSが利用できますが、最新のWDK環境で プロビジョニングが使えるのはWindows 10 以降です。Visual Studioのインストールでは次の項目を選択してインストールします。

  • ユニバーサルWindowsプラットフォーム開発
  • C++によるデスクトップ開発
  • Windows SDK最新版 (通常デフォルトで選択済)

開発環境の構築

基本的にホストとターゲットの2台以上の物理マシンを用意して開発します。異なるOSバージョンやハードウェアでの動作を確認するため、あるいは異なるバージョンのビルドツールの動作を確認するため、ホストやターゲットを複数台用意して使用することは良くあります。

Windows 10では OS の新リリースが半年毎になり、WDKとそれを組み込むVisual Studio のUpdateも頻繁に行われる様になりましたが、常に開発環境は最新版の環境だけを使用する必要があります。例えば現時点では前述の Windows 11 WDK による開発環境 だけで、Windows 7以降とWindows Server 2008 SP1 以降の全OS用のドライバーが開発可能でます。

ドライバー開発で使用するマシンは、ネットワークごと一般ネットワークから隔離して、ウイルスチェックソフトウェアやセキュリティソフトウェアは一切使用しません。Windows ドライバー開発開発の妨げになる可能性があるからです。一方でカーネルモードドライバー等のデバッグ時には、インターネット経由でMicrosoftのシンボルサーバーに接続する事がほぼ必須なため、ファイアウォール経由でインターネットに接続する環境を用意します。例えば次の様に、一般の業務環境とは切り離したドライバー開発環境を構築する必要があります。

ホストマシン

ドライバーをビルドして、開発中のドライバーのターゲットでの実行状況をモニター、デバッグするマシンです。原則として最新のWindows をインストールして、さらにWindows Updateで最新版にしておきます。開発に集中するために、Windows Updateを一時中断して運用する場合があります。Windows ドライバー開発は(ビルド環境と実行環境が異なる)クロス開発が大前提のため、開発対象のドライバーをホストマシンにインストールして実行することは、通常行いません。

ターゲットマシン

開発対象のドライバーを実行する環境です。動作対象のWindows をインストールして、原則としてWindows Updateで最新版にしておきます。開発に集中するために、Windows Updateを一時中断する場合があります。基本的には開発対象のドライバーに関係無いデバイス、ドライバーやアプリケーションは一切インストールしません。これは開発専用マシンなので、開発中のドライバーをテストする以外の目的には使用しません。ユーザーモードドライバーの開発では、ホストマシンにドライバーをインストールして実行・デバッグすることも可能ですが、お勧めしません。

ソースコードとビルド

新規に開発するドライバーの元となるソースコードを入手する方法は一般に、次の三種類の方法があります。

  • Visual Studio のドライバーテンプレート機能でドライバーのひな型を作成して、それに機能を追加していく方法。
    比較的単純なドライバーの開発とドライバーの特定機能について実験、検証する場合に利用します。
  • Windows Driver サンプルからコピーして、それに追加・変更して行く方法。
    最近の主流です。ドライバー開発に慣れている人ほど、再利用するべきコードのサンプル見つけるのが上手です。
  • その他の方法。
    会社内で利用していた古いコード等、上記以外の手段で入手したコードに追加・変更する方法も根強く残っています。Windows 7以前の古いWDK, DDKには前述の Windows Driver Sample には無いサンプルコードが含まれているので、それを利用する場合もあります。以前のWDMのサンプルの大半がWindows 7の頃にWDFに書き換えられたので、WDMのサンプルを入手する手段として、Vista用のWDKを入手して活用する方法があります。古いWDKやDDKはMSDN ダウンロードで入手可能です。

ドライバーソースコードの編集とビルドは通常、Visual Studio を使用して行います。Visual Studio を使用せずに、Windows Driver Kit (WDK) のダウンロード ページからダウンロードできる EWDK (Enterprise WDK for Windows 10) を使用する方法もありますが、ドライバービルド時の設定やソースコードデバッグが面倒なので、お勧めしません。

デバッグ

デバッガーはWDKとともにインストールされるカーネルデバッガー WinDBG を使用します。ユーザーモードドライバーのデバッグでは、WinDBG のほかに Visual Studio の C++ デバッグ機能を使用することもできます。ドライバーを Visual Studio でビルドする場合、WinDBG は Visual Studio に組み込まれて動作します。Windows 8 からドライバーのビルド、LAN経由でのターゲットへのデプロイ、LAN接続経由でのカーネルデバッガーの起動がF5キーだけでも行えるようになりました。この様な環境の構築を、プロビジョニングと呼びます。プロビジョニングに関しては以下のリンクを参照してください。リンク先のURLに wdk-8-1 の字が含まれますが、この説明が掲載されたのがWindows 8.1 WDKだったためなので、気にする必要はありません。またWinDBGは大昔からと同様に、Visual Studio を使用せずに、単独で立ち上げて利用することも可能です。

ドライバーの展開およびテストのためのコンピューターのプロビジョニング (WDK 10)

バージョンと互換性

Windowsは古くから、OSとしてドライバーの互換性を重視して新バージョンが開発されて来ています。つまり動作させたいと思うOSバージョンの中で、一番古いバージョン用に、ドライバーをビルドしておけば、多くの場合同じバイナリーまたは同じソースコードが以降のWindowsでも利用できます。(一部例外はあります)

WDFドライバーではバージョン番号が明確に規定されているため、この後方互換性を利用することで、用意するドライバーバイナリー・パッケージを減らすか一つにすることが可能です。ただしWindows 7, Windows 8とWindows 10ではドライバー署名の制約が異なるので、その点には注意する必要があります。次のリンクにWDF (KMDFとUMDF) とOSの関係が記載されています。

KMDF のバージョンの履歴

UMDF バージョン履歴

ビルドするドライバーの動作対象WDFは、次の様にVisual Studioのプロパティで設定できます。

ビルドするドライバーの動作対象OSの設定も、次の様に容易です。Windows 7 用ドライバーのビルドに Windows 7 WDKをインストールする必要はありません。常に最新状態にアップデートしたVisual Studioと最新の WDK だけを使用します。

次の様に WDM ドライバー開発用の設定もできます。

Windows 10以降では通常、 Universal のTarget Platformを指定しますが、Windows 8.1以前のDDIやINF等を流用する場合には、Windows DriverのPlatformも設定可能です。

ユニバーサルドライバー

ユニバーサルドライバーは、Windows 10のリリースの際に Windows 10 IoT やSurface Hub, HoloLens 等とドライバーアーキテクチャーを統一させるために、導入されたものです。いくつかの古いWindows時代の機能を廃して、新しく整理されたものなので、ユニバーサルドライバーが動作しないWindows 8.1 以前の環境で使う予定が無ければ積極的に対応し、また利用するべきです。

ユニバーサルドライバーは、ユニバーサルなアーキテクチャでは無いため、x86, x64, ARM, ARM64 の各バイナリーのドライバーパッケージ毎にダッシュボードで申請して 構成証明署名 を付加する必要があります。


ハードウェア制御アプリケーション

デバイスドライバーズを開発せずにハードウェアをアプリケーションで制御する方法は多数あります。


フォーラムと掲示板

日本語
英語

参考ページ

Windows Hardware and Driver Developer Blog (英語)

Japan WDK Support Blog (アーカイブ)

Windows ハードウェア認定ブログ (アーカイブ)

Windows 10用ドライバー署名(2019年版)

ハードウェア開発者向けのサポートとコミュニティ (やや古い)

CQ出版 特集 Windows 7 時代のデバイス・ドライバ開発

CQ出版 連載 Windows Vista時代のデバイスドライバ開発 各回の概要

BCDedit 簡単操作法

Windows 8 Driver Sample

Driver Module Framework (DMF) -- GitHub

MSDNの価格

MSDNでダウンロードできるソフトウェア


ahidaka.github.io index


株式会社デバイスドライバーズ

2022年3月15日更新
誤りや不明な点はご指摘ください。
文責:日高亜友
Microsoft MVP for Windows Development

Copyright(c) 2022 Device Drivers Limited