Лекції з WinApi

Тема №7 Системний реєстр

7. Системний реєстр
 7.1. Загальна структура системного реєстру

Системний реєстр (registry) - спеціальна системна база даних, у якій додатки й операційна система можуть зберігати інформацію про конфігурацію.

Операційна система використовує системний реєстр у такий спосіб:

  1. При запуску програми установки Windows (Windows setup), додаванні нового обладнання через панель чи керування запуску програм установки устаткування, операційна система (Configuration manager) додає до реєстру інформацію об устаткування. У реєстрі міститься повний список пристроїв.
  2. При установці Windows “поверх” попередньої версії до реєстру переноситься інформація з INI файлів.
  3. При чи додаванні видаленні пристроїв, що підтримують специфікацію Plug and Play, що відповідає інформація заноситься в registry.
  4. Драйвери пристроїв зчитують з реєстру настроювання, подібно тому, як це робиться при використанні рядка device= файлу CONFIG.SYS.
  5. З реєстром працюють різні адміністративні програми, наприклад Панель Керування (Control Panel).

Дані в системному реєстрі зберігаються в двійковому виді. Для роботи з ними додатки повинні використовувати спеціальні системні функції.

Дані в реєстрі організовані у виді дерева. Вузли цього дерева називаються ключами (key). Кожен ключ може містити будь-яку кількість підключей і значень (values). Кожен ключ має ім'я складається з одного чи декількох символів. Ім'я не може містити в собі пробіли, зворотну косу рису, символи “*” і “?”. Імена ключів, що починаються з крапки зарезервовані. Ім'я підключа повинне бути унікальним відносно выщележачого ключа.

Додаток повинний відкрити ключ перед тим як додавати в нього дані. Для того, щоб відкрити новий ключ, додаток повинний надати системі уже відкритий раніше ключ. Для того, щоб це було можливе система завжди надає два відкритих ключі (HKEY_LOCAL_MACHINE і HKEY_USERS). Перший містить інформацію описваючу можливі конфігурації комп'ютера, другий - усіх користувачів. Додаток використовує ці ключі, як крапки входу до реєстру. Крім цього завжди визначені два інших ключі, що містять посилання на актуальні підключи цих ключів. Один з них, HKEY_CLASSES_ROOT, описує актуальну конфігурацію програмного забезпечення комп'ютера з HKEY_LOCAL_MACHINE, інший, HKEY_CURRENT_USER, посилається на працюючого користувача з HKEY_USERS. Значення інших ключів системно залежно. Як приклад розглянемо реєстр Windows’95.

7. Системний реєстр.
 7.2. Системний реєстр Windows’95.

Системний реєстр Windows’95 має наступну структуру:

Ключ

Збережена інформація

HKEY_LOCAL_MACHINE

Специфічна для даного комп'ютера інформація, що використовується всіма користувачами комп'ютера. Використовуються наступні підключи (папки)

  • Config - всі альтернативні конфігурації, можливі для даного комп'ютера. Наприклад, для docking station
  • Enum - інформація про все устаткування комп'ютера
  • Hardware - інформація про послідовні порти і модеми
  • Network - інформація про підключення до мережі, (напр. ім'я користувача в мережі)
  • Security - інформація про захист і можливості вилученого доступу й адміністрування
  • Software - інформація про програмне забезпечення, установленому на комп'ютері. Використовується програмним забезпеченням для установки власної конфігурації
  • System - описує конфігурацію драйверів і сервісів, доступних операційній системі

HKEY_CURRENT_CONFIG

Указує на актуальний підключ ключаHKEY_LOCAL_MACHINE\Config

HKEY_DYN_DATA

Містить посилання на частину інформації вHKEY_LOCAL_MACHINE, що відноситься до пристроїв Plug and Play, Ця інформація змінюється при підключенні і відключенні пристроїв.

HKEY_CLASSES_ROOT

Містить посилання на частину інформації вHKEY_LOCAL_MACHINE, що відноситься до програмного забезпечення.

HKEY_USERS

Містить інформацію про всіх користувачів, що працюють на даному комп'ютері. Кожному користувачу виділяється підключ.

HKEY_CURRENT_USER

Містить посилання на підключ, що відповідає користувачу, що працює із системою в сучасний момент часу.

7. Системний реєстр.
 7.3. Робота додатків із системним реєстром.

Формально, додатки можуть зберігати в реєстрі будь-які дані, однак вони повинні дотримувати наступних “правил поведінки”:

  • До реєстру записуються тільки дані про конфігурацію й ініціалізацію додатка. Інші дані повинні зберігатися в іншім місці.
  • Дані, що мають розмір більше двох кілобайт повинні зберігатися у файлі. До реєстру записується ім'я цього файлу.
  • Код, що виконується, не повинний зберігатися в реєстрі.
  • Значення займають менше місця, чим ключі. Додаток повинний, по можливості, групувати свої дані в структуру, а не створювати ключ для кожного елемента даних

Перед записом інформації до реєстру необхідно визначити, до чого відноситься ця інформація: чи є вона загальної для всіх користувачів чи комп'ютера специфічна для кожного окремого користувача

Інформація загальна для всіх користувачів повинна заноситися в ключ виду:

HKEY_LOCAL_MACHINE\Software\MyCompany\MyProduct\1.0

Інформація специфічна для користувача повинна заноситися в ключ виду:

HKEY_CURRENT_USER\Software\MyCompany\MyProduct\1.0\...

Нижче перераховані деякі функції, призначені для роботи із системним реєстром

Функція

Виконувана дія

RegCreateKey

RegCreateKeyEx

Створення підключа

RegOpenKey

RegOpenKeyEx

Одержання описувача існуючого ключа (відкриття ключа)

RegSetValue

RegSetValueEx

Запис нового імені даних у ключі і запис цих даних

RegQueryValue

RegQueryValueEx

Читання значення з ключа по імені даних

RegEnumValue

Читання значення з ключа по номері даних

RegCloseKey

Закриття ключа і відновлення реєстру

RegNotifyChangeKeyValue

Визначення події, що повинне відбутися при зміні заданого значення в реєстрі (див. 6.2.5).

Приклад програми, що працює з реєстром

#include <windows.h>

#include <stdio.h>

main()

{ HKEY MyKey ;

LONG ErrorCode ;

char Value[80] ;

char Name[80] ;

DWORD NameSize ;

DWORD ValueSize ;

int і ;

/* Створення нового підключа */

ErrorCode = RegCreateKey(HKEY_CURRENT_USER,

"\\Software\\MyCompany\\MyProduct\\1.0\\aaa",

&MyKey );

if ( ERROR_SUCCESS != ErrorCode )

return 1 ;

/* Запис у підключ десятьох нових даних з ім'ям Namex і значенням Valuex */

for ( i = 0 ; i < 10 ; i++ ) {

sprintf( Name, "Name%d", i ) ;

sprintf( Value, "Value%d", i ) ;

ErrorCode = RegSetValueEx( MyKey,Name,0,REG_SZ,

Value,strlen(Value)+1);

if ( ERROR_SUCCESS != ErrorCode )

return 2 ;

}

/* Читання з підключа всіх записаних значень по номеру і й їх друк */

for ( i = 0 ; ; i++ ) {

NameSize = sizeof( Name );

ValueSize = sizeof( Value );

ErrorCode = RegEnumValue( MyKey, i, Name, &NameSize,

0,NULL, Value, &ValueSize ) ;

if ( ErrorCode != ERROR_SUCCESS )

break ;

printf( "%d: %s -- %s\n", i, Name, Value ) ;

}

RegCloseKey( MyKey ) ;

return 0 ;

}