Ключ HKEY_USERS містить всі активно завантажені користувача профілі, включаючи HKEY_CURRENT_USER, а також користувальницький профіль за стандартом (. DEFAULT). Користувачі, які отримують віддалений доступ до сервера, не мають профілів, які утримуються під цим ключем, - їх профілі завантажуються в реєстри на власних комп’ютерах.
Параметри є важливою частиною реєстру після розділів. Кожен параметр має своє ім'я, значення і тип значення. Розглянемо найбільш часто використовуваних типів даних:
REG_BINARY - двійкові дані (Binary Value) є набором двійкових даних, доступних для редагування в шістнадцятиричному форматі. Подібний тип даних використовується для зберігання відомостей про апаратні ресурси;
REG_DWORD - ціле число (DWORD Value) може задаватися в двійковому, десятковому і шістнадцятиричному форматах. Це один з найвживаніших типів параметрів. Дуже часто він працює своєрідним перемикачем: 1 - включення (True) /0 - виключення (False). У реєстрі Windows 7 присутньо два види DWORD: 32-бітове значення і 64-бітове значення.
REG_MULTI_SZ - багаторядковий текст (Multi-String Value) зазвичай використовується для вистави;
REG_SZ - звичайний рядок в кодуванні Unicode будь-якої довжини. Найчастіше в цьому типові даних зберігається інформація, яка прочитуватиметься користувачем, шляхом доступу, назви пристроїв;
REG_NONE - служить як
семафор, тобто параметр існує, але не містить ніякого значення. Деякі
застосування перевіряють наявність цього параметра і, виходячи з результату
перевірки, виконують або не виконують дію.
2. Робота з реєстром ОС Windows
.1 Структура Windows-додатку
При написанні будь-яких програм для Windows необхідний файл включаємий файл windows.h. У ньому містяться прототипи всіх функцій Windows, визначені типи і структури даних, глобальні змінні і константи. Як вже наголошувалося вище, додаток Windows містить, принаймні, три принципово важливих модуля:
Функція Winmain;
Функція GetMessage;
Функція Wndproc.
Функція Winmain викликається системою як початкова точка входу, що базується на Windows, прикладної програми.
Синтаксис функції:WINAPI Winmain (HINSTANCE hinstance, // дескриптор поточного екземпляра вікна HINSTANCE hprevinstance, // дескриптор попереднього екземпляра вікна LPSTR lpcmdline, // покажчик на командний рядок int ncmdshow // показує стан вікна);
Параметри функції:
hInstance - [in] Дескриптор поточного екземпляра прикладної програми;
nCmdShow - [in] Визначає, як вікно має бути показане.
Якщо функція досягла мети, то завершується тоді, коли прийме повідомлення Wm_quit, при цьому вона повинна повернути значення виходу, що міститься в параметрі wparam цього повідомлення. Якщо функція завершується перед введенням циклу повідомлень, вона повинна повернути нуль.ініціалізує прикладну програму, відображає на екрані її основне вікно і, потім, входить в видобуває і розподіляє цикл повідомлень, що є керуючою структурою верхнього рівня для інших елементів виконання прикладної програми. Цикл повідомлень завершується тоді, коли він отримує повідомлення WM_QUIT. У цей момент, WinMain завершує роботу прикладної програми, повертаючи значення, передане в параметр wParam повідомлення WM_QUIT. Якщо WM_QUIT було отримано в результаті виклику PostQuitMessage, значення wParam - значення параметра nExitCode функції PostQuitMessage. Для отримання додаткової інформації, див Створення циклу обробки повідомлень. Додатки ANSI можуть використовувати параметр lpCmdLine функції WinMain, щоб звернутися до командного рядка, виключаючи ім’я програми. Причина цього в тому, що WinMain не може повертати рядки УНІКОД через те, що lpCmdLine використовує тип даних LPSTR, не тип даних LPTSTR. Функція GetCommandLine може бути використана для звернення до рядків Unicode в командному рядку, тому що вона використовує тип даних LPTSTR.
Віконна функція Wndproc призначена для організації адекватної реакції з боку Windows-програми на дії користувача і підтримки в актуальному стані того вікна додатка, повідомлення якого вона обробляє. Додаток може мати кілька віконних функцій, їх кількість визначається кількістю класів вікон, зареєстрованих в системі функцією RegisterClass (). Функції RegisterClass () за допомогою примірника структури типу WNDCLASS передається покажчик на певну віконну функція Windows-програми. Дана функція до кінця роботи програми пов’язана з екземплярами вікон, які, в свою чергу, створюються іншою функцією API - CreateWindow ().
Таким чином, при надходженні повідомлення Windows викликає віконну функцію і передає їй ряд параметрів, які беруться з відповідних полів повідомлення. Із заголовка віконної функції LRESULT CALLBACK WndProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lparam) видно, що вона отримує при активації її (функцією DispatchMessage ()) 4 параметра. Перший параметр (hwnd) - дескриптор вікна, якому призначено дане повідомлення. Це - той самий дескриптор, який був отриманий нами як результат роботи функції CreateWindow (), і в нашому варіанті програми тут же втрачено, так як був оголошений як локальна для функції Create () змінна. Тепер цей же дескриптор повернувся до нас з Windows як параметр віконної функції. Він особливо корисний у тих випадках, коли на базі одного класу створюється кілька розрізняються чимось вікон. Якщо клас один, то і віконна функція для всіх цих вікон одна; аналізуючи тоді параметр hwnd, програма може визначити, в яке саме вікно прийшло повідомлення. У нас вікно одне, однак, аргумент hwnd все ж таки знадобиться. Другий параметр (msg) визначає код прийшов повідомлення. Оскільки повідомлень багато, віконна функція повинна, перш за все, проаналізувати цей код і здійснити перехід на фрагмент обробки відповідного повідомлення. wParam і lParam - додаткові параметри, які є копіями відповідних полів структури надійшло повідомлення. Решта два поля структури msg - time і POINT використовуються досить рідко, і при необхідності їх значення можна витягти безпосередньо з екземпляра структури повідомлення. Центральним місцем віконної функції є синтаксична конструкція, в завдання якої входить розпізнавання надійшло повідомлення за його типу і передача управління на ту гілку коду віконної функції, яка продовжує далі роботу з параметрами повідомлення. Для цього використовується оператор switch case (перемикач).
Всі параметри, одержувані функцією WinMain, формуються операційною системою. Параметри hinstance і hPrevinstance являють собою відповідно ідентифікатори поточної та попередньої копії додатку. Додатки WIN32 функціонують в ізольованих віртуальних адресних просторах і в силу цього не мають можливості визначити через параметр hPrevinstance, не запущене чи додаток вдруге. Цей параметр використовувався в попередніх версіях Windows, для додатків WIN32 він завжди дорівнює нулю. Параметр lpszCmdLine - далекий покажчик на рядок запуску програми, параметр nCmdShow вказує рекомендований додатком спосіб представлення головного вікна при запуску. Додаток може ігнорувати цей параметр, однак це не є хорошим стилем програмування. Зазвичай значення даного параметра передається без змін функції ShowWindow для відображення на екрані головного вікна програми. Нижче наведені можливі значення параметра nCmdShow, визначені як константи з префіксами SW_:
SW_HIDE - приховати вікно і активізувати інше вікно;
SW_MINIMIZE - мінімізувати вікно і активізувати вікно верхнього рівня в системному списку;
SW_RESTORE - активізувати і відобразити вікно в його первісному розмірі і позиції;
SW_SHOW - активізувати і відобразити вікно в його поточному розмірі і позиції;
SW_SHOWMAXIMIZED - активізувати і відобразити вікно в повному розмірі;
SW_SHOWMINIMIZED - активізувати і відобразити вікно у вигляді піктограми;
SW_SHOWMINNOACTIVE - відобразити вікно у вигляді піктограми, активне вікно залишається активним;
SW_SHOWNA - відобразити вікно в поточному стані, активне вікно залишається активним;
SW_SHOWNOACTIVATE - відобразити вікно в його останньому розмірі і позиції, активне вікно залишається активним;
SW_SHOWNORMAL - аналогічно SW_RESTORE.
Модифікатор виклику WINAPI визначає порядок приміщення в стек параметрів функції при виклику. Для функцій також визначені наступні модифікатори:
# define CALLBACK __ stdcall;
# define WINAPI __ stdcall;
# define APIENTRY WINAPI;
- # define APIPRIVATE __ stdcall;
- # define PASCAL __ stdcall.
Функція GetMessage витягує чергове повідомлення з черги повідомлень викликав її потоку. Параметр lpmsg - далекий покажчик на структуру типу MSG. Параметр hwnd (ідентифікатор вікна) визначає конкретне вікно з числа вікон, створених потоком, якому надіслано повідомлення. Повідомлення, що ініціюються пристроями введення, такими як клавіатура або миша, надсилаються вікна, володіє фокусом введення (активного вікна). У кожен момент часу потік або взагалі не володіє фокусом введення (користувач працює з вікном іншого потоку), або фокус введення належить одному з його вікон. Якщо в якості другого параметра функції GetMessage вказано NULL (або 0), то повідомлення будуть вибиратися для всіх вікон, що належать викликав функцію потоку. Третій і четвертий параметри функції GetMessage задають діапазон номерів повідомлень, що витягають із черги. Якщо обидва параметри містять нуль, то витягуються всі повідомлення, спрямовані потоку. Функція GetMessage повертає значення FALSE в разі, якщо витягується повідомлення WM_QUIT, у всіх інших випадках повертається значення TRUE. Вибірка повідомлення WM_QUIT призводить до виходу з циклу, після чого зазвичай потік завершується. Слід також відзначити важливу особливість функції GetMessage: якщо функція виявляє, що черга повідомлень потоку порожня, то потік блокується і йому не виділяється процесорний час доти, поки нове повідомлення не надійде до черга. Якщо порожні черзі всіх прикладних потоків, то зазвичай процесорний час розподіляється між низькопріоритетним системними потоками, зокрема, запускається хранитель екрану.
Синтаксис:GetMessage (lpMsg,hWnd,wMsgFilterMin,wMsgFilterMax);
Параметри функції:
lpMsg - [out] приймає інформацію з черги повідомлень потоку;
hWnd - [in] Дескриптор вікна, чиї повідомлення повинні бути вилучені. Вікно повинне належати викликає потоку;
wMsgFilterMin - [in] Визначає цілу величину самого маленького значення повідомлення, яке буде витягнуто. Використовуйте повідомлення WM_KEYFIRST, щоб задати перше повідомлення клавіатури або WM_MOUSEFIRST, щоб задати перше повідомлення миші.
Якщо функція витягує
якесь повідомлення, а не WM_QUIT, величина що повертається буде значенню - не
нуль. Якщо функція витягує повідомлення WM_QUIT, величина, що повертається -
нуль. Якщо є помилка, величина, що повертається - (мінус). Наприклад, функція
завершується помилкою, якщо hWnd - неприпустимий дескриптор вікна або lpMsg -
неприпустимий покажчик. Щоб отримати додаткові відомості про помилку, викличте
функцію GetLastError.
2.2 Функції WinAPI
роботи з реєстром ОС Windows
Реєстр Windows (системний реєстр) - ієрархічно побудована база даних параметрів і налаштувань в більшості операційних систем Microsoft Windows.
Для роботи з реєстром використовуємо такі функції:
RegCloseKey;
- RegCreateKey;
- RegDeleteKey;
- RegDeleteValue;
- RegEnumKey;
- RegEnumValue;
RegOpenKey.
Функція RegCloseKey закриває відкритий раніше розділ реєстру.
Синтаксис:RegCloseKey (hKey
);
Функція вимагає єдиний параметр типу FIXED - маніпулятор відкритого розділу. При успішному завершенні функція повертає T, в іншому випадку повертається список з двох цілих: -1 і цілочисельний код помилки.
Функція RegCreateKey дозволяє створити неіснуючий розділ реєстру і відкрити його. Якщо розділ вже існує, то функція відкриває його.
Синтаксис:
LONG WINAPI RegCreateKey (
_In_ HKEY hKey,
_In_opt_ LPCTSTR lpSubKey,
_Out_ PHKEY phkResult
);
Першим параметром функції повинна бути бітова константа, що ідентифікує одну з кореневих гілок реєстру. Другим параметром повинна бути рядок - ім'я розділу. Ім'я розділу може містити розділити рівнів - зворотний слеш. У цьому випадку функція створить необхідну ланцюжок вкладених розділів. Третім параметром функція вимагає ціле число (FIXED), що задає статус створюваного ключа. Якщо заданий нуль, то ключ буде збережений у реєстрі, якщо задана одиниця-то ключ збережеться тільки до перезавантаження Windows. Останній четвертий параметр задає права доступу до заданого маніпулятору. Права доступу - це одна з бітових констант.
Функція завжди повертає список з двох цілих. Ознакою успішного завершення є відмінність голови списку від -1. У цьому випадку голова списку є маніпулятором відкритого розділу. Другий елемент списку може приймати значення 1 або 2. Одиниця означає, що необхідний розділ створено в процесі виклику. Двійка означає, що розділ існував раніше.
Функція RegDeleteKey дозволяє видалити розділ (ключ) реєстру з усіма його підрозділами.
Синтаксис:RegDeleteKey (hKey, lpSubKey
);
Функція приймати два параметри: позначення кореневого розділу (BITS) і повного «шляху» до розділу (STRING). Роздільником рівнів є зворотний слеш. Важливо відзначити, що відкривати розділ не потрібно.
Функція при успішному завершенні повертає T, а в разі помилки - список з двох елементів. Перший дорівнює -1, другий являє собою код завершення.
Функція RegDeleteValue дозволяє видалити параметр з попередньо відкритого розділу.
Синтаксис:RegDeleteValue (hKey, lpValueName
);
Функція приймає два параметри: маніпулятор розділу (FIXED) і ім'я параметра (STRING). При успіху функція повертає T, а при помилці - список з двох елементів: перший дорівнює -1, другий дорівнює коду завершення.
Функція RegEnumKey дозволяє перерахувати підрозділи попередньо відкритого розділу.
Синтаксис:
LONG RegEnumKey (hKey, dwIndex, lpName, cbName
);
Функція приймає два параметри: маніпулятор відкритого розділу (FIXED) і номер запитуваної підрозділу (FIXED). При успішному завершенні функція повертає список з трьох елементів: нуля (ознака успішного завершення), імені підрозділу та імені класу підрозділу. При невдалому завершенні функція повертає список з двох елементів. Перший з них - мінус одиниця (ознака помилки), другий - код завершення.
Функція RegEnumValue дозволяє перерахувати параметри попередньо відкритого ключа.
Синтаксис:RegEnumValue (hKey, dwIndex, lpValueName, lpcbValueName, lpType, lpData, lpcbData
);
Функція вимагає два параметри: маніпулятор розділу (FIXED) і номер параметра (FIXED). Параметри нумеруються з нуля.
Якщо процедура повертає список, перший першим елементом якого є нуль (ознака успіху), другим елементом є ім'я чергового параметра, третім елементом є тип параметра, четвертим (і, можливо, подальшими) є складові частини значення параметра. При невдалому завершенні першим елементом списку буде -1, а друга - код завершення.
Синтаксис:RegOpenKey (hKey, // дескриптор открытого ключаlpSubKey, // адрес имени открываемого подключаphkResult // адрес дескриптора открытого ключа
);
Функція вимагає три
параметри: гілка реєстру (BITS), шлях до потрібного розділу (STRING) і права
доступу (BITS). При успішному завершенні функція повертає список з двох
елементів: нуля (ознака успіху) і маніпулятора відкритого розділу.
2.3 REG-файл
файл - файл в який можна вносити зміни до реєстру шляхом внесення нових значень для потрібних параметрів в самому редакторові реєстру або за допомогою імпорту. Але є і інший спосіб. Можна заздалегідь підготувати файл в заданому форматі, і потрібні параметри автоматично встановляться в реєстрі. Для цих цілей використовуються текстові файли з розширенням REG.
От як виглядає приклад reg-файлу, який дозволить створити той же розділ з параметрами, які вводилися на попередніх практичних заняттях.Registry Editor Version 5.00 Встановлюємо нові параметри для розділу Test [Hkey_current_user\software\test] «Catname»= «За курсач потрібно ставити 5» «Catage»=dword:00000008
Розглянемо формат REG-файлів. Спочатку йде заголовок файлу Windows Registry Editor Version 5.00.
Потрібно зауважити, що в більш ранніх операційних системах, Windows 98 і Windows NT 4.0, використовувався заголовок REGEDIT4. Якщо у вас збереглися подібні старі файли, то не лякайтеся. Windows 7 зрозуміє цей файл і коректно обробить інформацію. А ось зворотний процес буде недоступний - Windows 98 не зможе розпізнати новий заголовок і видасть помилку. Одна важлива деталь - після заголовка обов’язково йде порожній рядок. Якщо вам потрібно включити в документ коментар, щоб не забути про призначення параметра, то поставте спочатку символ «;» (крапка з комою). При експорті розділу Test з минулого прикладу жодних коментарів не додається. Я це зробив вже після створення REG-файлу. Коментар служить для зручності самого користувача і до реєстру не вноситься. Встановлюємо нові параметри для розділу Test. Далі вказується розділ реєстру, який полягає у квадратні дужки. Зверніть увагу, що якщо зазначений у файлі розділ в реєстрі не існує, то він буде створений: [HKEY_CURRENT_USER \ Software \ Test] І нарешті, останній штрих - ви вказуєте параметр реєстру і його значення: «CatName» = 'Курсач на 5' В REG-файлі може міститися кілька розділів і параметрів реєстру, які пишуться з нового рядка, але заголовок використовується тільки один на самому початку. Наприкінці кожного файлу також має бути присутня порожній рядок. Як бачите, формат REG-фай-лов зовсім не складний і їх можна створювати самостійно, не вдаючись до допомоги інших програм.