Хранение булевых значений в реестре Windows

Хранение булевых значений в реестре Windows "Один бит — это количество информации, которое уменьшает неопределенность вдвое". Я привел определение одного "бита" из теории информации, потому что речь в статье пойдет о способах хранения логических значений в системном реестре Windows.

Булевы или логические значения, для хранения которых достаточно одного бита, принимающие два значения "ложь" или "истина" и хорошо знакомые любому программисту, для Microsoft стали, похоже, еще одним способом проявить как минимум то ли странность, то ли снова создать хорошую почву для будущих багов, пакетов обновлений и несовместимости.
При разработке системного программного обеспечения для администрирования различных версий 32-битных Windows мне пришлось столкнуться с различным подходом Microsoft к хранению логических значений. Дело в том, что подавляющее большинство системных политик и настроек Windows сводится к булевым значениям "Да" или "Нет". Кроме того, здесь необходимо сразу отметить, что опять же, в подавляющем большинстве случаев, отсутствие величины или "значение по умолчанию" (скорее всего, это будет параметр в системном реестре или его отсутствие) принимается за "ложь". Данная статья — это попытка систематизации девяти обнаруженных мною способов, с помощью которых Windows хранит логические значения в системном реестре. К слову, эти сведения могут быть легко экстраполированы и на устаревшие файлы инициализации (.ini).

Бинарные параметры
Логические значения в параметрах бинарного типа хранятся двояко.
1. Пара значений "01 00 00 00" (истина), "00 00 00 00" (ложь), встречается наиболее часто. Таким способом хранятся значения системных политик в ранних версиях Windows 95, 98. В версиях ME, NT, 2000 или XP произошел переход на хранение булевых значений в параметрах целочисленного типа DWORD.
Приведу пример системной политики, ведущей себя подобным образом: "Очистка истории последних открытых документов при завершении". Будучи задействованной, эта политика приводит к автоматической очистке при завершении сеанса Windows или сеанса текущего пользователя следующих историй: списка последних открытых документов в меню "Документы", списка меню поиска и списка команд диалога "Выполнить", доступных из меню "Пуск", а также списка сетевых адресов, набранных в адресной строке Internet Explorer. Параметр "ClearRecentDocsOnExit", хранящий состояние этой политики, имеет бинарный тип в Windows 95/98 с парой значений "01 00 00 00", "00 00 00 00" и целочисленный тип в других версиях. Хранится он в ветви реестра "Software\Microsoft\Windows\CurrentVersion\Policies\Explorer" как в разделе HKEY_CURRENT_USER, так и в разделе HKEY_LOCAL_MACHINE и может иметь область действия либо на весь "Компьютер" (Local Machine), либо на "Текущего пользователя" (Current User) соответственно.
2. Следующая, более редкая пара бинарных значений, представляющая "истину" или "ложь" — это "01" и "00". Такая пара используется для хранения системных настроек. Также она используется для хранения состояния системной настройки в Windows 9.x, отвечающей за отображение в меню "Пуск" пункта "Остановить", который переводит компьютер в режим с пониженным питанием. Параметр "APMMenuSuspend" находится в ветке "Enum\Root\*PNP0C05\0000" раздела LOCAL_MACHINE системного реестра. Редактировать этот бинарный параметр вручную имеет смысл, когда переход в режим с пониженным питанием дает сбои.

Целочисленные параметры DWORD
Здесь мною обнаружено три метода хранения булевых величин.
3. Наиболее часто встречается пара "1" и "0", означающие "истина" и "ложь" соответственно. Этот способ используется для хранения системных политик Windows в подавляющем большинстве случаев. Здесь же необходимо отметить, что способ представления большинства системных политик в Windows 95, 98 претерпевает изменение от хранения бинарных значений типа "01 00 00 00" или "00 00 00 00" к хранению целочисленных значений типа "1" или "0" для тех же самых политик в Windows Me, 2000 и XP. Явно прослеживается попытка Microsoft унифицировать хранение состояния системных политик.
Для примера приведу системную политику, при активизации которой у "Проводника" и у "Рабочего стола" блокируется контекстное меню. Целочисленный параметр "NoViewContextMenu", хранящийся в ветви "Software\Microsoft\Windows\CurrentVersion\Policies\Explorer", отвечает за состояние этой политики. Параметр может находиться в реестре или в разделе HKEY_CURRENT_USER, или в разделе HKEY_LOCAL_MACHINE и иметь область действия либо всего "Компьютера" (Local Machine), либо "Текущего пользователя" (Current User).
При конфликте политик, хранящихся в разных разделах реестра, политика, имеющая область действия весь "Компьютер" и хранящаяся в разделе HKEY_LO-CAL_MACHINE, имеет приоритет над политикой, хранящейся в разделе HKEY_CURRENT_USER и имеющей область действия "Текущего пользователя".
4. Другая пара целочисленных значений, представляющих логические значения — это "2", означающее "истина", и "0", означающее "ложь" соответственно. Подобное, довольно странное на первый взгляд, представление булевых величин чаще всего используется для хранения политик, относящихся к Microsoft Интернет-приложениям, таким, как Internet Explorer и Outlook Express. На самом деле есть небольшая часть политик, имеющих три состояния, и три величины, используемые для представления: "0", "1" и "2". Но это уже не является булевыми значениями и выходит за рамки рассмотрения данной статьи.
Примером политики, использующей такой тип представления логического состояния, может послужить политика, убирающая MSN Messenger из интерфейса Outlook Express. Параметр типа DWORD "Hide Messenger", который может присутствовать в ветви "SOFTWARE\ Microsoft\Outlook Express" раздела HKEY_LOCAL_MACHINE, принимая значение "2", убирает функциональность MSN Messenger из почтового клиента Outlook Express.
5. Следующий способ, казалось бы, наиболее логичный и экономный, используется Microsoft достаточно редко. Для хранения настроек можно использовать один бит (двоичную единицу), хранящийся в целочисленном параметре. Два значения бита: "выставлен", т.е. равен "1", или "не выставлен", другими словами, равен "0", принимаются за "истину" и "ложь". Такое редко встречается для хранения настроек в Microsoft Office. Я нахожу этому объяснение в том, что проверка и манипулирование двоичными значениями, имеющими битовое представление, сложнее в программной реализации.
В качестве иллюстрации приведу параметр "Options6", третий бит которого отвечает за выдачу предупреждения в Microsoft Excel о запуске макроса. Хранится он в ветви "Software\Microsoft\ Office\8.0\Excel\Microsoft Excel" раздела HKEY_CURRENT_USER. Excel из Microsoft Office 2000 или XP хранит эту настройку в похожей ветви, где цифры "8.0" заменятся на "9.0" или "10.0" соответственно.

