Windows XP デバイスドライバプログラミング
[入門と実践]

[表紙]Windows XP デバイスドライバプログラミング[入門と実践]

紙版発売

B5変形判/704ページ/CD1枚

定価5,280円(本体4,800円+税10%)

ISBN 4-7741-1841-9

ただいま弊社在庫はございません。

→学校・法人一括購入ご検討の皆様へ

書籍の概要

この本の概要

本書は,第一線で活躍する著者が書き下ろしたデバイスドライバ解説書です。最新のUSB2.0を主題に,開発に欠かせない基礎知識から実践テクニックまで,あらゆるノウハウを凝縮。必要な情報がなかなか手に入らなかった,すべてのドライバ開発者待望の1冊です。

こんな方におすすめ

  • Windows XPのデバイスドライバ開発者
  • デバイスドライバのしくみに興味がある方
  • USB2.0について知りたい方

目次

第1章 WDMデバイスドライバ開発の基礎

WindowsXPデバイスドライバの基本構造

  • 1-1 デバイスドライバというソフトウェアの基礎
    • 1-1-1 デバイスドライバとは
    • 1-1-2 なぜデバイスドライバが必要なのか? 〜デバイスドライバの誕生〜
    • 1-1-3 複雑化するデバイスドライバ
    • 1-1-4 OSとデバイスドライバ
    • 1-1-5 一般的なデバイスドライバの構造
  • 1-2 Windowsデバイスドライバの変遷とWDMの誕生
    • 1-2-1 WDMの基本はWindows NTのデバイスドライバ
    • 1-2-2 Windows 9XとWindows NTをつないだWDM
  • 1-3 WDMデバイスドライバの基本構造
    • 1-3-1 いきなりコードを見てみる
    • 1-3-2 DriverEntry関数って何?
    • 1-3-3 DriverEntry関数では何をやっているか?
  • 1-4 ドライバ間での同期 〜「イベント」を理解する〜
    • 1-4-1 イベント処理の基本概念 〜割り込みをどう処理するか?〜
    • 1-4-2 ドライバ間通信の関連APIとIRQL
    • 1-4-3 バスデバイスドライバとの通信終了の処理方法
  • 1-5 ドライバの管理およびドライバ間通信の方法
    • 1-5-1 ドライバを管理する3つの構造体
    • 1-5-2 ドライバオブジェクト構造体
    • 1-5-3 デバイスオブジェクト構造体
    • 1-5-4 IRP構造体
    • 1-5-5 I/Oスタックロケーション
    • 1-5-6 IRPを使ったドライバ間通信
  • 1-6 デバイスドライバのセットアップとAddDevice関数
    • 1-6-1 デバイスドライバのセットアップの仕組み
    • 1-6-2 INFファイル
    • 1-6-3 デバイスドライバ開発時に必要なレジストリデータ
    • 1-6-4 AddDevice関数によるデバイス初期化
  • 1-7 プラグ&プレイ
    • 1-7-1 プラグ&プレイの動作概要
    • 1-7-2 プラグ&プレイで処理する項目
    • 1-7-3 プラグ&プレイ処理関数の概要
    • 1-7-4 プラグ&プレイ処理のコード例
  • 1-8 電源管理の仕組み
    • 1-8-1 WDMでの電源管理
    • 1-8-2 電源管理での処理内容について
    • 1-8-3 電源管理のコード例
  • 1-9 デバイスドライバでのデバイス制御部分
    • 1-9-1 デバイスドライバのオープンとクローズ
    • 1-9-2 WDMでのメモリの取り扱いについて
    • 1-9-3 デバイスドライバのリード/ライト処理
    • 1-9-4 デバイスドライバのI/O制御処理
  •   コラム デバイスドライバ開発ツール

第2章 USB2.0の基礎知識

