SoftEther VPN Client 2.0 仮想 LAN カードデバイスドライバ
『SoftEther VPN Client 2.0 仮想 LAN カードデバイスドライバ』は色々な高速化・最適化手法を施したので、SoftEther 1.0 のコードは継承せずに、完全に1行目から書き直した。これまでうまく動いていたのだが、なんと、
SoftEther VPN Client 2.0 の仮想 LAN カードをインストールすると、ノート PC などでサスペンド/ハイバネーションが正しく動作しなくなる
ということが発覚。丸1日かけて原因を探した。
具体的には、2.0 の仮想 LAN カードが動いているとき、サスペンド/ハイバネーションには入れるのだが、戻ってこれなくなる (画面に何も表示されないし、何も動かないので、強制再起動するしかない) というものである。
普通、NT のカーネルモードでバグチェックが起こったら、ハードディスクにメモリダンプが書き出されて、画面に STOP コードが表示されて、再起動する。再起動後にカーネルモードデバッガ (windbg など) を使用して、ドライバ内のどこが悪いのかを原因究明 (犯人探し) する。大抵の自分で書いたバグは、この段階で発見できる。
しかし、この「サスペンド/ハイバネーションが正しく動作しなくなる」という問題の原因究明は極めて困難だった。
サスペンド状態から復帰するときに Windows は Plug & Play に対応したデバイスドライバを再初期化するのだが、その際にメモリアクセス違反が発生しており、その場所を示す BugCheck (メモリダンプ) が本来保存されるべきなのに、ハードディスクドライバとファイルシステムの初期化がまだ終わっていない段階で仮想 LAN カードの初期化を行おうとして落ちるので、ダンプファイルがディスクに残らない。ビデオドライバの初期化もまだなので、ブルースクリーンにもならずに画面も真っ暗の状態でフリーズする。
Windows 2000 の Checked Build (カーネルモードプログラム開発者向けに配布される特別なバージョン) でやってみても、結果は芳しくない。
仮に SoftICE を使っても、サスペンドから復帰するところでしか発生しないバグをデバッグするのは難しいのだろうか。
結局、デバッガには頼ることができず、数千行あるカーネルコードをひたすら追いかけてバグを見つけた。
レーベンホルムには行かない...