Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Операционные системы и среды. В 2 частях. Ч.1. Курс лекций
.pdf
ЛЕКЦИЯ 7.
Архитектура реестра в ОС Windows
Программное обеспечение становится все сложнее, а его
функциональность все более гибкой и сложной. В Microsoft
Windows настройка осуществляется через реестр – механизм,
упрощающий хранение параметров приложений и служебных
программ. Реестр – это централизованная иерархическая база
данных, состоящая из нескольких файлов (для программистов, работающих с ним, он представляется как единая база
данных) и обладающая следующими возможностями:
• иерархическая организация данных приложения позво-
ляет сохранять свои параметры произвольным образом;
• поддерживает многопользовательскую работу путем разделения на две части, в одной из которых хранятся параметры
локального компьютера (HKEY_LOCAL_MACHINE), а в другой – пользовательские параметры (HKEY_USERS);
• имеется ограничение доступа к любым разделом реестра;
• возможно хранение данных разных типов, в том числе
двоичных DWORD, строк и мультистрок.
Реестр – ограниченный совместно используемый системный ресурс, в pаботе с которым нужно придерживаться определенных правил этикета (или соглашений), многие из них накладываются самой системой.
В основе системного реестра лежит иерархия разделов (ключей) и значений. Разделы (ключи реестра) могут состоять из произвольного числа подразделов (подключей) значений. В свою
очередь, подразделы обладают такими же правами и могут
включать в себя сколько угодно значений и новых подразделов.
Названия разделов одного уровня должны различаться; кроме
того, в них не должна входить обратная косая черта. Для просмотра реестра можно использовать стандартную программу
regedit.exe. Она позволяет просматривать и модифицировать
ключи и их значения.
Реестр имеет логическую и физическую структуру. Программисты имеют дело с логической структурой, в рамках которой корневые разделы реестра, определяющие верхушки дере-
71

вьев реестра, считаются корневыми каталогами подобно дискам
А: или С:.
С физической точки зрения реестр состоит из нескольких
расположенных на жестком диске пользователя файлов. Файл,
в котором хранится нужный программисту раздел реестра,
определяет ОС, она же и осуществляет доступ к нужному файлу.
Реестр Windows состоит из пяти стандартных корневых разделов и одного предопределенного – для хранения данных о производительности системы (HKEY_PERFORMANCE_DATA).
Этот предопределенный раздел содержит данные о производительности, передаваемые ему системой, службами и приложениями. Он не содержит определенных физических значений,
скорее наоборот, функции реестра предоставляют метод динамического получения информации о производительности системы. Доступа к нему из программы Regedit нет. Раздел HKEY_
DYN_DATA указывает на ту часть раздела HKEY_LOCAL_
MACHINE, которая нужна для устройств Plug & Play. При добавлении или удалении устройств из системы этот раздел изменяется.
Состав реестра включает разделы, указанные в табл. 7.1,
как основные разделы реестра.
Все подразделы реестра входят в раздел HKEY_LOCAL_
MACHINE либо HKEY_USERS. Такая структура реестра обусловлена необходимостью хранения информации о параметрах, специфичных для компьютера, с одной стороны, и о
параметрах, специфичных для пользователя, с другой. Остальные три предопределенных раздела – это виртуальные закладки для частей разделов HKEY_LOCAL_MACHINE и HKEY_
USERS. Так, данные подраздела HKEY_LOCAL_MACHINE\
Software\Classes можно обнаружить в разделе HKEY_CLASSES_ROOT.
Как и названия разделов, названия переменных одного
подраздела должны различаться. Единственное исключение
из этого правила – значение по умолчанию (default), не имеющее названия. Наличие значений, в том числе и значения по
умолчанию, в разделе необязательно, так что в нем может содержаться несколько, только одно или вообще ни одного значения.
72

