人とか機械とか

デジタルガジェットやコンピュータについてのブログです。

Windowsデバイスドライバ開発入門

自分用のメモも兼ねて書きます。

まず、圧倒的に日本語の情報が少ないです。WDMの基本的な部分は日本語で勉強できますが、詳細を調べると必ず英語になるので覚悟が必要。エキサイト翻訳さんにお世話になっております。とても深い世界なので、私も経験はまだ少ないので、概要くらいしか説明できません。

概要

デバイスドライバとは、コンピュータで周辺機器を使えるようにするソフトウェアのことです。

windows95とかはVxDというドライバモデルだったそうですが、この辺はよく知らないです。windows98からWDMというドライバモデルが登場した。これが長らく2010年現在まで採用されているドライバモデルになっています。最近だとWDFと言う、WDMをラップしたフレームワークが登場しました。WDMとWDFの関係というのは、Win32とMFCの関係によく似ています。

ドライバと言ってもいろいろあります。ドライバは階層構造になっていて、直接ハードウェアに触れるものと、触れないものもあります。ファンクションドライバ、バスドライバ、フィルタドライバ、USBクラスドライバ。ネットワークドライバはNDISというAPIを使う。グラフィックドライバはWDDM。また、ドライバとサービスはとても似ています。

DDKやWDKとは、ドライバ開発キットのことです。コンパイラやツールやサンプルが入っています。無料です。ライセンスは、同梱されている"lisence.rtf"を参照。

簡単な概要についてはwikipediaも読むと良いです。
 http://ja.wikipedia.org/wiki/Windows_Driver_Model
 http://ja.wikipedia.org/wiki/Windows_Driver_Foundation


学習方法

1、まず入門向けの日本語の書籍を読むのが良いと思います。
 また、月刊インターフェースの2010年2月号、3月号あたりに、Windowsデバイスドライバ開発の基本の記事があるので、これも入門用としてはかなり良い記事です。
 http://www.kumikomi.net/interface/contents/201002.php
 http://www.kumikomi.net/interface/contents/201003.php
 http://www.devdrv.co.jp/download/interface/1002/
 http://www.devdrv.co.jp/download/interface/1003/

2、WDMプログラミングの基本的な知識です。
 ドライバーの主要概念
 http://www.microsoft.com/japan/whdc/driver/kernel/default.mspx
 誰でもわかるデバイスドライバ講座(ちょっと古いです)
 http://www.sciencepark.co.jp/community/lecture.html

3、Vistaから色々と変わったので、その辺の新しくなった事が書いてあります。
 Windows Vista のドライバ開発
 http://www.microsoft.com/japan/whdc/devtools/wdk/vista_dev.mspx#
 https://www.microsoft.com/japan/whdc/Driver/priorityio.mspx

4、観察

  • USB Viewサンプルをビルドしてみて、PCにどんなUSBデバイスが接続されているか見てみる。
  • サンプルをビルドして動かして、吐き出すログをDebugViewで観察してみる。
  • WDKについている\src\general\pcidrvサンプルはintelの82559/82558 LANカードのドライバなので、実デバイスを用意して動かしてみるのもアリ。(ジャンクパーツ屋に売っています)

5、実践

  • 適当なデバイスの、フィルタドライバあたりが良いと思います。
  • キーボードやマウスなどの、適当なUSBのHIDのフィルタドライバを書いてみる。IRPをモニタするとか、新たなIOCTLを追加してみる。アプリからそれを呼んでみる。
  • サンプルソースを読んでみる。改造して変化を見てみる。

参考書籍


入門用


入門用によいです。USBのことが詳しく書いてあります。

Windows Vistaデバイスドライバプログラミング

Windows Vistaデバイスドライバプログラミング


こちらも入門向けですが、USBと、WDFのことが詳しく書いて有ります。

中級

Microsoft WDMプログラミング―WindowsXP対応 (Microsoft Programming Series)

