
- •1.1 Основы программирования в операционной системе Windows
- •1.1.1 Вызов функций api
- •1.1.2 Структура программы
- •1.2 Вопросы системного программирования в Windows
- •1.2.1 Страничная и сегментная адресация.
- •1.2.2 Адресное пространство процесса.
- •2.1 Управление процессами
- •2.2 Процессы и потоки в Windows
- •2.3 Создание процессов
- •2.4 Определение исполняемого образа и командной строки
- •2.5 Идентификация процессов
- •3.1 Создание потока. Функция CreateThread
- •3.2. Завершение потока
- •3.3 Другие функции работы с потоками
- •3.4 Структура context
- •3.5 Приоритеты потоков
- •4.1 Объект critical_section
- •4.2 Мьютексы
- •4.3 Семафоры
- •5.1 События
- •7.1 Кучи
- •7.2 Управление памятью кучи
- •Другие функции для работы с кучей
- •Резюме по управлению кучей
- •Отображение адресного пространства процесса в объекты отображения
- •Что такое импорт
- •Явная загрузка dll
- •Явное подключение экспортируемого идентификатора
- •10.1 Управление файлами и каталогами Создание и открытие файлов
- •10.2 Управление каталогами
- •10.3 Другие методы получения атрибутов файлов и каталогов
- •11.1 Блокировка файлов
- •11.2 Реестр
- •12.1 Стандартные устройства и консольный ввод-вывод
- •12.2 Асинхронный ввод-вывод и порты завершения
- •Параметры
- •Цели системы безопасности
- •Параметры
- •Аварийное завершение
- •Использование именованных каналов
- •Параметры
- •Наблюдение за сообщениями в именованном канале
- •Параметры
11.2 Реестр
Реестр — это централизованная иерархическая база данных конфигурации приложений и системы. Доступ к реестру осуществляется через разделы реестра, которые аналогичны каталогам файловой системы. Раздел может содержать другие разделы или пары "параметр-значение", которые можно уподобить именам файлов и их содержимому.
Пользователь или администратор могут просматривать и редактировать содержимое реестра с помощью редактора реестра, который вызывается командой REGEDIT32. Кроме того, программы могут управлять реестром через функции API, описанные в этом разделе.
Пары "параметр-значение" в реестре содержат, в частности, следующую информацию:
номер версии и номер выпуска операционной системы, а также имя зарегистрирован-ного пользователя;
информацию подобного рода обо всех правильно установленных приложениях;
информацию о типе процессора компьютера, количестве процессоров, систем ной памяти и т.д.;
пользовательскую информацию, такую как основной каталог и настройки приложений;
данные безопасности, например имена учетных записей пользователей;
установленные службы;
соответствия между расширениями файлов и выполняемыми программами, которые применяются оболочкой интерфейса пользователя, когда он щелкает на значке файла; например, расширение .doc может соответствовать Microsoft Word;
соответствия между сетевыми адресами и именами компьютеров.
Разделы реестра
Можно заметить аналогию между каталогами файловой системы и разделами реестра. Каждый раздел может содержать другие разделы, а также последовательность пар "параметр-значение". Подобно тому как к файловой системе можно обращаться с помощью полных имен файлов, к реестру можно обращаться по именам разделов. Точками входа в реестр служат несколько стандартных разделов.
1. HKEY_LOCAL_MACHINE хранит физическую информацию о машине, а также данные об установленном программном обеспечении. Для каждой установленной программы создаются подразделы вида
SOFTWARE\Название_компании\Название_продукта\Версия.
HKEY_USERS содержит данные конфигурации пользователей.
HKEY_CURRENT_CONFIG содержит текущие параметры настройки, такие как раз решающая способность монитора и шрифты.
HKEY_CLASSES_ROOT содержит подразделы, определяющие соответствие между расширениями файлов и классами и приложениями, используемыми оболочкой для доступа к объектам с этими расширениями. В этом разделе также записаны все данные, необходимые для объектной модели компонентов Microsoft (COM).
HKEY_CURRENT_USER. Сюда относится информация данного пользователя, включая переменные окружения, принтеры и пользовательские настройки приложений.
Управление реестром
Функции управления реестром могут получать и устанавливать значения параметров, а также создавать новые подразделы и пары "параметр—значение". Для указания существующих разделов и получения новых применяются дескрипторы разделов типа HKEY. Значения имеют определенный тип; существует несколько возможных типов, например строки, двойные слова (DWORD) и расширяемые строки, параметры которых могут заменяться переменными окружения.
Управление разделами
Функция RegOpenKeyEx открывает подраздел. Начиная с одного из стандартных зарезервированных разделов, можно обойти весь реестр и получить дескриптор любого нужного подраздела.
LONG RegOpenKeyEx { HKEY hKey, LPCTSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
Параметры
hKey идентифицирует дескриптор открытого в данный момент раздела или одного из стандартных зарезервированных разделов;
phkResult указывает на переменную типа hkey, которая принимает дескриптор вновь открытого раздела.
lpSubKey — имя подраздела. Оно может содержать путь, например Microsoft\WindowsNT\CurrentVersion. Значение NULL вызывает открытие нового раздела-дубликата hKey. Значение ulOptions должно быть равно нулю.
samDesired — маска доступа, описывающая атрибуты безопасности нового раздела. Возможные значения — KEY_ALL_ACCESS, KEY_WRITE, KEY_QUERY_VALUE и
KEY_ENUMERATE_SUBKEYS.
Возвращаемое значение — это обычно ERROR_SUCCESS. Любое другое значение указывает на ошибку. Для закрытия открытого раздела служит функция RegCloseKey, в единственном параметре которой указывается дескриптор раздела.
Чтобы получить имена подразделов, следует указать дескриптор раздела в функции RegEnumKeyEx.
Существуют также функции, предназначенные для получения пар "параметр-значение": RegEnumValue и RegQueryValueEx. Функция RegSetValueEx записывает типизированные данные в поле значения открытого раздела.
RegEnumKeyEx выводит подразделы открытого раздела реестра подобно тому, как FirstFile и FindNextFile выводят содержимое каталога. Эта функция выдает имя раздела, строку класса и время последнего изменения.
LONG RegEnumKeyEx ( HKEY hKey, DWORD dwIndex,
LPTSTR lpMame, LPDWORD lpcbName, LPDWORD lpReserved,
LPTSTR lpClass, LPDWORD lpcbClass,
PFILETIME lpftLastWriteTime)
Параметр dwIndex при первом вызове должен быть равен нулю, а при каждом последующем — увеличиваться на единицу. Имя раздела и его размер, а также строка класса и ее размер возвращаются обычным способом. Функция возвращает ERROR_SUCCESS или значение ошибки.
Можно также создавать новые разделы. Для этого предназначена функция RegCreateKeyEx. Разделам можно присваивать атрибуты безопасности таким же образом, как каталогам и файлам.
LONG RegCreateKeyEx ( HKEY hKey, LPCTSTR lpSubKey,
DWORD Reserved, LPTSTR lpClass, DWORD dwOptions,
REGSAM samDesired, LPSECURITY_ATTRIBUTES lpSecurityAttributes,
PHKEY phkResult, LPDWORD lpdwDisposition)
Параметры
lpSubKey — имя нового подраздела в открытом разделе, обозначенном дескриптором hKey.
lpClass — класс или тип объекта раздела, описывающий данные, которые он представляет. Возможные значения включают, в частности, REG_SZ (строку с завершающим нулем) и REG_DWORD (двойное слово).
dwOptions — либо нуль, либо одно из взаимно исключающих значений:
REG_OPTION_VOLATILE или REG_OPTION_NON_VOLATILE. Постоянная (non-volatile) информация реестра хранится в файле и восстанавливается при перезапуске системы. Непостоянные разделы хранятся в памяти и не восстанавливаются.
samDesired — то же значение, что и в RegOpenKeyEx.
lpSecurityAttributes может иметь значение NULL или указывать на атрибуты безопасности. Возможные права доступа выбираются из значений, указанных для samDesired.
lpdwDisposition указывает на значение DWORD, которое отмечает, существовал ли раздел раньше (REG_OPENED_EXISTING_KEY) или он создан вновь (REG_CREATED_NEW_KEY).
Для удаления раздела служит функция RegDeleteKey. Два ее параметра — дескриптор открытого раздела и имя подраздела.
Управление параметрами
Вывести параметры указанного открытого раздела можно с помощью функции RegEnumValue. Следует указать индекс параметра: при первом вызове — нуль, при последующих — с увеличением на единицу. Функция выдает строку с именем параметра и его длиной. Также возвращается значение параметра и его тип.
LONG RegEnumValue ( HKEY hKey, DWORD dwIndex,
LPTSTR lpValueName, LPDWORD lpcbValueName,
LPDWORD lpReserved, LPDWORD lpType,
LPBYTE lpData, LPDWORD lpcbData)
Текущее значение параметра возвращается в буфере, на который указывает lpData. Размер результата можно получить в lpcbData.
Тип данных, на который указывает lpType, может иметь множество значений, включая REG_BINARY, REG_DWORD, REG_SZ (строку) и REG_EXPAND_SZ (расширяемую строку с параметрами, заменяемыми переменными окружения). Список всех типов можно получить во встроенной справке.
Возвращаемое значение функции позволяет узнать, выведены ли все параметры. Значение равно ERROR_SUCCESS, если найден правильный параметр.
Функция RegQueryValueEx подобна приведенной выше за исключением того, что в ней указывается имя параметра, а не индекс. Эту функцию можно использовать, если известны имена параметров, в противном случае раздел следует просматривать с помощью RegEnumValueEx.
Чтобы установить значение параметра в открытом разделе, применяется функция RegSetValueEx. В ней указываются имя параметра, тип значения и само значение.
LONG RegSetValueEx ( HKEY hKey, LPCTSTR lpValueName,
DWORD Reserved, DWORD dwType, CONST BYTE *lpData, CONST cbData)
Наконец, для удаления параметров служит функция RegDeleteValue.
Лекция 12. Тема: Использование ввода-вывода