Таблица 7.1
Предопределенные разделы системного реестра
Windows 2000
Название раздела Описание раздела
HKEY_LOCAL_MACHINE Содержит информацию конкретного компью-
тера, в том числе об установленном аппаратном
и программном обеспечении, а также настройки. Эти данные являются общими для всех работающих на данном компьютере пользователей
HKEY_USERS Набор данных, применяемых при работе
на ПК определенного пользователя. Этот раздел содержит информацию для пользователя
по умолчанию и для пользователя с загруженным на данный момент профилем
HKEY_CURRENT_USER Определенная системой закладка, или псевдо-
ним, для раздела HKEY_USERS, динамически
указывающая на информацию реестра о пользователе, работающем в ОС с вызывающим
потоком. Существуют специальные правила,
связанные с пользователями вызывающих потоков, влияющими на работу служб, используемых при выполнении этих задач.
HKEY_CLASSES_ROOT Включает все типы соответствий файлов,
а также информацию о взаимосвязи между
данными различных программ (технология
OLE) и ярлыках и содержит сведения о зарегистрированных СОМ-компонентах и связанных
с оболочкой (shell) ассоциациях
HKEY_CURRENT_CONFIG Определенная системой закладка, или псевдо-
ним, для HKEY_LOCAL_MACHINE\System\
CurrentControlSet\Hardware Profiles\Current,
название которого соответствует имени пользователя, работающего с ОС в данный момент.
Здесь хранятся сведения о конфигурации оборудования
Далее необходимо рассмотреть виртуальный реестр HKEY_
PERFORMANCE_DATA, который является специальным ключом к получению информации о производительности системы.
Известно, что при обнаружении проблем с аппаратной конфигурацией и производительностью системы в целом, рекомендуется использовать оснастку «Системный монитор» с соответ-
73

ствующими счетчиками производительности. В ОС Windows
системный реестр также относится к механизму, обеспечивающему доступ ко всем значениям счетчиков производительности, используемых для мониторинга системы. Основным
преимуществом использования счетчиков производительности
средствами реестра является возможность мониторинга удаленных компьютеров без особых затрат, так как API-функции
реестра позволяют получить быстрый доступ к удаленному
реестру. В связи с тем что в данном разделе хранятся не конфигурационные параметры, а только ссылки на соответствующие источники данных счетчиков производительности, доступ
к разделу HKPD средствами утилиты «Редактор реестра» запрещен. Информацию из данного раздела реестра можно получить с помощью функции PDH (Performance Data Helper), которая предоставляется библиотекой Pdh.dll (Performance Data
Helper API), компоненты которой представлены на рис. 7.1.
Рис. 7.1. Архитектура доступа к счетчикам
производительности
Как и названия файлов системных компонентов, названия
разделов, подразделов и значений в международных версиях
ОС Windows не локализованы. И все же в значениях реестра,
74

как правило, хранятся данные, переведенные на соответствующий язык программирования. С каждым значением связаны
данные, формат которых соответствует одному из системных
типов данных (табл. 7.2).
Таблица 7.2
Типы данных значений реестра (полный список типов
данных, поддерживаемых ОС Windows)
Тип данных значе-
ний реестра
REG_BINARY Бинарные данные в любой форме
REG_DWORD 32-битное число (часто используется для хранения
байта, слова или даже бита)
REG_DWORD_
LITTLE_ENDIAN
REG_DWORD_BIG_
ENDIAN
REG_QWORD 64-разрядное число
REG_QWORD_
LITTLE_ENDIAN
REG_EXPAND_SZ Строка, завершающаяся нулем, содержащая ссылки
REG_LINK Символическая ссылка в формате UNICODE. При-
REG_MULTI_SZ Массив строк, каждая из которых завершается нулем.
REG_NONE Неопределенный тип, функционально совпадающий
REG_RESOURCE_
LIST
REG_SZ Оканчивающаяся нулем строка
32-битное число в формате аппаратных платформ Intel
(с прямым порядком байтов начиная с младшего). Все
Windows-системы хра нят числа в этом формате
32-битное число в формате аппаратных платформ
Motorola (с обратным порядком байтов начиная
со старшего). Этот формат используется для хранения целых чисел в некоторых не-Windows системах,
например на некоторых UNIX-компьютерах и в процессорах Motorola
64-разрядное число с прямым следованием байтов,
аналогично REG_QWORD
на переменные окружения (например: «%РАТН%»).
Этот тип данных часто применяется для хранения
путей к файлам, поскольку использование таких
переменных, как «%SystemRoot%», позволяет избежать ошибок в случае, если пользователь изменил
пути к различным системным файлам
ложения или серверный код не должны обращаться
к значениям этого типа или сохранять их
В конце массива располагаются два нулевых символа
с REG_BINARY
Список ресурсов драйвера устройства. Не применяет-
ся в приложениях пользовательского режима
Описание типа данных
75

