WDM vs WDF

はじめまして、apsevと申します。

6年ぶりにPCI/USBドライバを作ることになりました。知識がWDMで止まっていて、WDFの存在を最近知りました。できることに違いは無いようですが、これから作るドライバをWDMにするか、WDFにするか迷っています。サンプルソースを見ると両者は結構違いますし。開発の容易さや今後の業界動向等を加味して、WDM/WDFどちらが良いか、その道のプロの方々よりアドバイス頂けると嬉しいです。

…あの頃はSoftICEという超便利ツールに助けられました。また欲しいです。

こんにちは。 WDFはフ

こんにちは。
WDFはフレームワークとしてまとまっているので、開発が楽と(Microsoftは)言っていたような気がします。
(特に電源管理とかその周り)
あとUMDFの場合ユーザーモードで動作するので、安定する上に、C++が使えるのがメリットかと思います。
個人的にはC++でアプリケーション開発の要領でドライバ作成できるのは魅力です。

私は正直あまり使ったことがないので、これ以上わかりません。
hidakaさんの降臨を待ちましょう!

#SoftICE便利ですよね。つい最近まで使っていました。

hidakaです。 PCIの一般

hidakaです。

PCIの一般的なIOデバイスやUSBのベンダ固有デバイス用のドライバの新規開発ならば、WDF/KMDFの利用がお勧めです。

私の知っている事例だと、約10年ぶりにドライバを開発したWDF未経験の人が、KMDFで新規のPCIのドライバを2週間程度で動くようにしました。
コード量はWDMの半分以下にはなると思います。DTMのロゴテストもほぼ一発で通りました。同じバイナリで2000からVistaまで動きます。
開発のヒントとしては、Developing Drivers with the Windows Driver Foundation の本を良く読む事です。

デバッグは2台のPCを1394で接続してWinDBGを使います。デバッグ・メッセージの表示はtrace(WPP tracing)を使います。
私も3年ぐらい前まではdbgprintとSoftICEの世話になっていましたが、慣れれば新しい方が便利です。

さてUMDFですが、
実はつい最近まで、UMDFでWindows 7のセンサ&ロケーション用のデバイスドライバというのを開発していました。
私にとっては久しぶりの大きめなC++のコードとなりました。本格的なCOMは今回がほぼ初体験です。
正直にいいますと、慣れも大きいでしょうが、入出力やドライバ内でのバッファ処理が中心ならば、KMDFの方が楽だと思います。

UMDFのデバッグはそれなりに楽ですが、コンパイラ(うろ覚えなVC++の進化した言語仕様の勉強)とクラス・ライブラリ、
沢山あるインクルード・ファイルの名前の衝突と自身で設計するクラス構造の善し悪しとの戦いです。
コンパイルを通すまでが大変でした。ドライバを動かそうにも、インクルード・ファイルの制約による、
ソース・ファイル分割と自作のクラスライブラリの見直しがチャンとできないと、バイナリが出来ません。

一旦バイナリが出来るようになれば、デバッグは直ぐです。
カーネル・モードのドライバの開発の時と比べると、時間をかける部分が違うという感じでした。

この時の苦労話は、後で記事にする予定です。

apsevです。 poolさん、h

apsevです。
poolさん、hidakaさん、お返事感謝です。

WDKのKMDFサンプル(PLX9x5x)を参考にテキトウに作ってみたところ、コンフィグレーションまでの
ドライバは1日程度で出来ました。WdfCoInstallerの挙動が一番苦労しました。何で動いているのか
まだよく分かっていません(?)が、これからIOアクセス、割込み、DMA等を入れて、hidakaさんご指摘の通り、
2週間もあればどうにかなりそうと感じてます。hidekaさんの言うメリットにも魅かれるので、KMDFで
進めようと決心しました。

# なぜかTraceEvents()ではWinDbgに表示できず、DbgPrintEx()使ってますが。。。

> この時の苦労話は、後で記事にする予定です。

先人の苦労話は大変参考になります。楽しみにしています。
私の苦労話も、ボチボチここに載せられればと思っています。