戦略ソフトウェア特論II - Registry and Device Driver 補足資料
TA   千本潤介(bonse@is.s.u-tokyo.ac.jp)
English Page
課題

Registry and Device Driver 課題ファイル(RegistryFilterDriverExercise.pdf)
の、Question, Experiments 全てに回答してください
実装課題については、ソースコードだけでなくプログラムの説明、および考察も書いてください

※ 提出方法・単位についてはこちら

Registry and Device Driverについて

まずはRegistryに関する講義資料を読んでください

Registryのコールバックルーチンについては配布された資料も読んでください。

課題の準備

この課題を行うには2台のコンピュータをシリアルケーブルでつなぐ必要がありますので、 シリアルポートを備えたコンピュータを用意してください。 シリアルケーブルは平木研究室で貸出ししております。また、OSはWindows XP SP1以降である必要があります。

マシンが用意できたら、そのマシンにWindows DDK(Device Driver Kit)をインストールしてください。これは授業中に配布されたCD-Rよりインストール可能です。 debuggerも必要になりますので、インストール時にインストールするか、デバッガのページより ダウンロードしてインストールしてください。デバッガはデフォルトでC:\Program Files\Debugging Tools for Windows\にインストールされるので、 ここにPATHを通すと作業がやりやすくなるでしょう。

ここで、2台のマシン役割を決めます。1台はデバッグ対象のマシン(targetマシン)で、もう一台はデバッグ操作を行うマシン(debugマシン)です。 targetマシンはデバッグモードで起動する必要があるので、C:\boot.iniに以下のようなエントリを追加してください。


multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="WinXP Kernel Debug Mode" /fastdetect /debug /debugport=COM1 /baudrate=9600

/debugportではデバッグに使用するポート(ここではCOM1ポート)を、/baudrateではシリアル通信で使う転送速度を定めています。 /baudrateはWindowsのCOM1ドライバが使用しているレートと同じ値を使用してください。これは、デバイスマネージャで調べることができます。

debugマシン(debuggerがインストールされているディレクトリへのパスが通っているものと仮定します)では、kdもしくはwindbgというツールを使ってシリアル経由でデバッグを行います。kdで、使用ポートとボーレートを指定して起動するには以下のようにコマンドライン引数を与えるとできます。


kd -k com:port="com1",baud=9600

デバッガについての詳細は、デバッガといっしょにインストールされるヘルプ(debugger.chm)に詳しい説明がでておりますので、参考にしてください。

準備の最後に、今回の課題で用いるサンプルは、WINDDKの中の、src\general\cancelにあるので、確認して下さい。 サンプルをインストールしていない場合は、CD-R等からインストールしなおしてください。cancelについての詳しい説明は、 cancelのディレクトリの中にあるcancel.htmを参考にしてください。

課題のヒント

以下、課題の簡単な説明ですが、間違いがある可能性もないとは言えないので、うのみにしないで、あくまでも参考程度にお願いします。

Experiment 1

どこから手を着けていいか分かりにくいかも知れませんが、 Registry Callbacks に書いてあることをそのまますればよろしいです。

つまり、空のコールバックルーチンを作り、それを登録する部分と、登録解除する部分を付け加えればよいのです。コールバックを登録するのは初期化を行うDriverEntry内で、 コールバックを登録解除するのはリソース解除を行うCsampUnload内が適切だと思います。

Experiment 2

Experiment 1で追加したコールバックルーチンに少し手を加えます。具体的にはカウントするための変数を用意し、REG_NOTIFY_CLASSのタイプがRegNtSetValuKeyの時に、 InterlockedIncrementを呼び出して、カウントしていくようにすればよいのです。

Experiment 3

コールバックルーチンの中で、REG_NOTIFY_CLASSがRegNtPreCreateKeyの時と、RegNtPostCreateKeyの時の処理を書き加えます。PsGetCurrentThreadで現在のスレッドを取得できることに注意してください。

現在呼び出しを行っているThreadを管理するためのリストをつくり、Preではそのリストに追加し、Postではリストを検索し、該当するものを探す必要があります。 Postでキー作成に失敗したことを検知した場合は、DbgPrintでデバッガに出力を行えばよろしいです。

Question 4

DPC(Deffered Procedure Call)の仕組みを利用していくことで、遅延呼び出しに対処します。


課題およびこのページに関する質問はbonse@is.s.u-tokyo.ac.jp にメールしてください
ただし、質問が高度な内容の場合、時間がかかってしまう可能性があります、、

TOPへ戻る