Old New Thing: ブルースクリーンを書いた人間は、まあ、僕さ
Old New Thingの著者で、古参MS社員のRaymond Chenが、Windows 95のブルースクリーンを書いた時のことをブログに書いている。
I wrote the original blue screen of death, sort of - The Old New Thing - Site Home - MSDN Blogs
この前、Windows 95の話を持ちだした。ここで書いたように、Ctrl + Alt + Delダイアログは、Windows 3.1で導入され、Windows 95では、すでになくなった。Windows 95では、Ctrl + Alt + Delを押すと、以下のようなダイアログボックスが表示される。
Close Program × ExplorerContoso Deluxe Composer [not responding]Fabrikam Chart 2.0LitWare Chess ChallengerSystrayWARNING: Pressing CTRL+ALT+DEL again will restart your computer. You will lose unsaved information in all programs that are running. End TaskShut DownCancel(Systrayについては以前学んだよね)
Windows 3.1では、深刻なエラーではクラッシュしてブラックスクリーンになったが、Windows 95では、青で表示するようにした。僕はそのコードを書いたうちの一人だ。少なくとも、最後に書き換えた人間だな。
私はブルースクリーンメッセージを表示するコードを担当していた。カーネルモードビデオドライバーにテキストモードに切り替えるよう指示し、画面を青背景にして、白文字を表示して、ユーザーがキー入力をするのを待ち、画面を元に戻し、ユーザーの入力を、メッセージを表示するよう要請したコンポーネントに伝える[1]。
デバイスドライバーがクラッシュした場合、Windows 95はカーネルモードコンポーネント内の深刻な問題に、最善を尽くして対処しようとする。死の青画面(blue screen of death)というべきなのか、不便な青画面(blue screen of lameness)というべきなのか。ブルースクリーンを見たことがない幸運なもののために、以下がその例だ。
WindowsAn exception 0D has occurred at 0028:80014812. This was called from 0028:80014C34. It may be possible to continue normally.* Press any key to attempt to continue.* Press CTRL+ALT+DEL to restart your computer. You willlose any unsaved information in all applications.「通常通り動作を実行できるかもしれませんよ」という楽観的な文面に注目されたい。みんな忘れているが、Windows 95は、ブルースクリーンエラーを表示した後、なるべくそのエラーを無視して実行し続けようとすることだ。つまり、まあ、スキャナーのドライバーはクラッシュしたので、スキャナーは動かなくなったかもしれないけれど、それ以外のシステムは無事だというわけだ。
(これを今日おこなったらどうなるだろうか。「カーネルパニックを無視するには何かのキーを押してください」)
技術的に何が行われているかというと、バーチャルマシンマネージャーが現在行われているイベントを破棄して、イベントディスパッチャーに戻るのだ。これは、カーネル内における、例外をウインドウプロシージャで飲み込んで、メッセージループに戻るようなものだ。継続できるイベントがなければ、現在のアプリケーションが終了される。
時に、問題はシステム全体に及ぶこともあり、現在のイベントを破棄したり、アプリケーションを終了しても、問題を解決しないことがある。次に起こるのは、次のイベントやアプリケーションが、同じ問題に引っかかり、数ミリ秒後に、またブルースクリーンメッセージを目にするということだ。何回か似たようなメッセージを目にした後、おそらくは諦めて、Ctrl + Alt + Delを押すだろう。
さて、当初のメッセージは、上のようであった。しかし、メッセージには問題上がる。デバイスドライバーがカーネルに読み込まれるアドレスというのは予測可能ではないので、生のアドレスが表示されていても、大して役に立たない。もし誰かが、「うちんとこの重役がこんなクラッシュメッセージ出したんだけど、何があったか分かるかい?」と言われたとしても、得られるのは無意味な数値だけだ。
その誰かというのは、僕でもあったわけだ。
この問題に対処しやすくするために、僕はメッセージを書き開けて、ドライバーの名前と、セクション番号と、セクションからのオフセットを追加した。
WindowsAn exception 0D has occurred at 0028:80014812 in VxDCONTOSO(03) + 00000152. This was called from 0028:80014C34 in VxDCONTOSO(03) + 00000574. It may be possible to continue normally.* Press any key to attempt to continue.* Press CTRL+ALT+DEL to restart your computer. You willlose any unsaved information in all applications.これで、クラッシュしたドライバーの名前が分かる。何もわからなかったとしても、問題がどこにあるかのヒントは得られるわけだ。ドライバーのMAPファイルにアクセスした誰かさんは、アドレスを探して、クラッシュした箇所を特定できる。最高ではないにせよ、何もないよりマシだ。僕がこの変更をするまでは、何もなかったのだ。
そういうわけで、僕は
死不便なブルースクリーンを、僕の仕事を多少マシにするために書き換えたと言える。余話:その後、誰か(僕だったかどうかは覚えていないので、誰か同僚としておこう)が、クラッシュアドレスを調べるためのコードを追加した。もし、箇所がカーネルのヒープマネージャー出会ったアバイ、メッセージは多少変更される。
WindowsA 32-bit device driver has corrupted critical system memory, resulting in an exception 0D at 0028:80001812 in VxDVMM(01) + 00001812. This was called from 0028:80014C34 in VxDCONTOSO(03) + 00000575.* Press any key to attempt to continue.* Press CTRL+ALT+DEL to restart your computer. You willlose any unsaved information in all applications.この場合、「通常通り動作を実行できるかもしれませんよ」という文面が消える。なぜなら、この場合、そういうことはまずないからだ。
余話:よくやったな。Slashdot君。訂正をしたつもりかもしれないが、その訂正も間違っているよ。まあ、間違いには気がついたみたいだけどね。
[1]: このコードはカーネルで動くので、キーボードレイアウト情報にはアクセスできない。読者がChinese-Bopomofoキーボードレイアウトを使っているかどうかなんてわかりっこない。その場合、"OK"とタイプするには、C, L, 3だ。特に訳には立たないけどね。カーネルにはIMEなんてないんだから。そういうわけで、入力は、EnterとかESCみたいな、言語からは独立したキーに割り当てられていた。
だいぶ久しぶりにOld New Thingを訳した気がする。以前はだいぶ苦労していた翻訳も、今はそれほど苦労しないのは、英語力が上がったからであろうか。それとも単に慣れたのか。