IRP_MJ_CLEANUPとキャッシュマネージャ [ドライバ開発]
Windows 2003 SP2からWindowsファイルシステムのフィルタドライバを開発していて、IRP_MJ_CLEANUPの後にIRP_MJ_WRITEが来るという現象に遭遇した。
いろいろ調べて見ると、IRP_MJ_CLEANUPが来たからといって、IRP_MJ_WRITEが来ないとは限らないらしい。
そこで、今のドライバでは以下のようなことをしていた。
(1)別のDispatchスレッドにPagingIOなリクエストが来てないかどうか調べる
(2)CcFlushCacheでキャッシュを強制的に書き込んだことにする
(3)キャッシュが全部書き出されたかチェックする
1については、あまり効果が無い。IRP_MJ_CLEANUPと同じタイミングで書き出されるとは限らないからだ。2については、これが一番有望で、CcFlushCache自体が同期で動いてくれてるようなので、問題ない。3が一番テクニカルで、BinaryHackのようなことをやっている。
SP2より前のバージョンではこれでうまく動いていた。1と3については、あまり効果が感じられなかったが、2によって、メモリの内容がすべて書き出されているという保証があるため、IRP_MJ_CLEANUPの後にIRP_MJ_WRITEが来ないことが経験的に保証されていた。
ところが、SP2の場合、CcFlushCacheによってCacheManagerがディスクにデータを書き出したとしても、MemoryManagerがそれを検知してないように思える動作をした。それが上記の現象である。せっかくCcFlushCacheでメモリの内容を書き出しているのに、PagingIoリクエストでIRP_MJ_WRITEを送ってくる不思議。明らかにパフォーマンスを落とす実装だと思うし、これはバグではないかと思うのだが、このような現象を問い合わせる先を知らない。
IRP_MJ_CLOSEでなんで実装しないのかという話もあるが、キャッシュを有効に利用するために、OSがIRP_MJ_CLOSEのリクエストをホールドする。そのため、IRP_MJ_CLOSEのタイミングで処理されると、ドライバが本来やりたい処理が、かなり後回しにされてしまい、レスポンスがよくない。
それにしても、CacheManagerのようなOSの機能を使うといろいろとこちら側のドライバでケアしないといけない部分も多く大変苦労する。にもかかわらず、まともな本が1冊(下の本)しかないのに絶版という、日本市場の狭さを感じずにはいられない昨今であった。
Windows NT ファイルシステム詳説―A Developer’s Guide
- 作者: ラジーブ ナガール
- 出版社/メーカー: オライリー・ジャパン
- 発売日: 1999/01
- メディア: 単行本(ソフトカバー)
クラッシュダンプ [ドライバ開発]
ドライバ開発をしていると、よくOSがフリーズしてしまうことがある。
BSOT(ブルースクリーン)の場合、クラッシュダンプが作成されて、後で解析できるのだが、フリーズは非常にたちが悪い。
そこで登場するのが、強制ブルースクリーン発生方法
http://support.microsoft.com/kb/244139/ja
KB244139 - キーボード操作でメモリ ダンプ ファイルを作成できる Windows の機能
これのおかげで、まったく解析が進んでなかったバグ、特にユーザーサイトで発生していたバグをさくっと修正できた。感謝!
ただ、これをやるためにはレジストリにキーを追加したり、右ScrollLockが無いと実行できない!という問題があったのだが、実はGUIでさくっと設定できるらしい
http://blogs.msdn.com/doronh/archive/2007/11/09/why-i-should-not-be-writing-applications.aspx
MSの人のブログみてたら、Windows2000リソースキットに入ってるようだ。そんなもん入れたこと無いからわからんわ。ちなみに名前がcdsetup.exeという紛らわしい名前だというので、そんなすごい人でも名前の付け方は適当なんだなぁと変に感心した。