Компания Microsoft определила правила доступа к реестру.
Однако ОС не может следить за их выполнением, поэтому программисты часто допускают ошибки, сохраняя специфичные
для компьютера данные в пользовательской части реестра, и
наоборот.
При сохранении параметров приложения в реестре очень
важно определить, для кого эта информация предназначена –
для компьютера (т.е. для всех пользователей) или для одного
пользователя. Иначе говоря, должна ли конфигурация некоторого компонента приложения быть одинаковой для всех пользователей или каждый пользователь будет настраивать ее по-своему?
Обычно информация, сохраняемая в реестре при установке программного обеспечения, применяется для всех пользователей.
Этот процесс очень похож на установку в систему нового устройства. И наоборот – изменения, внесенные пользователем в конфигурацию приложения во время его выполнения, обычно сохраняются для конкретного пользователя.
Параметры реестра, специфичные для компьютера. Существует соглашение, в соответствии с которым приложения
и служебные программы сохраняют данные, специфичные для
конфигурации исполняющего их компьютера, в следующей иерархии разделов:
HKEY_LOCAL_MACHINE Software
Company Name
Your Product Name
Your Product Version (optional)
Key1
Valuel
Value2
Key2
Такая структура помогает избежать беспорядка и ускоряет поиск данных, относящихся к программе. Серверные приложения не сохраняют конфигурации для конкретных пользователей. Все их параметры специфичны для определенного
компьютера, так что им не нужно подстраиваться под каждого
пользователя.
76

Параметры реестра, специфичные для пользователя.
Подразделы раздела HKEY_USERS содержат сведения о пользовательских параметрах. Система автоматически устанавливает соответствие между HKEY_CURRENT_USER и подразделом, описывающим текущего, т.е. ассоциированного с текущим
процессом, пользователя. Если поток заимствует права другого
пользователя, все обращения этого потока к HKEY_CURRENT_
USER будут относиться к этому пользователю. Если приложение будет обращаться к специфичной для пользователя информации реестра, оно должно следовать соглашению, похожему
на применяемое для раздела HKEY_LOCAL_MACHINE:
HKEY_CURRENT_USER
Software
Your Company Name
Your Product Name
Your Product Version (optional)
Key1
Valuel
Value2
Key2
Конечно, к этой иерархии можно обращаться и прямо через
корневой раздел HKEY_USERS, но делать это не рекомендуется. Если все-таки необходимо выполнить такую операцию,
то следует использовать функцию «RegOpenCurrentUser».
Дескриптор ключа (подраздела), называемый key handle, хранится в переменной типа HKEY. Чтобы получить дескриптор
ключа HKEY, необходимо использовать функции RegOpenKeyEx
или RegCreateKeyEx. Первый аргумент этих функций имеет тип
HKEY. При вызове любой из этих функций в качестве первого аргумента можно указать константу, например имя одного из корневых ключей реестра (например, HKEY_CLASSES_ROOT). ОС
Windows позволяет воспользоваться следующими константами
типа HKEY, которые по умолчанию являются открытыми:
HKEY_CLASSES_ROOT
HKEY_CURRENT_USER
HKEY_LOCAL_MACHINE
77