Microsoft WDMプログラミング―WindowsXP対応 (Microsoft Programming Series)


日本語で得られる情報で最も具体的なのがこれだと思います。この本は必須だと思います。CD-ROMの中に、英語版の内容のオンラインヘルプが入っています。検索できるので便利です。ブックオフのサイトによると価格が2500円と破格なので、ブックオフで見つけたらラッキーです。ただ2001年製なので情報が古い部分もあります。例えば「5.5 I/Oリクエストのキャンセル」の章は情報が古いです。CSQ(キャンセルセーフキュー)という方法があるので、それを使うほうが簡単で安全なようです。また、エラッタはコチラを参照。http://www.oneysoft.com/

Windows ドライバのキャンセル ロジック
http://www.microsoft.com/japan/whdc/driver/kernel/cancel_logic.mspx
キャンセル セーフ IRP キューイングの制御フロー
http://www.microsoft.com/japan/whdc/driver/kernel/IoCsq.mspx

WDMデバイスドライバ―Windows98/2000のための新しいドライバモデル (Professional Library Windows2000)

WDMデバイスドライバ―Windows98/2000のための新しいドライバモデル (Professional Library Windows2000)

WindowsNTデバイスドライバプログラミング (WINDOWS NT DEVICE DRIVER BOOK)

WindowsNTデバイスドライバプログラミング (WINDOWS NT DEVICE DRIVER BOOK)


少々古いです。安く売っていたら足しに買っておく程度でいいと思います。

上級

Windows® Internals, Fifth Edition (PRO-Developer)

Windows® Internals, Fifth Edition (PRO-Developer)


windows 7に対応したsixth editionが近くに出るらしいです。

インサイド Microsoft Windows 第4版〈上〉 (マイクロソフト公式解説書)

インサイド Microsoft Windows 第4版〈上〉 (マイクロソフト公式解説書)


これは日本語訳です。fourth editionまでしかないです。

焦点が「ドライバ」でなく「Windows内部構造」なので少し違いますが、役に立つと思います(たぶん)

開発環境とツール

C言語が不自由なく使いこなせることが最低条件です。C言語かC++言語で開発するのが一般的です。カーネルモードのソフトウェア開発なので、最悪の場合OSにダメージを与えて起動しなくなる可能性もあります。このため、デバッグ専用のPCを用意することをオススメします。もしくは仮想マシンを利用するとか。vmware, virtualPC。

 Windows 用ドライバー開発者向けツール
 http://www.microsoft.com/japan/whdc/DevTools/default.mspx

WDK 7.0 辺りからOACRというツールが付属するようになりました。ドライバをビルドした後に5分くらい待っていると勝手にコードレビューして文句を言ってくれます。便利です。

 Windows Driver Kit (WDK) ドキュメント
 http://www.microsoft.com/japan/whdc/DevTools/WDK/WDKdocs.mspx#

オンラインのMSDN Library上で見られるWDKドキュメントと(ほぼ)同じものがダウンロードできます。でもこのツールで検索をかけると、ローカルとオンラインの両方を検索するんですが、オンラインのほうが先に検索結果が出たりします。本末転倒です。(マシンのHDDが遅いだけ・・?)

 Windows Sysinternals
 http://technet.microsoft.com/ja-jp/sysinternals/default.aspx

KdPrint()のアウトプットを拾うのにDebugViewは必須です。アプリケーションの開発でも有名です。

  • ドライバ開発におけるDebugViewの基本的な使い方