デバイスドライバ開発に必要なデータ転送プロトコルを理解する

  • 2-1 USBとは
  • 2-2 USBの4種類のデータ転送方式
    • 2-2-1 コントロール転送
    • 2-2-2 バルク転送
    • 2-2-3 インタラプト転送
    • 2-2-4 アイソクロナス転送
  • 2-3 アドレスとエンドポイント
    • 2-3-1 ホストはUSBデバイスをアドレスで指定する
    • 2-3-2 転送形態を管理するエンドポイント
  • 2-4 パケットとトランザクション
    • 2-4-1 パケット
    • 2-4-2 トランザクション
    • 2-4-3 各転送のトランザクション構成
  • 2-5 USBデバイスの構成
  • 2-6 ディスクリプタ
    • 2-6-1 デバイスディスクリプタ
    • 2-6-2 コンフィギュレーションディスクリプタ
    • 2-6-3 インターフェースディスクリプタ
    • 2-6-4 エンドポイントディスクリプタ
    • 2-6-5 ストリングディスクリプタ
  • 2-7 リクエスト
    • 2-7-1 標準リクエスト
    • 2-7-2 クラスリクエストとベンダーリクエスト
  • 2-8 USBデバイスのエニュメレーション
  • 2-9 USB2.0での変更点
    • 2-9-1 USB2.0の特徴
    • 2-9-2 マイクロフレーム
    • 2-9-3 パケットサイズの変更
    • 2-9-4 PIDの追加
    • 2-9-5 ディスクリプタの追加/変更
    • 2-9-6 スプリットトランザクション
    • 2-9-7 PINGプロトコル
  • 2-10 クラスの定義例 〜マスストレージクラス〜
    • 2-10-1 マスストレージクラスの特徴:SCSI→ATA→ATAPI→USBの歴史
    • 2-10-2 2つのマスストレージクラス
    • 2-10-3 CB/CBIデバイス
    • 2-10-4 バルクオンリーデバイス
    • 2-10-5 ATAPIコマンドプロトコルの概要

第3章 Windows XP上でのUSBデバイスドライバの取り扱い方法

  • 3-1 USBデバイスドライバの概要
    • 3-1-1 USBバスデバイスドライバの構造
    • 3-1-2 互換性の問題
    • 3-1-3 クラスデバイスドライバと標準サポート
  • 3-2 USBホストコントローラドライバとのインターフェース
    • 3-2-1 インターフェース概要
    • 3-2-2 URBの定義
    • 3-2-3 USBデバイスを管理する構造体
    • 3-2-4 URBマクロ
  • 3-3 URBをUSBホストコントローラドライバに転送する方法
  • 3-4 USBファンクションデバイスドライバの初期化処理
    • 3-4-1 デバイスドライバの選択と初期化処理を記述する場所
    • 3-4-2 デバイススタート処理で記述すべきこと
    • 3-4-3 デバイススタート処理の記述例
    • 3-4-4 デバイスリムーブ処理
  • 3-5 URBを使ってのUSBデバイス制御
    • 3-5-1 リクエスト発行(コントロール転送)
    • 3-5-2 バルク転送とインタラプト転送 〜両者に記述上の違いはない〜
    • 3-5-3 パイプリセット(STALL解除)処理
    • 3-5-4 アイソクロナス転送
  • 3-6 Windows XPで追加された機能
    • 3-6-1 USBバスインターフェース構造体
    • 3-6-2 USBホストコントローラドライバを直接呼び出せる関数
    • 3-6-3 USBバスインターフェース構造体を使用したコード例

第4章 DDKでのUSBデバイスドライバ開発

