article皆さん、はじめまして。沢さんに続いて新しくチームに加入いたしましたので、これからよろしくお願いします。ディスパッチルーチンの登録方法の違いについてご紹介したいと思います。いうドライバモデルに分類されます。ついてもうご存知でいらっしゃる方が多いと思いますが、このブログではあまり触れられていません。本題に入る前に、まずはその概要をご紹介したいと思います。いうモデルがありますが、後者の方はカーネルモードのドライバしか作成できません。ユーザーモードドライバ開発用フレームワークは、WDFの誕生と同時に提供されました。二種類のモデルができました。基にした新しいドライバーモデルであり、デザインに大きな違いがあります。ソースコードを例としてお見せしたいと思います。ちなみに、ディスパッチルーチンと言うのは、アプリケーションやOSから来るリクエスト等を処理するための仕組みです。どのようにディスパッチルーチンが登録されているか見てみましょう。書かれていますので、そちらの方もご覧になっていただければと思います。ディスパッチルーチンの登録方法からおさらいしてみましょう。DRIVER_OBJECT構造体のメンバを直接アクセスしてディスパッチルーチン関数を登録していきます。ディスパッチルーチンの登録方法を見てみます。WdfDriverCreate(DriverObject,RegistryPath,WDF_NO_OBJECT_ATTRIBUTES,&config,&driver);::大まかな流れとしては以下の通りになります。場合とは全く別の形をしたコードとなっています。ここでディスパッチルーチンの登録を行っていない点にご留意ください。いう関数だけを登録しています。それぞれの関数の詳細については以下のドキュメントをご覧ください。それぞれのドライバで、ディスパッチルーチンがどのように登録されているのかデバッガーを使って見てみましょう。ディスパッチルーチンがいくつか設定されているのが確認できます。Wdf01000!FxDevice::DispatchWithLock::このように、すべてのルーチンが抽象化されて登録されていることがわかります。版ではディスパッチルーチンを登録していません。そのほかのディスパッチルーチンはどうやって登録されたのでしょう。実は、デフォルトの関数がフレームワークによって自動的に登録されているのです。いう関数になっています。フレームワークが用意したラッパー関数を通して間接的に処理されるようになっているのです。詳細なデバイス制御をしたいときには独自の関数を登録します。関数内で登録をおこないます。登録する関数は「コールバック関数」と呼ばれています。構造体(変数はDriver)には触れていません。上記コードにある関数にそれぞれの仕様がございますので、ご確認ください。例として、以下のドキュメントをご覧になっていただければと思います。比較はこれくらいにして、結論に入りたいと思います。先ほど「KMDFはWDMを基にした」と書きました通り、動作的にはモデル間に違いはありません。新しいモデルを作ったのでしょうか?WDMではモデルの全体的な仕組みをローレベルで理解できるスキルが必要とされていましたが、それでは敷居が高すぎるのではないかということで、オブジェクト指向の特徴を活かしたWDFが生まれたのです。フレームワークがドライバを実装する際に共通で必要な処理を行ってくれるので、開発者はドライバの対象となるデバイスに合わせた関数をデザインするだけで大丈夫、という意図で作られたモデルということになります。今回は「ディスパッチルーチンの登録方法」という観点で、WDMとKMDFの違いを紹介しただけであって、WDMとの良し悪しを比べているわけではありません。KMDFの方が楽という方もいれば、WDMの方が自由度があるという方もいますし、結局は自分の性格や目的にあったモデルを選ぶのが一番だと思います。どちらもお試しいただいて、その違いを実感していただければ幸いです。FeedbackTrademarks。