пятница, 23 июля 2010 г.

Windows: недокументированный ключ файла boot.ini

Как известно, в Windows XP есть файл boot.ini, в котором прописаны операционные системы и параметры, с которыми они будут загружаться. Эти параметры определяются с помощью ключей. Сами ключи находятся в данном файле после записи, касающейся той операционной системы, к которой они относятся. Обычно boot.ini выглядит следующим образом:

[boot loader]
timeout=30
default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS
[operating systems]
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional RU" /noexecute=optin /fastdetect

Описания каждого элемента можно легко найти в интернете, однако существует недокументированный ключ, о котором упоминается разве что в книге Руссиновича "Внутреннее устройство Windows". Именно об этом ключе и пойдет дальше речь.


Данный ключ - /LASTKNOWNGOOD - позволяет по умолчанию каждый раз загружать систему в режиме последней удачной конфигурации (last known good) - так, словно при загрузке была нажата клавиша F8 и выбран соответствующий режим.

Немного теории...


В реестре есть ключи следующего вида: [HKEY_LOCAL_MACHINE\SYSTEM\ControlSetNNN], где NNN - порядковый номер ключа. В этих ключах хранится конфигурация драйверов устройств и служб. Кроме них, существует ключ [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet], который по сути является просто ссылкой на один из ControlSetNNN, содержимое которого используется в данный момент. В ключе [HKEY_LOCAL_MACHINE\SYSTEM\Select] описывается, какой из ControlSet'ов является текущим (параметр Current), какой загружается по умолчанию (Default), с помощью какого систему загрузить не удалось (Failed), и тот, с помощью которого операционная система загружается в режиме последней удачной конфигурации (LastKnownGood), т.е. в той конфигурации, в какой система была работоспособна (более-менее). Значение последнего изменяется каждый раз после того, как пользователь успешно зайдет в систему.
Если в системе возникнут какие-либо проблемы и она откажется грузиться, можно вызвать нажатием F8 при загрузке системы меню и выбрать пункт Последняя удачная конфигурация, если в системе не произошло особо сильных сбоев, то она должна загрузиться.
В некоторых ситуациях может потребоваться, чтобы система каждый раз загружалась в режиме последней удачной конфигурации (не спрашивайте меня зачем. я не знаю, однако вот кому-то понадобилось...). Для этого достаточно просто прописать в boot.ini после имени операционной системы ключ /LASTKNOWNGOOD.

... и практика.


Уже довольно много времени прошло с того момента, как я где-то на просторах инета натолкнулась на обсуждение возможности загрузки последней удачной конфигурации по дефолту, чтобы не приходилось каждый раз нажимать кнопку F8. Именно в этом обсуждении было упомянуто о данном ключе, однако в интернете практически ничего не удалось найти про него. Это объясняли тем, что ключ недокументирован и упоминается только в одной книге. Но пока теория не нашла подтверждения на практике, она не вызываала доверия. Итак, теперь о том, каким образом работа этого ключа проверялась.
Сначала была предпринята попытка удалить весь раздел реестра [HKLM\System\CurrentControlSet]. Из-под работающей системы это сделать не удалось, винда просто зависала. К счастью, под рукой был ERDCommander Live CD, и после загрузки с него издевательства продолжились. Весь ключ снести не удалось, но из тех разделов, которые остались, вручную были удалены все параметры. После этого, без каких-либо изменений в boot.ini, комп был перезагружен - и система отказалась грузиться, сославшись на отсутствие либо повреждение файла реестра. Хорошо. Вновь загрузка с Live CD. В boot.ini после имени системы прописываем /LASTKNOWNGOOD. При этом раздел CurrentControlSet в реестре находится в том же состоянии, что и при прошлой попытке загрузки. Теперь, с этим недокументированным ключом, система грузится без малейших вопросов и претензий. Теория подтверждена практикой. =)

Некоторые важные черты.


Посмотрим, что у нас поменялось в реестре. Раньше в ключе [HKLM\System\Select] были следующие параметры: current = 2, default = 2, failed = 1, lastknowngood = 3. Всего ControlSet'ов было 3. Теперь появился еще один - ControlSet004. И содержимое [HKLM\System\Select] выглядит теперь так: current = 3, default = 3, failed = 2, lastknowngood = 4. Видим, что номера сдвинулись на единицу. И теперь конфигурация, которая была "последней удачной", сдвигается и становится предпоследней, а та при которой загрузились сейчас становится последней. Таким образом, при постоянном нажимании на F8 и выбирании загрузки последней удачной конфигурации мы будем грузить одну и ту же конфигурацию, а при наличии ключа /LASTKNOWNGOOD она будет каждый раз меняться на новую.