本の虫

著者:江添亮
ブログ: http://cpplover.blogspot.jp/
メール: boostcpp@gmail.com
Twitter: https://twitter.com/EzoeRyou
GitHub: https://github.com/EzoeRyou

アマゾンの江添のほしい物リストを著者に送るとブログ記事のネタになる

筆者にブログのネタになる品物を直接送りたい場合、住所をメールで質問してください。

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 × 
Explorer
Contoso Deluxe Composer [not responding]
Fabrikam Chart 2.0
LitWare Chess Challenger
Systray
WARNING: Pressing CTRL+ALT+DEL again will restart your computer. You will lose unsaved information in all programs that are running.
End Task
Shut Down
Cancel

(Systrayについては以前学んだよね)

Windows 3.1では、深刻なエラーではクラッシュしてブラックスクリーンになったが、Windows 95では、青で表示するようにした。僕はそのコードを書いたうちの一人だ。少なくとも、最後に書き換えた人間だな。

私はブルースクリーンメッセージを表示するコードを担当していた。カーネルモードビデオドライバーにテキストモードに切り替えるよう指示し、画面を青背景にして、白文字を表示して、ユーザーがキー入力をするのを待ち、画面を元に戻し、ユーザーの入力を、メッセージを表示するよう要請したコンポーネントに伝える[1]。

デバイスドライバーがクラッシュした場合、Windows 95はカーネルモードコンポーネント内の深刻な問題に、最善を尽くして対処しようとする。死の青画面(blue screen of death)というべきなのか、不便な青画面(blue screen of lameness)というべきなのか。ブルースクリーンを見たことがない幸運なもののために、以下がその例だ。



 Windows 


An 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 will
  lose any unsaved information in all applications.

「通常通り動作を実行できるかもしれませんよ」という楽観的な文面に注目されたい。みんな忘れているが、Windows 95は、ブルースクリーンエラーを表示した後、なるべくそのエラーを無視して実行し続けようとすることだ。つまり、まあ、スキャナーのドライバーはクラッシュしたので、スキャナーは動かなくなったかもしれないけれど、それ以外のシステムは無事だというわけだ。

(これを今日おこなったらどうなるだろうか。「カーネルパニックを無視するには何かのキーを押してください」)

技術的に何が行われているかというと、バーチャルマシンマネージャーが現在行われているイベントを破棄して、イベントディスパッチャーに戻るのだ。これは、カーネル内における、例外をウインドウプロシージャで飲み込んで、メッセージループに戻るようなものだ。継続できるイベントがなければ、現在のアプリケーションが終了される。

時に、問題はシステム全体に及ぶこともあり、現在のイベントを破棄したり、アプリケーションを終了しても、問題を解決しないことがある。次に起こるのは、次のイベントやアプリケーションが、同じ問題に引っかかり、数ミリ秒後に、またブルースクリーンメッセージを目にするということだ。何回か似たようなメッセージを目にした後、おそらくは諦めて、Ctrl + Alt + Delを押すだろう。

さて、当初のメッセージは、上のようであった。しかし、メッセージには問題上がる。デバイスドライバーがカーネルに読み込まれるアドレスというのは予測可能ではないので、生のアドレスが表示されていても、大して役に立たない。もし誰かが、「うちんとこの重役がこんなクラッシュメッセージ出したんだけど、何があったか分かるかい?」と言われたとしても、得られるのは無意味な数値だけだ。

その誰かというのは、僕でもあったわけだ。

この問題に対処しやすくするために、僕はメッセージを書き開けて、ドライバーの名前と、セクション番号と、セクションからのオフセットを追加した。



 Windows 


An exception 0D has occurred at 0028:80014812 in VxD CONTOSO(03) + 00000152. This was called from 0028:80014C34 in VxD CONTOSO(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 will
  lose any unsaved information in all applications.

これで、クラッシュしたドライバーの名前が分かる。何もわからなかったとしても、問題がどこにあるかのヒントは得られるわけだ。ドライバーのMAPファイルにアクセスした誰かさんは、アドレスを探して、クラッシュした箇所を特定できる。最高ではないにせよ、何もないよりマシだ。僕がこの変更をするまでは、何もなかったのだ。

そういうわけで、僕は不便なブルースクリーンを、僕の仕事を多少マシにするために書き換えたと言える。

余話:その後、誰か(僕だったかどうかは覚えていないので、誰か同僚としておこう)が、クラッシュアドレスを調べるためのコードを追加した。もし、箇所がカーネルのヒープマネージャー出会ったアバイ、メッセージは多少変更される。



 Windows 


A 32-bit device driver has corrupted critical system memory, resulting in an exception 0D at 0028:80001812 in VxD VMM(01) + 00001812. This was called from 0028:80014C34 in VxD CONTOSO(03) + 00000575.

* Press any key to attempt to continue.
* Press CTRL+ALT+DEL to restart your computer. You will
  lose any unsaved information in all applications.

この場合、「通常通り動作を実行できるかもしれませんよ」という文面が消える。なぜなら、この場合、そういうことはまずないからだ。

余話:よくやったな。Slashdot君。訂正をしたつもりかもしれないが、その訂正も間違っているよ。まあ、間違いには気がついたみたいだけどね。

[1]: このコードはカーネルで動くので、キーボードレイアウト情報にはアクセスできない。読者がChinese-Bopomofoキーボードレイアウトを使っているかどうかなんてわかりっこない。その場合、"OK"とタイプするには、C, L, 3だ。特に訳には立たないけどね。カーネルにはIMEなんてないんだから。そういうわけで、入力は、EnterとかESCみたいな、言語からは独立したキーに割り当てられていた。

だいぶ久しぶりにOld New Thingを訳した気がする。以前はだいぶ苦労していた翻訳も、今はそれほど苦労しないのは、英語力が上がったからであろうか。それとも単に慣れたのか。