Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Операционные системы и среды. В 2 частях. Ч.1. Курс лекций

.pdf
Скачиваний:
6
Добавлен:
07.09.2026
Размер:
1 Мб
Скачать
☆
ЛЕКЦИЯ 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_CLASS­ES_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)
{
TCHARszBu[MAX_PATH];
DWORDdwBSize=MAX_PATH,dwIndex=0;
HKEY hKey=0;
LONG lResult=0;
FILETIMEft;
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
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]