USBのデバイスドライバを実際に作成してみる

  • 4-1 開発環境のセットアップ
    • 4-1-1 開発を行うために必要なもの
    • 4-1-2 ハードウェア環境の整備
    • 4-1-3 ソフトウェア環境の整備
  • 4-2 DDKの構成とUSB View
    • 4-2-1 DDKの構成
    • 4-2-2 USB Viewとは
    • 4-2-3 USB View のビルド 〜DDKでのビルド作業〜
    • 4-2-4 USB Viewを使ったUSBデバイスの調査
  • 4-3 USB接続のCD-ROMドライブのデバイスドライバの仕様
    • 4-3-1 作成するデバイスドライバの機能
    • 4-3-2 アプリケーションとデバイスドライバの作業分担
    • 4-3-3 DeviceIoControlでの各制御項目の役割
  • 4-4 “Hello World”デバイスドライバを作成?
    • 4-4-1 本デバイスドライバの構成
    • 4-4-2 デバイスドライバの記述
    • 4-4-3 ドライバをビルドするのに必要なファイル
    • 4-4-4 デバイスドライバのビルド
  • 4-5 INFファイルの作成とインストール
    • 4-5-1 INFファイルの作成
    • 4-5-2 ターゲットPCへのデバイスドライバのインストール
    • 4-5-3 インストールに失敗した理由
  • 4-6 WinDbgによるデバッグ
    • 4-6-1 WinDbgを使ってみる
    • 4-6-2 ソースファイルを使ったシンボルデバッグの準備
    • 4-6-3 ブレークポイント
    • 4-6-4 ローカル変数確認
    • 4-6-5 メモリ内容確認
    • 4-6-6 クラッシュ時の表示の確認
  • 4-7 AddDevice関数の実装
    • 4-7-1 GUIDの作成
    • 4-7-2 GUIDとDeviceExtension構造体の記述
    • 4-7-3 AddDevice関数のコーディング
    • 4-7-4 AddDevice関数の実行
  • 4-8 プラグ&プレイ関数の実装
    • 4-8-1 基本的なプラグ&プレイ処理の実装
    • 4-8-2 USBデバイスの初期化処理の実装
    • 4-8-3 プラグ&プレイの挙動調査 〜取り外せないデバイス〜
  • 4-9 アプリケーションとのインターフェース
    • 4-9-1 デバイスドライバをオープンするアプリケーションの作成
    • 4-9-2 デバイスドライバ側の対応と実行例
  • 4-10 DeviceIoControl関数を使った制御
    • 4-10-1 DeviceIoControl関数
    • 4-10-2 本デバイスドライバで使用する制御コード
    • 4-10-3 デバイスドライバの実装
    • 4-10-4 アプリケーションの実装
    • 4-10-5 DeviceIoControlによるデバイス制御の実行
  • 4-11 クラスリクエスト発行処理の実装
    • 4-11-1 クラスリクエスト発行のコード
  • 4-12 リード/ライト処理 〜バルク転送〜
    • 4-12-1 ダイレクトI/Oのリード/ライト処理(ドライバ)
    • 4-12-2 リード/ライト処理のテスト
    • 4-12-3 バルク転送を行うリード/ライト処理の手順
    • 4-12-4 バルク転送処理のコード
  • 4-13 ATAPIデバイスの情報の表示
    • 4-13-1 ATAPIコマンド処理の手順
    • 4-13-2 Inquiry処理のコード
    • 4-13-3 Inquiry処理の実行
  • 4-14 STALL対策コードの実装
    • 4-14-1 STALLを出させるには
    • 4-14-2 ReadCapacity処理によるSTALLの実現
    • 4-14-3 パイプリセット処理の実装
    • 4-14-4 パイプリセットの確認
  • 4-15 デバイススピードチェック機能の実装
    • 4-15-1 USBバスインターフェース構造体を取得するコード
    • 4-15-2 デバイスのスピードチェック部分の記述
    • 4-15-3 アプリケーションによるチェック
  • 4-16 電源管理処理の実装
    • 4-16-1 USBファンクションデバイスドライバの電源管理
    • 4-16-2 DEVICE_CAPABILITIESの取得
    • 4-16-3 電源管理処理
    • 4-16-4 実装された電源管理処理の確認

第5章 USBアプリケーションの作成

アプリケーションを作成してデバイスを動かしてみる

  • 5-1 アプリケーションプログラムの仕様
  • 5-2 テストファイルの文法
  • 5-3 ベースプロジェクトについて
  • 5-4 基本的な関数の実装
    • 5-4-1 アプリケーション終了時の関数の実装
    • 5-4-2 リストボックス関連のユーティリティ関数
  • 5-5 テストプログラムのクラス仕様
  • 5-6 USBデバイスクラスの実装
    • 5-6-1 ヘッダの定義
    • 5-6-2 ハンドルの取得処理
    • 5-6-3 デバイスドライバのオープン/クローズ処理
    • 5-6-4 デバイスクラスの取得
    • 5-6-5 クラスリクエストの発行
    • 5-6-6 バルク転送
    • 5-6-7 デバイス速度のチェック
    • 5-6-8 デバイスドライバにアクセスするための記述
    • 5-6-9 USBデバイスのテスト
  • 5-7 USBストレージデバイスクラスの実装
    • 5-7-1 USBストレージデバイスクラスの記述
    • 5-7-2 CB/CBIストレージデバイスクラスの実装
    • 5-7-3 バルクオンリーストレージデバイス
    • 5-7-4 ストレージデバイスのテスト
  • 5-8 USBストレージテストクラスの実装
    • 5-8-1 初期化処理
    • 5-8-2 終了処理
    • 5-8-3 ATAPIコマンドのテスト
    • 5-8-4 プロダクト名の取得処理とデバイスクラスの取得処理
    • 5-8-5 RequestSense,ReadCapacity,Inquiryの各コマンドの発行処理
    • 5-8-6 デバイス速度およびCBIストレージクラスかどうかのチェック
    • 5-8-7 CUsbtestDlgクラスを実装してのテスト
  • 5-9 テストファイルクラスの実装および最終テスト
    • 5-9-1 テストファイルクラスの実装
    • 5-9-2 テストアプリケーションを完成させる
    • 5-9-3 テストファイルを使ったATAPI処理
  • 5-10 CDの再生
    • 5-10-1 音楽再生テストで使うコマンド
    • 5-10-2 音楽CDの内容のチェック
    • 5-10-3 音楽CDの再生/確認/ストップ