HKEY_USERS
HKEY_CURRENT_CONFIG
HKEY_DYN_DATA
Эти константы соответствуют корневым ключам реестра. Для
работы с реестром из программы можно использовать функции
API Windows (табл. 7.3), а в системах программирования, таких
как С++ Builder и Delphi, для работы с реестром предусмотрен
специальный класс объектов TRegistry, который предоставляет
все функции, необходимые для работы с реестром.
Таблица 7.3
Некоторые (часто используемые) функции API,
предназначенные для работы с реестром
Функция Описание функции
RegCloseKey Закрыть открытый ключ реестра
RegConnectRegistry Подключиться к удаленному реестру
RegCreateKeyEx Создать новый подключ
RegDeleteKey Удалить ключ
RegDeleteValue Удалить значение
RegEnumKeyEx Перейти к следующему подключу (каждый раз воз-
вращает новый ключ)
RegEnumValue Перейти к следующему значению (каждый раз воз-
вращает новое значение)
RegFlushKey Внести значения ключа в реестр (чтобы убедиться
в том, что все изменения сохранены на диске)
RegLoadKey Загрузить ключ из специального файла (см. также
RegSaveKey)
RegOpenKeyEx Открыть ключ
RegQueryInfoKey Запросить информацию о ключе
RegQueryValueEx Прочитать значение
RegReplaceKey Заменить ключ после перезапуска системы
RegSaveKey Записать ключ в файл
RegSetKeySecurity Установить разрешения на доступ к ключу
RegSetValueEx Установить значение
RegUnloadKey Выгрузить набор значений
Если требуется получить пару «имя/значение текущего клю-
ча», то следует воспользоваться функцией RegQueryValueEx,
Этот вызов принимает имя и возвращает соответствующее это-
78

му имени значение ключа. Если не известно, какие значения
содержит данный ключ, то необходимо использовать функцию
RegEnumValue, с помощью которой можно последовательно перебирать пары «имя/значение, хранящиеся в рамках открытого
пользователем ключа».
При использовании вызова RegEnumValue следует учитывать, что если ключ обладает лишь одним значением по умолчанию, функция вернет это значение. Однако, если помимо значения по умолчанию ключ содержит в себе другие пары «имя/
значение», функция RegEnumValue последовательно вернет
пользователю эти пары, однако в этом случае значение по умолчанию будет пропущено. Каждый ключ реестра может обладать
значением по умолчанию (имя этого значения – пустая строка),
а также набором других значений, каждое из которых идентифицируется с помощью символьного имени.
Следующая функция является примером работы с реестром и выполняет перечисление содержимого ключа реестра
HKEY_CURRENT_USER\Software. Работа с реестром реализована с использованием исключительно API-функций, но в целом данную функцию можно применять только в приложениях ATL или MFC, в связи с использованием класса объектов
CString.
Пример 7.1. Функция перечисления содержимого ключа
реестра HKEY_CURRENT_USER\Software:
void RegReadSample (CString &strResult)
{
TCHARszBu[MAX_PATH];
DWORDdwBSize=MAX_PATH,dwIndex=0;
HKEY hKey=0;
LONG lResult=0;
FILETIMEft;
lResult = ::RegOpenKeyEx(HKEY_CURRENT_USER,
_T("software"),0,KEY_ENUMERATE_SUB_KEYS,&hKey);
if(lResult==ERROR_SUCCESS)
{
79

while(lResult==ERROR_SUCCESS)
{
while(lResult==ERROR_SUCCESS)
{
lResult=::RegEnumKeyEx(hKey,dwIndex,szBu,&dwB
Size,0,0,0,&ft);
if(lResult==ERROR_SUCCESS)
{
dwIndex++;dwBSize=MAX_PATH;
strResult+=(CString(szBu)+_T("\r\n"));
}
}
}
UpdateData(0);
}
При разработке приложения для реализации его интерфейса использованы классы библиотеки MFC. В приведенном
выше примере использованы следующие функции для работы
с реестром: RegOpenKeyEx, RegEnumKeyEx.
Очень важно при работе с реестром помнить об особенности
функции RegDeleteKey. При вызове этой функции необходимо обязательно проверять параметр, передаваемый в эту функцию, на наличие в нем информации. Этот параметр не должен
быть пустым, в противном случае ОС может быть очень серьезно повреждена.
В случае успешного выполнения функций RegOpenKeyEx,
RegEnumKeyEx возвращается значение ERROR_SUCCESS. При
вызове функции RegOpenKeyEx используется параметр KEY_
ENUMERATE_SUB_KEYS, который указывает тип маски доступа к ключам реестра. Указанное значение не единственное. Все
возможные значения этого параметра приведены в табл. 7.4.
При работе с реестром необходимо помнить, что доступ к
реестру в целом и его ключам в частности регулируется правами пользователя, профиль которого активен в данный момент
80
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
