§ 6.1.Структураиособенностиреестра Windows
Реестр (registry) - понятие сравнительно новое. Приложения, работавшие в среде
Windows 3.x и DOS, обычно создавали файлы инициализации, в которые записывалась
информация о параметрах конфигурации, пользовательских настройках, флагах состоя-
ния и других характеристиках приложения. Так, файл Win.INI содержит данные о кон-
фигурации системы, файл Reg.DAT - о связях между приложениями и расширениями
документов, а также об OLE-объектах, файл System.INI - об аппаратной конфигурации.
В других INI-файлах хранятся сведения о параметрах отдельных приложений.
Все файлы инициализации записываются в ASCII-формате, и доступ к ним можно
осуществить с помощью любого текстового редактора. Конечно, разработчики операци-
онной системы и приложений вовсе не стремятся к тому, чтобы пользователи самостоя-
тельно "ковырялись" в файлах инициализации. В идеале, эти файлы должны изменяться
только приложениями. Следует отметить, что файлы инициализации часто портятся, мо-
гут быть случайно удалены. Порой самые невинные изменения одного из них приводят к
необратимым последствиям, нарушая работу всей системы. Короче говоря, файлы ини-
циализации - это вечная головная боль программистов.
С появлением Windows NT (версия 3.1) на смену множеству разрозненных файлов
инициализации, в том числе System.INI, Win.INI, Protocol.INI, Config.SYS и
Autoexec.BAT, пришел единый системный реестр, хотя даже сегодня некоторые прило-
жения все еще записывают свои параметры в INI-файлы [12]. При запуске приложения
многие из этих параметров записываются в реестр, т.е. хранятся в двух форматах. Сле-
довательно, при перезагрузке системы конфигурацию, которая была нарушена в резуль-
тате повреждения или ошибочного удаления INI-файла, можно восстановить.
Если говорить честно, системный реестр - это тоже головная боль программистов,
хотя и не такая сильная, как файлы инициализации. Разработчику приложений просто
необходимо знать, как используется реестр. В данной лекции рассмотрим методы созда-
ния разделов реестра, записи и чтения данных о конфигурации системы.
Реестр Windows представляет собой иерархическую структурированную базу дан-
ных, в которой содержится информация обо всех системных настройках, путях, пере-
менных, а также параметрах приложений, ранее располагавшаяся в разрозненных фай-
лах инициализации [12].
В Windows 9x физически реестр располагается в двух файлах в каталоге
\SystemRoot\ - System.dat и User.dat. Первый файл System.dat -содержит информацию,
общую для всех пользователей данного компьютера: параметры устройств, настройки
некоторых программ и др. Второй файл - User.dat - является специфичным для каждого
пользователя, сораняя его настройки. Оба файла имеют атрибут "Скрытый". Если на
компьютере
зарегистрировано
несколько
пользователей,
то
в
папке
\SystemRoot\Profiles\ хранятся в отдельных каталогах "личные" файлы каждого: содер-
жимое Рабочего стола, главное меню и др., а также часть User.dat системного реестра. В
папке \SystemRoot\ тоже хранится файл User.dat, содержащий настройки системы по
умолчанию (то есть те, которые будут загружены, если в ответ на запрос имени пользо-
вателя и пароля нажать клавишу Esc). При загрузке компьютера после ввода имени
пользователя файл User.dat из каталога этого пользователя вместе с System.dat и User.dat
из каталога Windows загружается в память и "склеивается" с ними в единое целое. В
Windows NT (в версиях до Windows NT 4) реестр располагается в папках
\SystemRoot\System32\config\ и в \UserProfile\ Ntuser.dat. Реестр Windows NT последних
поколений (старше версии 4.0) имеет более сложную конфигурацию, которая будет рас-
смотрена далее.
Формат базы данных имеет ряд преимуществ по сравнению с форматом простого
списка. Данные реестра защищены как от непреднамеренной порчи, так и от случайного
удаления. Кроме того, поскольку вся системная информация находится в одном месте,
вы можете легко и быстро получить доступ к интересующим вас данным, не занимаясь
утомительным поиском в нескольких разрозненных источниках [12]. В Windows каждый
раз после успешной загрузки компьютера автоматически создаются резервные копии
файлов System.DAT и User.DAT под именами System.DA0 и User.DA0. Эти файлы могут
использоваться для восстановления поврежденных файлов реестра. К сожалению,
Windows 98 не поддерживает эту операцию, однако средства восстановления реестра в
ней все-таки реализованы. В данном случае необходимо выполнить следующую после-
довательность действий [4]:
1. Запустить ПЭВМ в режиме Safe Mode Command Prompt Only;
2. После запуска ПЭВМ в режиме MS-DOS перейти в папку command Windows,
cd\Windows\command;
3. Набрать команду: scanreg/restore;
4. Выбрать предыдущую версию реестра, которую вы хотите восстановить;
5. Перезапустить ПЭВМ.
Напрямую данные системного реестра не доступны. Их нельзя просматривать и
редактировать так же просто, как записи в INI-файлах. Для работы с реестром предна-
значен редактор реестра - Registry Editor (утилита RegEdit.EXE или RegEd32.EXE).
Windows не инсталлирует утилиту RegEdit или RegEd32 в программную группу и
не создает для нее ярлык в стартовом меню для быстрого доступа. Но это не упущение
разработчиков Microsoft, а специальная мера защиты реестра от неквалифицированных
пользователей Некорректные операции с реестром могут необратимым образом повре-
дить всю систему.
Прежде чем изменять системную информацию, необходимо сделать резервную ко-
пию реестра. Для этой цели в меню Registry имеется команда Export Registry File, осу-
ществляющая резервное копирование всего реестра. Выберите удобное место и легко
распознаваемое имя для записи резервной копии реестра, например корневой каталог и
имя Registry. REG. He следует изменять расширение REG, иначе вы столкнетесь с труд-
ностями при восстановлении данных. Имейте в виду, что файл записывается в ASCII-
формате и будет занимать около 4-5 Мб.
Теперь, если изменение системной информации приведет к возникновению каких-
либо проблем, вы всегда сможете восстановить первоначальный реестр, либо импорти-
ровав резервную копию с помощью редактора реестра, либо просто выполнив двойной
щелчок на имени экспортированного файла. В случае серьезной ошибки поврежденные
файлы системного реестра (System.DAT и User.DAT) можно заменить их резервными
копиями, восстановив тем самым исходную конфигурацию.
Несмотря на необходимость соблюдать все меры предосторожности, иногда все-
таки возникает потребность в прямом доступе к системному реестру. Простой просмотр
сложной и многокомпонентной иерархической структуры может оказаться непростой и
довольно утомительной задачей. Единственным альтернативным методом поиска опре-
деленной записи (точное расположение которой не известно) является применение на-
ходящихся в меню Edit команд Find и Find Next с указанием искомой строки или како-
го-либо другого известного значения.
С точки зрения разработчика, более важно не уметь редактировать реестр, а знать,
каким образом он используется приложениями, т.е. как они записывают данные в реестр
и читают из него системную информацию. Для этого необходимо разобраться со струк-
турой реестра.
Реестр представляет собой иерархическую систему разделов и подразделов. На-
гляднее будет представить структуру реестра в виде дерева, разделы и подразделы кото-
рого аналогичны каталогам и подкаталогам файловой системы (именно таким образом
реестр представлен в окне Registry Editor). Раздел (key) любого уровня может содер-
жать один или несколько фрагментов информации (параметров), подобно тому как лю-
бой каталог может содержать один или несколько файлов; в разделе могут также содер-
жаться подразделы.
Основу структуры реестра Windows 9x и NT первых поколений составляют шесть
разделов верхнего уровня (табл. 6.1), предоставляющих доступ ко всем остальным под-
разделам.
Таблица 6.1
Раздел
HKEY_CLASSES_ROOT
HKEY_CURRENT_USER
HKEY_LOCAL_MACHINE
HKEY_USERS
Содержимое
Информация о зарегистрированных классах, расши-
рениях документов и т.д. На самом деле данный раз-
дел является ссылкой на подраздел
HKEY_LOCAL_MACHINE\SOFTWARE\Classes
Информация, о текущей пользовательской конфигу-
рации, внешнем виде рабочего стола, сетевых на-
стройках и т.д. Реально этот раздел представляет со-
бой ссылку на подраздел HKEY_USERS для текущего
пользователя
Информация о системной (аппаратной) конфигура-
ции, в том числе о глобальных настройках приложе-
ний, поддерживаемых устройствах, схемах подклю-
чения устройств и т.д.
Информация обо всех пользователях, зарегистриро-
ванных в локальной системе (см. раздел
HKEY_CURRENT_USER)
HKEY_CURRENT_CONFIG Ссылка на подраздел HKEY_LOCAL_MACHINE \
Config \ xxxxxx, где хххххх - это числовой параметр,
соответствующий текущей аппаратной конфигурации
HKEY_DYN_DATA
Динамические данные для устройств типа Plug-and-
Play и VdX-драйверов виртуальных устройств
Windows XP в отличие от своих предшественниц не имеет ограничения по размеру
реестра. Реестр Windows XP содержит пять основных разделов:
HKEY_CLASSES_ROOT - в этом разделе хранится информация о зарегистрированных
классах, расширениях документов.
HKEY_CURRENT_USER - хранится информация о текущей пользовательской конфи-
гурации, внешнем виде рабочего стола, сетевых настройках.
HKEY_LOCAL_MACHINE - хранится информация о системной и аппаратной конфи-
гурации.
HKEY_USERS - хранится информация обо всех зарегистрированных пользователях.
HKEY_CURRENT_CONFIG - текущая аппаратная конфигурация.
Элементы реестра Windows XP хранятся в виде атомарной структуры. Реестр раз-
деляется на составные части (ульи - hives) или кусты. Ульи хранятся на диске в виде
файлов. Некоторые ульи, такие, как HKLM\HARDWARE, не сохраняются в файлах, а
создаются при каждой загрузке, то есть являются изменяемыми (vola-tile). При запуске
системы реестр собирается из ульев в единую древовидную структуру с корневыми раз-
делами. В таблице 6.2 перечислены ульи реестра и их местоположение на диске (данные
справедливы для NT старше версии 4.0).
Таблица 6.2
HKLM\SYSTEM
HKLM\SAM
Улей
Расположение
SystemRoot\system32\config\system
SystemRoot\system3 2\config\SAM
HKLM\SECURITY
HKLM\SOFTWARE
HKLM\HARDWARE
HKLM\SYSTEM\Clone
HKU\<SID пользователя>
HKU\<SID пользователя> Classes
HKU\.DEFAULT
SystemRoot\system32\config\SECURITY
SystemRoot\system32\config\software
Изменяемый улей
Изменяемый улей
USERPROFILE\ntuser.dat
USERPROFILE\Local Settings\Application Data\
Microsoft\Windows\UsrClass.dat
SystemRoot\system32\config\default
Кроме данных файлов, имеется ряд вспомогательных, со следующими расшире-
ниями:
• LOG - журнал транзакций, в котором регистрируются все изменения реестра.
• SAV - копии ульев в том виде, в котором они были после завершения текстовой фазы
установки.
Реестр является настоящей базой данных, поэтому в нем используется технология
восстановления, похожая как в NTFS. Уже упомянутые LOG-файлы содержат журнал
транзакций, который хранит все изменения. Благодаря этому реализуется атомарность
реестра - то есть в данный момент времени в реестре могут быть либо старые значения,
либо новые, даже после сбоя. Как видим, в отличие от NTFS, здесь обеспечивается со-
хранность не только структуры реестра, но и данных. К тому же, реестр поддерживает
такие параметры NTFS, как управление избирательным доступом и аудит событий - сис-
тема безопасности пронизывает всю современную NT.
Внутри корневого раздела находятся разделы и подразделы, которые аналогичны
каталогам и подкаталогам жесткого диска. Раздел может содержать информацию или
данные. Раздел и подраздел могут содержать 0, 1 или несколько параметров, параметр
по умолчанию, а также 0 или несколько подразделов. Каждый параметр имеет имя, тип и
значение. Три части параметра реестра всегда располагаются в определенном порядке:
[RegistrySizeLimit] [REG_DWORD] [0х8000000]. Имя, Тип данных, значение.
Записи реестра, называемые параметрами, могут содержать данные различных
типов (табл. 6.3). Среди них чаще всего используются данные, записанные в двоичном,
десятичном или шестнадцатеричном и в текстовом форматах. Однако используемый тип
данных оказывает незначительное влияние на операции чтения и записи благодаря при-
менению API-функций RegQueryValueEx() и RegSetValueEx(), о которых мы поговорим
далее.
Таблица 6.3
Тип данных
REG_BINARY
REG_DWORD
Описание
Необработанные двоичные данные. Большинство сведений об
аппаратных компонентах хранится в виде двоичных данных и
выводится в редакторе реестра в шестнадцатеричном формате.
Данные, представленные целым числом. Многие параметры
служб и драйверов устройств имеют этот тип и отображаются
в двоичном, шестнадцатеричном или десятичном форматах.
Окончание табл. 6.3
REG_SZ
Текстовая строка в формате, удобном для восприятия челове-
ком. Значениям, представляющим собой описания компонен-
тов, обычно присваивается именно этот тип данных.
REG_EXPAND_SZ
REG_MULTI_SZ
REG_FULL_
RESOURCE_
DESCRIPTOR
REG_LINK
Расширяемая строка данных. Эта строка представляет собой
текст, содержащий переменную, которая может быть заменена
при вызове со стороны приложения.
Многострочное поле. Значения, которые фактически пред-
ставляют собой списки текстовых строк в формате, удобном
для восприятия человеком, обычно имеют именно этот тип
данных, строки разделены символом NULL.
Последовательность вложенных массивов, разработанная для
хранения списка ресурсов аппаратного компонента или драй-
вера.
Символьная ссылка в кодировке Unicode
REG_RESOURCE_LIST Список ресурсов драйверов устройств
REG_NONE
Тип значения не определен
§ 6.2. API-функциидляработысреестром Windows
Windows API содержит 26 функций, предназначенных для работы с реестром
(включая 5 функций, которые служат для совместимости с Windows 3.х). Из всех этих
функций в приложениях обычно используются не более трех-четырех. Все API-
функции, применяемые для выполнения операций с реестром, перечислены в табл. 6.4.
Таблица 6.4
Функция
RegCloseKey
RegConnectRegistry
RegCreateKey
RegCreateKeyEx
RegDeleteKey
RegDeleteValue
RegEnumKey*
RegEnumKeyEx
RegEnumValue
Выполняемое действие
Закрывает (освобождает) дескриптор указанного разде-
ла без обновления реестра; см. также функцию
RegFlushKey. (Для всех версий)
Устанавливает связь с заранее определенным дескрип-
тором реестра на другом (удаленном или сетевом) ком-
пьютере. Для выполнения операций с локальным реест-
ром не нужна. (Для всех версий)
Создает заданный раздел или, если таковой уже суще-
ствует, открывает его
Создает заданный раздел или, если таковой уже суще-
ствует, открывает его. (Для Windows 98/95/NT)
Удаляет заданный раздел и все его подразделы. (Для
Windows 98/95). Удаляет заданный раздел, но не удаля-
ет его подразделы. (Для Windows NT)
Удаляет значение именованного параметра из заданно-
го раздела реестра. (Для всех версий)
Составляет список подразделов заданного открытого
раздела.
Составляет список подразделов заданного открытого
раздела. (Для Windows 98/95/NT)
Составляет список параметров, которые содержатся в
заданном открытом разделе. (Для Windows 98/95/NT)
Окончание табл. 6.4
RegFlushKey
RegGetKeySecurity
RegLoadKey
Записывает все атрибуты заданного раздела в реестр.
(Для всех версий)
Возвращает дескриптор безопасности заданного откры-
того раздела. (Для Windows NT)
Создает подраздел раздела HKEY_USER или
HKEY_LOCAL_MACHINE, прежде чем копировать в
этот подраздел информацию из указанного файла. (Для
всех версий)
RegNotifyChangeKeyValue Извещает вызывающую функцию об изменении атри-
бутов или содержимого открытого раздела. Не извещает
об удалении раздела. (Для всех версий)
RegOpenKey*
RegOpenKeyEx
RegQuerylnfoKey**
RegQueryMultipleValues
RegQueryValue*
RegQueryValueEx**
RegReplaceKey
RegRestoreKey
RegSaveKey
RegSetKeySecurity
RegSetValue*
RegSetValueEx**
RegUnLoadKey
Открывает указанный раздел, но не создает его
Открывает указанный раздел, но не создает его. (Для
Windows 98/95/NT)
Читает информацию об открытом подразделе, в том
числе о его размере, номере, классе, атрибуте безопас-
ности и т.д. (Для Windows 98/95/NT)
Возвращает тип и данные для списка имен параметров,
связанных с открытым разделом. (Для всех версий)
Читает значение, связанное с безымянным параметром
указанного открытого раздела
Читает значение, связанное с безымянным параметром
указанного открытого раздела. (Для Windows 98/95/NT)
Заменяет файл, в котором хранятся копии разделов и
подразделов, новым файлом. При перезапуске системы
разделы и подразделы получат значения параметров,
заданные в новом файле. (Для Windows 98/95/NT)
Читает данные реестра из указанного файла, копируя их
в подразделы заданного раздела. (Для всех версий)
Сохраняет указанный раздел, подразделы и параметры в
файле. (Для всех версий)
Устанавливает атрибут безопасности открытого разде-
ла. (Для Windows NT)
Связывает безымянный параметр (текстовый) с опреде-
ленным разделом
Сохраняет данные в заданном параметре открытого
раздела и может присвоить разделу дополнительное
значение и информацию о типе. (Для Windows
98/95/NT)
Выгружает (удаляет) из реестра указанный раздел, все
его подразделы и параметры. (Для Windows 98/95/NT)
* Функция обеспечивает совместимость с Windows З.х.
** Функции, которые чаще всего используются приложениями.
API-функции RegSetKeySecurity(), RegGetKeySecurity(), а также параметры безо-
пасности некоторых других функций можно применять только в среде Windows NT.
Windows 9x не поддерживает защиты реестра, поэтому атрибуты безопасности просто
игнорируются или возвращаются в виде нулевых значений.
Рассмотрим определение некоторых основных функций работы с реестром. Функ-
ция RegQueryInfoKey() определена следующим образом:
| Поделиться: |
Поиск по сайту
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-04-02 Нарушение авторских прав и Нарушение персональных данных