ほっしーの技術ネタ備忘録

技術ネタの備忘録です。基本的に私が忘れないためのものです。他の人の役にも立つといいなぁ。

オブジェクト指向でドライバ開発

Windows XP, Vista では User-mode Driver Framework (UMDF) という
ユーザモードで走るドライバ開発のフレームワークがあるみたい。


しかも、ドライバが COM サーバとして書けるようだ。


…デバドラがオブジェクト指向な時代がついに到来か!!


というわけで Microsoft にあったドキュメントを読んでみた。
全訳しても何の意味もないので(読めばいいだけだし)
要点だけ備忘録としてメモメモ。

紹介

  • Windows XP, Vista で使用可能
  • カメラ・ポータブルミュージックプレイヤーのような Protocol Device Class に対応
  • Protocol-based or serial bus based ( ex. USB ) なドライバ
    • PDA や携帯のような Portable strage
    • Portable media player
    • USB バルク転送
    • 補助ディスプレイデバイス
  • バイスは直接もしくはネットワークや無線 ( Bluetooth ) を介して接続可能
  • ソフトウェアのみで完結するドライバも対応
  • 以下を必要とするドライバは KernelMode にて
    • 割り込み制御
    • DMA のようなハードウェアへの直接アクセス
    • 厳密なタイミング制御
    • nonpaged pool やその他 KernelMode で予約されたリソース

動作モデル

  • 動作の肝となるモジュール
    • Reflector
      • KernelMode のフィルタドライバ。Kernel からの I/O などの通信を拿捕して UserMode 側とのやり取りを行う。
    • Host process
      • "Windows Driver Foundation - User-mode Driver Framework" という名前の Windows サービス。UserMode で動いていて、Reflector と直接通信する。COM である UserMode ドライバの親となる。
  • UMDF は COM のサブセットとして、COM プログラミングパターン
  • COM のすべての機能を使うわけではない
    • 寿命管理とインターフェースのみを活用
    • IUnknown から派生し、AddRef, Release, QueryInterface を実装
  • UMDF は LocalService セキュリティコンテキストで走る

UMDF ドライバの実装

  • Win32 API や、その他 UserMode ライブラリが利用可能
  • 以下のものを必ず実装すること
    • COM で必要な DllGetClassObject 関数
    • DriverObject 生成のための IClassFactory クラス
    • 各ドライバクラスに IDriverEntry インターフェースの実装

実装のメモ

  • UMDF の設定は、初期化時に IWDFDeviceInitialize::RetrieveDevicePropertyStore メソッド
    • IWDFNamedPropertyStore のポインタがもらえる
  • IWDFDeviceInitialize::AutoForwardCreateCleanupClose
  • IQueueCallbackCreate::OnCreateFile は実装しないと成功したことになるので注意。
    • 明示的に失敗を return しよう
  • IFileCallbackCleanup, IFileCallbackClose も存在しないと自動成功