WDMとNT形式デバイスドライバ
向学のため、いろいろとデバイスドライバを作り、実験をおこなっています。
参考にしている書籍は下記のものです
・技術評論社 「WindowsXPデバイスドライバプログラミング[入門と実践]」 浜田憲一郎著
サンプルがわかりやすい。メモリ関係の扱いが詳しい。読みやすい。
・翔泳社「WDMデバイスドライバ」 Cris Cant著
細かいところまで詳しい。NT形式のドライバまで説明されていてありがたい。
・CQ出版社「Windows2000デバイスドライバ入門」 北山洋幸著
詳しい説明は少ないが、ドライバの実装に必要な「コア」の部分がすぐにわかる。
Windowsのデバイスドライバには、NT形式とWDM形式、さらにはデバイス名を明示的に指定する方法やGUIDを使う方法など、新旧いろいろな方法があり、間違えるとクラッシュします。
本を一読や二読するだけはだめで、何回も繰り返し読み、実験し、クラッシュを繰り返し、ようやくドライバが理解できるようになってきました。
私は、NT形式のドライバをINFでインストールしようとしたり、WDM形式のドライバをServiceManagerでインストールしようとしたりしてハマりました。
これまで実験したところでわかった特徴をまとめておきます。
【WDMデバイスドライバ】
・INFファイルでインストールする
・PNPを実装
・DriverEntryでは実際の処理はしない(関数の登録のみ)
・AddDevice関数でデバイスを初期化する。
・Unload関数の中ではIoDeleteDeviceを行ってはいけない。
・IoDeleteDevice処理は、PNPディスパッチルーチンで行う。PNPのREMOVEの処理は必須。
(INFファイルでの)インストール時の関数呼び出しの順序
1. DriverEntry()を実行
2. AddDeviceに登録された関数を実行
3. PNPディスパッチを実行(0x18 IRP_MN_QUERY_LEGACY_BUS_INFORMATION?)
4. PNPディスパッチを実行(0x0D IRP_MN_FILTER_RESOURCE_REQUIREMENTS)
5. PNPディスパッチを実行(0x00 IRP_MN_START_DEVICE)
6. PNPディスパッチを実行(0x18 IRP_MN_QUERY_PNP_DEVICE_STATE)
7. PNPディスパッチを実行(0x07 IRP_MN_QUERY_DEVICE_RELATIONS)
ドライバ削除時の処理順序
1. PNPディスパッチを実行(0x07 IRP_MN_QUERY_DEVICE_RELATIONS)
2. PNPディスパッチを実行(0x01 IRP_MN_QUERY_REMOVE_DEVICE)
3. PNPディスパッチを実行(0x02 IRP_MN_REMOVE_DEVICE)
4. Unloadを実行
【NT形式デバイスドライバ】
・ServiceManagerでインストールする。
・インストールだけでは何の関数も呼び出されない。
・APIのStartService関数を実行すると、ドライバのDeviceEntryが呼び出される。
・DriverEntry内で実際の初期化処理を行う。
・ControlService(hService, SERVICE_CONTROL_STOP・・・を実行すると、ドライバのUnloadに登録した関数が呼び出される。
・Unloadの中でIoDeleteDeviceの処理を行う。
【互換性】
・NT形式ドライバは、INFファイルを作ってインストールしようとすると、インストールの最後の段階でDriverEntry関数が呼ばれ、その中でデバイスを作ろうとし、青い画面がでてクラッシュする。
・PnP対応のWDM形式のドライバをServiceManagerでインストールしようとすると、実際のDriverEntry関数で何も行われないので、失敗に終わる。クラッシュはしない。
| 固定リンク
コメント