第6章 DriverWorksによるデバイスドライバ開発の基礎

WDMをクラス化したデバイスドライバ開発ツール

  • 6-1 DriverStudioについて
    • 6-1-1 DriverWorksの特徴
    • 6-1-2 SoftICEの特徴
  • 6-2 DriverWorksにおけるデバイスドライバモデル
    • 6-2-1 派生したクラスにデバイス特有の記述を行えばよい
    • 6-2-2 もとの3つの構造体とクラスの関係
    • 6-2-3 3つのクラスの機能
    • 6-2-4 もう1つ重要なKPnpLowerDeviceクラス
    • 6-2-5 デバイスドライバ開発では2つのクラスを実装する
  • 6-3 USBデバイスドライバ作成時に必要となる基本的なクラス
    • 6-3-1 KDriverクラス
    • 6-3-2 KPnpDeviceクラス
    • 6-3-3 KPnpLowerDeviceクラス
    • 6-3-4 KIrpクラス
    • 6-3-5 KEventクラス
    • 6-3-6 KMemoryクラス
    • 6-3-7 KUsbLowerDeviceクラス
    • 6-3-8 KUsbInterfaceクラス
    • 6-3-9 KUsbPipeクラス
  • 6-4 USBファンクションデバイスドライバの構造
    • 6-4-1 USBファンクションデバイスドライバの構造
    • 6-4-2 デバイスドライバの初期化
    • 6-4-3 デバイス初期化処理
    • 6-4-4 デバイス削除処理
    • 6-4-5 USBファンクションデバイスドライバの電源管理
    • 6-4-6 オープン/クローズ処理
    • 6-4-7 リード/ライト処理
    • 6-4-8 DeviceIoControlによるデバイス制御処理
  • 6-5 DDKコードとDriverWorksコードのAPI変換表

第7章 デバイスドライバ開発の実際

オブジェクト指向デバイスドライバの作成

  • 7-1 DriverStudioを使ったデバイスドライバ開発
    • 7-1-1 開発を行うために必要なもの
    • 7-1-2 DriverStudioのインストール
  • 7-2 SoftICEによるリモートデバッグの準備
    • 7-2-1 ターゲットPCの準備
    • 7-2-2 ホストPCの準備
  • 7-3 DriverWorksのライブラリをビルドする
    • 7-3-1 ライブラリのビルド
    • 7-3-2 ライブラリの修正 〜USB部分を修正する〜
  • 7-4 DriverWorksによるデバイスドライバ作成
    • 7-4-1 ドライバウィザードでプロジェクトを生成
    • 7-4-2 プロジェクトの修正
    • 7-4-3 ドライバのビルド
    • 7-4-4 作成したドライバのインストールとテスト
  • 7-5 SoftICEによるデバッグとドライバの動作確認
    • 7-5-1 デバッグ用のコード変更
    • 7-5-2 シンボルファイルの作成
    • 7-5-3 シンボルファイルのロード
    • 7-5-4 SoftICEを使ってみる
    • 7-5-5 電源管理処理のチェック
    • 7-5-6 システムクラッシュの確認
    • 7-5-7 SoftICEでのデバッグのまとめ
  • 7-6 DeviceControl関数への実装
    • 7-6-1 コンフィギュレーションディスクリプタの取得
    • 7-6-2 クラスリクエストの発行
    • 7-6-3 Inquiryの発行の確認
  • 7-7 USBパイプリセット 〜エンドポイント制御の実装〜
    • 7-7-1 UsbtestDeviceクラスへのメンバの追加
    • 7-7-2 リード/ライト終了処理の修正
    • 7-7-3 IOCTL_USB_RESET_PIPE_Handler関数の実装
    • 7-7-4 テストプログラムによる検証
  • 7-8 USBバスインターフェース構造体の処理
    • 7-8-1 クラスライブラリの修正
    • 7-8-2 IOCTL_USB_CHECK_SPEED_Handler関数の修正
    • 7-8-3 テストプログラムの実行
  • 7-9 テストアプリケーションの実行
  • 7-10 DriverStudioを使った開発のまとめ

Appendix

  • A. 既存ドライバからUSBドライバへの置き換えについての考察
  • B. Windows 98/MeのUSBデバイスドライバをWindows XPに対応させるには
  • C. CD-ROMドライブ以外のUSBデバイスに対応したデバイスドライバを開発する場合のポイント
  • D. SoftICEでシリアルデバッグを行う
  • E. Visual C++ .NETによるアプリケーション開発
  • F. DriverStudio3.0を使ったドライバ開発