1, まずEditメニューのHistory Depthを設定しましょう。適当に10万くらいに。デフォルトが0ですが、これで長時間ランニングしていると無限にログを記録してしまいメモリ食いすぎてスワップします。
2, Windowsの「システムのプロパティ」の「詳細設定」タブの「起動と回復」のウィンドウで、□自動的に再起動するのチェックを外し、「デバッグ情報の書き込み」をカーネルメモリダンプに設定しましょう。
3, DebugViewを立ち上げてドライバの吐き出すログを拾いましょう。BSoD (ブルースクリーン) になっても慌てずに、カーネルメモリのダンプを待ちましょう。
4, 再起動したらDebugViewを立ち上げて、Fileメニューから"Process Crash Dump..."を選択し%SystemRoot%\MEMORY.DMP (例、C:\WINDOWS\MEMORY.DMP) を選択します。するとプログレスバーが出るので待ちます。テキストファイルになって保存されます。これで、BSoD直前までのドライバの吐き出すログを拾うことができます。もしASSERTで落ちてたりすると、その旨が出ているので一発でわかります。


ウェブサイト


Microsoft

WHDC - Windows Hardware Developer Central 日本語版
http://www.microsoft.com/japan/whdc/default.mspx

ドライバーライフサイクルの基礎
http://www.microsoft.com/japan/whdc/driver/default.mspx

Japan WDK Support Blog
http://blogs.msdn.com/jpwdkblog/

MSDN libraryの Kernel-Mode Driver Reference
http://msdn.microsoft.com/en-us/library/ms806377.aspx

http://www.microsoft.com/japan/powerpro/default.mspx

マイクロソフト サポート オンライン
http://support.microsoft.com/search/default.aspx?mode=r&query=%E3%83%89%E3% 83%A9%E3%82%A4%E3%83%90&spid=global&catalog=LCID% 3D1041&1041comm=1&ast=25&ast=28&res=20
検索するとドライバに関する情報が色々出てきます。ただ、ちょっと古いNT,2000,XPの情報が多いです

システムから .inf ファイルを削除する方法
http://support.microsoft.com/kb/813449/ja

個人とサードパーティ

Windowsデバイスドライバ開発のためのヒント
http://www.devdrv.co.jp/windows/

http://blogs.msdn.com/hirosho/default.aspx

http://d.hatena.ne.jp/NyaRuRu/

http://ruffnex.oc.to/kenji/windriver/


フォーラム

http://www.wdddc.net/

http://social.msdn.microsoft.com/Forums/ja-JP/windowsdevicedriverja/threads

Microsoft Connect
https://connect.microsoft.com/default.aspx

試験番号:70-660 TS: Windows Internals
http://www.microsoft.com/japan/learning/mcp/exam.aspx?cert=1&id=70-660

WindowsDDK各種についてのスレ
http://pc12.2ch.net/test/read.cgi/tech/1049116134/


ソース

http://www.google.com/codesearch
http://www.koders.com/
http://hp.vector.co.jp/authors/VA000363/ ERAMがソース公開してる。参考になるかも。
ちなみに、サンプルにもRAMDISKがある。C:\WinDDK\7600.16385.0\src\storage\ramdisk
このWDK 7についてくるサンプルのRamDiskは、WDFで書いてある。ほぼ同じ内容でWDMで書いてあるサンプルも存在する。
http://support.microsoft.com/kb/257405/ja
機能は同じなので、WDMとWDFとでどう違ってくるかの比較の参考にもなるかも。これはだいぶ古いサンプルなので、WDK 7.0.0のcheckedでビルドするとエラーが出てビルドできない。"DEBUG.H"の中に"#pragma warning(disable:4296)"を追加すればOK。

旧バージョンのWDK/DDKのサンプルも参考になる可能性があるので、ダウンロードしてサンプルだけインストールしておくことをオススメする。

ハードウェアの知識

・PCアーキテクチャ (PC-AT, x86/x64 CPU)
・USB (1.1, 2.0, 3.0, UHCI, OHCI, EHCI, xHCI, class-specification)
・IEEE1394
・PCI (2.0, 2.2, 2.1, 3.0)
・PCI Express (1.1, 2.0, 3.0)
・ATA/ATAPI
・SCSI
・Bluetooth
・UART (RS232C,COMポート)