Как я поднимал NT

Пасмурным питерским днем...

На днях у меня грохнулась 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.

Какие же выводы можно сделать из всего этого?

  1. Не нужно паниковать. Есть много способов вернуть NT способность загружаться.
  2. Чаще обновляйте диск аварийного восстановления.
  3. Желательно иметь возможность поставить еще одну копию NT. Для этого лучше всего иметь загрузочные дискеты и CD-ROM с NT. Если у Вас стояла Windows 2000, то лучше всего иметь под рукой Service Pack 4 и выше, так как Windows 2000 изменяет NTFS с версии 4 на версию 5, для работы с которой под NT 4 необходим этот сервис-пак.

© Konstantin Romanov

Hosted by uCoz