Строковые параметры
Обилие способов, применяемых для хранения логических величин в параметрах строкового типа, наводит на мысль о том, что здесь фантазия программистов Microsoft разгулялась окончательно.
6. Первая, достаточно распространенная пара — это "Yes", "No", отвечающая за "истину" и "ложь". Чаще всего этот способ используется для хранения настроек Internet и Windows Explorer. Эта пара значений записывается по-разному и большими и маленькими буквами, и просто с большой буквы. Состояние регистра принципиально для нескольких установок Internet Explorer, где все значения пишутся только малыми буквами — "yes", "no". В остальных случаях Windows отрабатывает эти значения в любом виде.
Примером этого может послужить строковый параметр "BrowseNewProcess", хранящийся в "Software\ Microsoft\Windows\CurrentVersion\Explorer\BrowseNewProcess" раздела HKEY_CURRENT_USER. Эта установка определяет, создается ли новый процесс для каждой запущенной копии Windows Explorer (Проводника) или Internet Explorer. Активизация этой системной настройки повысит стабильность Windows, но может немного снизить производительность.
7. Вторая редкая пара строковых значений, очень похожая на первую, — это "Y", "N", обозначающие "истину" и "ложь" — используется для хранения системных настроек Windows.
Иллюстрацией этого метода хранения логических значений может послужить системная настройка, разрешающая запуск распределенных COM-объектов и подключение к ним удаленных клиентов. Этот параметр "EnableDCOM" хранится в "Software\Microsoft\OLE" раздела HKEY_LO-CAL_MACHINE. Здесь же отмечу, что доступ на запись и свободная манипуляция состоянием этой настройки рекомендовано только администраторам систем.
8. Видимо, сказать просто "да" или "нет" для Microsoft столь же несвойственно, как и дипломатам. Поэтому есть еще один способ хранить это состояние в системном реестре — "TRUE" и "FALSE". Необходимо отметить, что в отдельных случаях регистр имеет значение, другими словами, значение "true", записанное в нижнем регистре, принимается за "ложь". Этот способ встречается для хранения настроек сетевых настроек Windows.
Для Windows NT, 2000 и XP есть системная политика, которая отвечает за выдачу сообщения о несостоявшемся подключении к контроллеру домена, хранящему "блуждающие профили пользователей". Значение параметра, отрабатывающегося при регистрации в системе, "ReportControllerMissing", которое хранится в ветви "SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" в HKEY_LOCAL_MACHINE, чувствительно к регистру.
9. Как и для целочисленных параметров, встречается и пара "1" и "0", отвечающие за "истину" и "ложь". Примечательно, что в Windows NT есть много политик, за состояние которых отвечают значения "1" или "0", но которые могут иметь и строковый и целочисленный тип. В Windows 2000 такое встречается крайне редко, и то для системных политик, унаследованных от Windows NT. Это представление булевых величин для хранения состояний системных настроек и политик применяется в Microsoft Office наиболее часто для сетевых настроек, управления памятью и инсталляцией приложений.
Как пример приведу системную политику, принудительно завершающую 16-битные процессы, работающие в виртуальной машине DOS (Virtual DOS Machine), при завершении сеанса Windows. Это снимает зависшие приложения, ускоряет закрытие Windows, но может послужить причиной потери данных. Строковый параметр "AutoEndTasks", принимающий значения "1" или "0" и отвечающий за состояние этой политики, хранится в ветви "Control Panel\Desktop" раздела HKEY_CURRENT_USER системного реестра.

Valient Newman
www.geocities.com/werebad/



Компьютерная газета. Статья была опубликована в номере 27 за 2002 год в рубрике soft :: win

©1997-2024 Компьютерная газета