Пасмурным питерским днем...
На днях у меня грохнулась NT. В этот день ничто не предвещало больших неприятностей, просто решил посмотреть кое-какой софт, скачанный по локалке: ActivePerl от ActiveState и GNU-Win32 от Cygnus Solutions. Архив Cygnus оказался битым: при распаковке появлялась заставка "Windows Setup", после чего распаковка прекращалась. Я скачал другой архив Win32 (имевший ту же длину) и поставил его. Уже не помню зачем мне нужно было перегрузить NT...
Загрузка дошла до синего экрана, я опять увидел, что у меня NT Workstation Build 1381 Service Pack 5 и 128 метров мозгов. И тут мне что-то говорят о том, что невозможно найти winsrv.dll (для справки: эта DLL использовалась в предыдущих версиях NT, сейчас ее заменяет win32k.sys). Вот те раз! Ну, думаю, ерунда какая-то, перезагрузился еще раз - то же самое. Last Known Good Configuration тоже не помогает. Попробовал ERD - он отказался восстановить улей SOFTWARE. Переустанавливать NT очень уж не хочется...
У меня есть маленький винчестер, на котором я храню backup и на всякий случай дистрибутив NT с несколькими сервис-паками. Я подключил этот винчестер, загрузился под Windows 98 и поставил еще одну копию NT. Загрузившись под ней, я поставил пятый сервис-пак и драйвера к видеокарточке (не работать же на мониторе с частотой 60Hz!). После этого приступил в выяснению причин отказа загружаться.
Первым делом я проверил, что файл winsrv.dll действительно находится в %systemroot%\system32 и совпадает с файлом из новой инсталляции NT. Значит, дело не в нем. Возможно, проблемы с registry: я как раз ставил всякий софт, который мог написать туда кучу всякой своей ерунды. Если проблема в реестре, то скорее всего улей SYSTEM отпадает: все-таки сбой не похож на железный, да и Blue Screen Of Death не было. В итоге, я запустил regedt32 и попробовал загрузить улей SOFTWARE из упавшей инсталляции NT. Он не загружался (regedt32 не считал его файлом улья). Оставалось два варианта: либо попытаться восстановить улей SOFTWARE используя резервную копию реестра из папки %systemroot%\repair или заменить его содержимым файла software.sav из папки %systemroot%\system32\config, который как известно хранит копию улья, сделанную в конце текстовой фазы установки NT. Я выбрал первый вариант.
Я сохранил на всякий случай старый файл software. Затем при помощи утилиты expand я распаковал резервную копию улья software._, которая была сделана достаточно давно, когда я последний раз обновлял ERD, в файл %systemroot%\system32\config\software и перезагрузился под первоначальной инсталляцией NT. Она загрузилась!
После загрузки я обнаружил, что repair disk я обновлял действительно давно: у меня тогда еще стояли "родные" драйвера к моей мышке Logitech Mouse Man Wheel (они были ужасно глючные и я их снес, оставив обычные драйвера от Logitech PS/2 Mouse; после этого колесико продолжало работать, но кнопка под большим пальцем работала только как Middle Button, а не как SHIFT как прежде). Помня о том, что в SOFTWARE хранится информация об установленных программах, я начал проверять, какие из программ я установил после backup. Ими в частности оказались:
Эти и некоторые другие программы теперь работали криво (@Guard постоянно говорил, что криво поставлен, Mathematica глючила со шрифтами, а Visual C++ не запускала отладчик при ошибке приложений). Это все в добавление к тому, что иконки соответствующие файлам этих приложений были undefined.
Я решил использовать самый простой выход из этой ситуации: поставить глючивший софт "поверх" существующих копий. Начать я решил с @Guard.
Установка @Guard не запускалась, Visual Studio - тоже. Я проверил еще несколько setup'ов - ни один не работает. Попробовал Office 2000 Install-On-Demand - работает. Что-то подсказало мне проверить другие 16-битные приложения... Ни одно 16-битное приложение не работало. Значит, есть проблемы еще и с NTVDM.
Раз я изменил улей SOFTWARE, то, может быть, NTVDM не работает из-за настроек в реестре? Находясь в первоначальной инсталляции NT, я при помощи regedt32 загрузил улей SOFTWARE новой установки NT создав ключ HKEY_LOCAL_MACHINE\SOFT, после этого при помощи regedit экспортировал (Export?Registry?File...) ключи HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft и HKEY_LOCAL_MACHINE\SOFT\Microsoft в текстовые файлы .reg (Main.reg и New.reg). Затем я заменил подстроку SOFT\Microsoft на SOFTWARE\Microsoft в файле New.reg и, запустив утилиту WinDiff из пакета Microsoft Visual Studio, начал сравнивать содержимое ульев. Никаких подозрительных различий я не нашел.
Тогда может быть различия в файлах? При помощи той же WinDiff я сравнил папки system обоих инсталляций и обнаружил, что различаются файлы mscdexnt.exe и mouse.drv из папки %systemroot%\system32: у них был такой же размер и дата, как у файлов из свежей инсталляции, но WinDiff нашел различия у них внутри. Я скопировал эти файлы из новой инсталляции и запустил command.com - работает! Запустил установку @Guard - работает!
Теперь осталось переставить уже установленный софт, но я не смог найти диска с Mathematica и сервис-паков для Visual Studio, так что проблемы с этими программами пришлось решать вручную.
Mathematica показывала математические символы неправильным шрифтом. Понятно, что дело в установке шрифтов: для установки шрифта совершенно недостаточно просто скопировать его в папку %systemroot%\fonts, при установке шрифт прописывается в реестре. Для того, чтобы восстановить информацию о существующих шрифтах я скопировал все шрифты из папки fonts во временную папку и попытался удалить шрифты из папки fonts. Все шрифты за исключением нескольких удалились (те, которые не удалились очевидно были корректно зарегистрированы и использовались в это время). После этого я установил шрифты из временной папки обратно при помощи Install New Font... из аплета Fonts. Запустив Mathematica я убедился в том, что шрифты показывались нормально.
Оставалась неприятность с Visual Studio. Дело в том, что Visual Studio устанавливает свой отладчик (debugger) для обработки ошибок приложений. После восстановления улья SOFTWARE, зарегистрированным отладчиком стал Dr. Watson (drwtsn32) - стандартный обработчик ошибок приложений в Windows NT). В Help по этой программе я нашел ключ в реестре, в котором содержится информация о зарегистрированном отладчике: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\Current Version\AeDebug. В этом ключе параметр Debugger хранит командную строку для запуска отладчика, я просто заменил подстроку drwtsn32 на msdev. Параметр Auto определяет, должен ли отладчик запускаться автоматически (1) или сначала должен показать диалоговое окошко, спрашивая у пользователя нужно ли завершить задачу или запустить отладчик (0).
При помощи таких-вот несложных действий я восстановил свою установку NT.
Какие же выводы можно сделать из всего этого?