Проверка работоспособности сервисов и драйверов Windows NT

В нашем университете столкнулись с такой проблемой: при определенных обстоятельствах на машине с Windows NT не стартовал сервис базы данных (InterBase Server). Особенно часто это происходило после вечерних game-баталий. Рассудив, что должен же существовать механизм проверки загрузки и работоспособности сервисов и драйверов (служб) на стадии загрузки операционной системы, мы обратились к базе данных: msdn.microsoft.com. В ответ пришел весьма жиденький документ с описанием нескольких ключей реестра и с ссылкой на функцию NotifyBootConfigStatus().


Ключ ErrorControl

Один из возможных путей контроля загрузки сервиса или драйвера устройства - это ключ ErrorControl. Путь к нему рассмотрим на примере драйвера такого устройства, как "Мышь Microsoft для последовательного порта". Название практически всех служб перечислены в кусте HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services. Драйвер мышки называется Sermouse. Элемент ErrorControl внутри ключа Sermouse отвечает за "жизненность" драйвера или сервиса. Он может принимать значения от 0 до 4. Значение 0-1 - для служб второстепенного значения, при неудачном их запуске система все равно продолжает загрузку. В случае ErrorControl=1, при неудачном старте, на экран будет выдано предупреждение (более подробно с ним можно ознакомиться в программе "Просмотр событий" (EVENTVWR.EXE)). При 2-3 служба имеет жизненно важное значение, в случае его неудачной загрузки система не стартует вообще. В случае 2 ОС предпринимает попытку перезапуска с опциями LastKnownGood.

Это легко проверить на примере. Присвоим параметру ErrorControl для драйвера мыши значение 3, а сам драйвер (%SYSTEMROOT\system32\drivers\sermouse.sys) перепишем в любой другой каталог. Оговорюсь, что такой эксперимент можно проводить, если существует возможность вернуть файл драйвера на место, без загрузки самой ОС. Например: система установлена на FAT16 или используется несколько копий NT - основная и отладочная. Теперь перезагрузим машину. Во время загрузки драйверов (синий экран) система, не найдя файла с драйвером, уходит на перезагрузку, и так по кругу. Вернуть ее к жизни можно, переписав файл драйвера на прежнее место или воспользовавшись конфигурацией LastKnownGood. При появлении на экране меню загрузки нажмите клавишу "пробел", затем клавишу "L", затем "enter".


LastKnownGood

NT поддерживает так называемую мультиконфигурацию, т.е. возможность создавать различные профили запуска системы. Простой пример: для беспроблемной записи на дисковод CDR, особенно с интерфейсом IDE, необходим большой объем ОЗУ, в котором кэшируется диск с имидж-файлом будущего CD.

Для этого можно создать конфигурацию, в которой не будут загружаться некоторые драйверы (звуковой карты, сетевых устройств и т.д.) и вспомогательные системные службы. Такие конфигурации организованы в наборы управляющих опций Control Sets. Каждая опция HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001-00N включает в себя инициализационные данные для всех служб, установленных на машине. Узнать текущую конфигурацию можно в... SYSTEM\Select, ключ Current - ее номер. Там же находится и ключ LastKnownGood, он указывает на номер набора управляющих опций, с помощью которого был произведен беспроблемный запуск системы.


Проверка работоспособности

По технологии разработчика ОС для проверки работоспособности необходимо написать программу, которая лично проверит правильность работы того или иного драйвера и вызовет функцию NotifyBootConfigStatus(). Использование функции очень простое, она принимает только один параметр - четырехбайтовое целое, true (1) или false (0). Если true, то ОС считает загрузку удачной и сохраняет ее как LastKnownGood, в противном случае ОС идет на перезагрузку с опцией LastKnownGood. В случае SQL-сервиса такая проверка выполняется достаточно просто. Если в ответ на запрос к базе данных придут ожидаемые данные, сервис можно считать успешно загруженным. Неплохо бы еще вести файл отчета, в котором будет указано время и состояние сервиса: работает он или нет. В случае связки InterBase - C++Builder такая программа может выглядеть так:

10 bool alarm = false;
20 try { Database1->DatabaseName = "MyDB";
30 Database1->AliasName = "IB_LIB";
40 Database1->Params->Values["USER NAME"]="Name";
50 Database1->Params->Values["PASSWORD"]= "Pass";
60 Database1->LoginPrompt = false;
70 Database1->Connected = true;
80 } catch(...) { alarm = true; }
90 if(alarm){any_operators; NotifyBootConfigStatus(false);}
100 else{ any_operators; NotifyBootConfigStatus(true); }

Строчки 30-70 служат для автоматической подстановки имени пользователя и пароля на сессию с InterBase. В 70 производится коннект с сервером. Если он не стартовал, произойдет исключение, переменная alarm станет равна true. Дальше алгоритм пойдет по строке 90 и вызовет перезагрузку системы с заведомо правильной конфигурацией (LastKnownGood). В противном случае управление перейдет на строку 100, т.е. все хорошо, и текущая конфигурация сохранится как правильная.

Чтобы программа запускалась при загрузке ОС, необходимо объяснить системе, что это - верификационная программа. Для этого необходимо изменить два ключа реестра: ...SOFTWARE\Microsoft\Windows_NT\CurrentVersion\Winlogon, элемент ReportBootOk устанавливается в 0. Т.е. система после регистрации пользователя не будет считать процесс запуска успешным, а будет ждать чего-то еще. В элементе ImagePath ключ CurrentControlSet\Control\Boot VerificationProgram необходимо прописать путь к верификационной программе.

Андрей ЛАПОУХОВ,
Andrew@belsoft.vitebsk.by

Версия для печатиВерсия для печати

Номер: 

30 за 1999 год

Рубрика: 

Software
Заметили ошибку? Выделите ее мышкой и нажмите Ctrl+Enter!