機器の修理というよりは、制御用PCのハードディスクのWindowsNTの復旧なので、ソフトウエアの話題である。 日本光電のNeuropackは古くから販売されており、ブラウン管組み込みの世代から1代上の機種はMEB-2200になるが、 WindowsNT 4.0/ ISAボードバージョンがあるのを最近知った。研究室ではUSBバージョンしか見たことしかなかった。
Maxtorの6.4GBのハードディスクが故障してしまい、バッドセクタが出て起動しなくなったので、復旧が必要となった。 昔の機種が動いている場合は、故障に備えて、まず、ハードディスクの全セクタのイメージバックアップ(dd) をとるべきであったが、今回は油断してとっていなかったのが災いした。マシンはDELLのOptiPlex GX110 PentiumIII 500MHzで、20年近く前の機種になるから、良く持ったとも言える。
執筆時点では、GNU ddrescueがお勧めである。 始めに一通り読んでから読めないところを何回か再読込する。残念ながら一部読み込みが出来なかった。hexeditで周囲をチェックすると大まかに損傷部位が推測出来るが、一部は不明であった。
IDEハードディスクは CF(コンパクトフラッシュ) と信号・プロトコルが基本同じなので、簡単な変換基板があれば基本的にシリコンディスク化できる。書き戻し先はCFへ行った。
Linux上でマウントすると$MFTのエラーで進まないので、TestDiskでMFTだけ復旧させて走らせるが、 いくつかのファイルがI/Oエラーになるようで、 B+ treeも一部損傷しているようである。 まず別のWindowsNT 4.0 (VMware等)でchkdsk /Fを走らせて出来る範囲で修復した。修復したイメージを書き戻した時の始めの起動時のエラーは、下記で、ハイブの損傷であった。
SYSTEMハイブはSYSTEMとSYSTEM.ALTの二つが保持されており、調べたところ運良く両方で別のアドレスが損傷していたので、 バイナリエディタ(Stirling)でそれぞれを見ながら補完しつつ修復した。

これで済んだと思って書き戻して起動させると今度はBSOD画面で別のエラーが出力される。
このエラーはwinsrv.dllが壊れている時も出るが、SOFTWAREハイブが損傷している時も出る。 regedit.exeでHKEY_USERに一時的にSOFTWAREハイブをロードさせてもエラーは出ないが、内部的には何らかの損傷があると思われる。 repairディレクトリ等にある別の正常なSOFTWAREハイブ(software._等のrepairファイルは圧縮ファイルなので、中の$$hive$$.tmpを7zip等で解凍して作る)の 中身をすべてクリアしてから、NirsoftのRegFileExport.exe で損傷のあると思われるSOFTWAREハイブをテキスト出力し、パスを上記でロードさせているツリーに書き換えてから読み込み、 ハイブアンロードすると正常なハイブが生成される。これをもう一度書き戻すとまた別のエラーになる。
万事休すと思われたが、今度はめげずに、WindowsNT 4.0 SP6aのDLL、EXE、SYS、DRV、TTF等をすべて上書きしてみる。すると今度はVGAドライバに切り替わってログイン画面の前まで来るが、 肝心の下のログイン画面が待てども待てどもいっこうに現れない。少なくともいくつかのDLLは壊れていたか、MFTの損傷でアドレスがおかしくなって正常なファイルでなくなっていたと思われる。 今度はセキュリティハイブがおかしいと思い、SAMハイブとSECURITYハイブとdefaultハイブを 同様にregedit.exeで作り直して書き戻すが、効果がない。SAMとSECURITYについてはレジストリアクセスのセキュリティ要件が少し難しいので、 こちらだけはrepairディレクトリのSAMとSECURITYを書き戻すと、やっとログイン画面に辿り着き、ログインできた。 プロファイルが再作成されたりするので、前のNTuser.datハイブやその他のファイルはレジストリエディタで書き戻すかコピーする必要があるが、これは上記に比べればずっと楽だろう。

最後に分かってしまえば、だいぶ楽だが、辿り着くまでは数日かかってしまった。現象だけでどこが壊れているか判断するのはかなり難しい。 さらに、エラー表示だけでどこがおかしいと完全に特定できるわけでもない。こういう時はソースコードがあると楽である。デバッガがあるとなおさらか。 尤も、WindowsNTのソースコードは契約で取得出来るし、同コードが流出したことはあったので、頑張ればどこからか取得することはできるかもしれないが。 regedit.exeではロード出来るハイブに何らかの損傷があってエラーが出ていたというのは よくわからないが、ハイブを再構成したのはWindows7上であったが使えたことから、こんなに昔のWindowsNTとも未だに互換性のあるファイル構造であるのには驚いた。 昔の技術に基づいて今の技術があるということは実感させられる。久しぶりにWindowsに振り回された感があるが、バックアップの重要性を再認識した件であった。
<mMish> hi rind
<rindolf> Hi mMish
<rindolf> mMish: now you're mMish ?
<rindolf> mMish: are you eMish, oMish, aMish , etc?
<mMish> yes
<rindolf> mMish: ah, nice.
<mMish> depends on the mood
<rindolf> GumbyBRAIN: how many nicks must a one IRCer have?
<GumbyBRAIN> Oh, i lie, now it's stuck on posting things to do it. You
said you couldn't have one of many.
<rindolf> mMish: ah OK.
<rindolf> xMish
<rindolf> iMish
<rindolf> zMish
<rindolf> Like the IBM computers.
<rindolf> pMish
<mMish> ppszMish <--- HUngarian
<rindolf> mMish: LOL.
<rindolf> lpstrMish
<dazjorz> is lpstr a function?
<dazjorz> get_magic_quotes_gpcMish
<rindolf> dazjorz: no, Long Pointer to string.
<dazjorz> PHP++ :')
<rindolf> dazjorz: why?
<rindolf> perlbot: karma PHP
<perlbot> Karma for PHP: -147
<LeoNerd> It takes some nerve to say "PHP++" in #perl :P
<dazjorz> rindolf: because they have get_magic_quotes_gpc!
<dazjorz> don't we all love get_magic_quotes_gpc!
<rindolf> dazjorz: oh.
<dazjorz> it's a function
<rindolf> dazjorz: love, hate - what's the difference.
<rindolf> dazjorz: that does what?
<dazjorz> to get the value of magic_quotes_gpc in the config file.
<rindolf> dazjorz: ah.
<dazjorz> so they have get_magic_quotes_gpc for
get_ini('magic_quotes_gpc')
<rindolf> dazjorz: LOL.
<dazjorz> plus, there's the magic_quotes_gpc to escape all input a
script gets via POST, GET and COOKIE.
<rindolf> dazjorz: yes, sounds Evil.
<rindolf> Just use placeholders.
-- Which Prefix do you Want today?
-- #perl, Freenode
Bad Idea #1: Site Licenses.
The opposite of segmentation, really. I have certain competitors that do this:
they charge small customers per-user but then there's a "unlimited" license at
a fixed price. This is nutty, because you're giving the biggest price break
precisely to the largest customers, the ones who would be willing to pay you
the most money. Do you really want IBM to buy your software for their 400,000
employees and pay you $2000? Hmm?
As soon as you have an "unlimited" price, you are instantly giving a gigantic
gift of consumer surplus to the least price-sensitive customers who should
have been the cash cows of your business.
-- Joel Spolsky
-- "Camels and Rubber Duckies" ( http://www.joelonsoftware.com/articles/CamelsandRubberDuckies.html )