Налаштування Windows по коштах системного реєстру

[ виправити ] текст може містити помилки, будь ласка перевіряйте перш ніж використовувати.

скачати

Зміст

Введення

Постановка завдання

1. Аналіз предметної області

1.1 Опис API-функцій роботи з реєстром

1.2 Опис API-функцій роботи з потоками

2. Опис програмної реалізації

2.1 Опис структури програми

2.1.1 Діаграма взаємодії модулів

2.1.2 Опис структури модулів

2.2 Функції модуля MiniReg

2.3 Функції основного модуля (Unit1)

3. Програмна реалізація

3.1 Модуль роботи з реєстром (MiniReg)

3.2 Основний модуль програми (Unit1)

Інтерфейс програми

Висновок

Використана література

Введення

Даний курсовий проект розповідає про можливості налаштування, однією з найбільш поширених, на сьогоднішній день, операційних систем Windows ®, що поставляється Американською корпорацією Microsoft ®. Windows ® - це мульти задачную операційна система для робочих станцій PC (Personal Computer). Основною ідеєю, якою є організація взаємодії користувача одночасно з декількома додатками і прозора робота з апаратними засобами. Але це тема вже іншої курсового проекту, а зараз мова піде про можливості налаштування операційної системи Microsoft ® Windows ® за допомогою, так званого, системного реєстру.

Про те, що ж таке системний реєстр і з чим його їдять мова піде в розділі аналізу предметної області. Тут буде розказано що вдає із себе системний реєстр (далі просто реєстр), і чому Microsoft рекомендує зберігати стороннім фірмам зберігати налаштування своїх програм в реєстрі операційної системи (далі ОС), а не в INI-файлах.

Як можна використовувати системний реєстр, щоб змінити налаштування ОС "під себе" і прискорити або оптимізувати її роботу на прикладі (який я назвав MiniTweaker), буде коротко викладено в розділі постановки завдання. Опис прикладу та алгоритми його роботи буде зроблено в розділі аналізу поставленої задачі.

Про програмної реалізації MiniTweaker-а піде мова в розділі опису програмної реалізації, а його вихідний текст можна знайти у відповідному розділі (вихідний текст програми).

Підведення підсумків, аналіз повноти виконання завдання курсового проекту і можливості використання його даних в інших "життєвих" задачах розповідається в ув'язненні.

Постановка завдання

Системний реєстр - це криниця всіляких даних, тут зберігаються налаштування як самої ОС, так і не системного програмного забезпечення (далі ПЗ), а так само надбудови користувачів, що використовують дану систему, і дані про апаратних засобах. Метою даного курсового проекту є використання системного реєстру як засобу маніпулювання настройками ОС і користувацькими надбудовами, причому засобами самої системи (API-функціями). Слід зауважити, що операційна система Windows дозволяє організувати одночасну роботу безлічі потоків команд (найчастіше просто іменованих - потоками), які можуть бути або незалежними (або відносно незалежними, але розгляд даної проблеми не входить в рамки даного курсового проекту) і тоді вони називаються процесами, або, як прийнято їх називати, програмами (хоча це не зовсім коректно), або залежними, тоді вони є, певного роду, частинами потоків. У зв'язку з даним фактом хотілося б відзначити багатопоточну реалізації програмної частини даного проекту.

Як один способів вирішення поставленого завдання можна запропонувати Tweaker - подстройщік деяких, не критичних, параметрів системи. У завдання Tweaker-а (у загальному випадку) входить пропозицію користувачеві ряду налаштувань певної програмної одиниці (ПЗ або ОС) для подальших маніпуляцій з ними (просто ознайомлення або їх зміни). При цьому самі інформація про налаштування виходить або від об'єкта налаштування, або з фалів зберігають його налаштування. У разі маніпуляції з налаштуваннями ОС логічніше і правильніше буде отримувати налаштування від неї ж (за допомогою відповідних засобів, в даному випадку API-функцій). У випадку з ОС можна використовувати надані їй можливості з розділення підзадач у паралельно виконуються вже практично незалежні потоки, кожен з яких буде робити свою маленьку частину роботи. Для Tweaker-а можна виділити два варіанти подібного підходу до поділу підзадач: читання і запис налаштувань можна виконувати в різних потоках; читання і запис можна виконувати в одному потоці, але для різних круп налаштувань.

1. Аналіз предметної області

Системний реєстр Windows - це загальнодоступна база даних, яка зберігає індивідуальну для кожного комп'ютера настроювальну інформацію, використовувану програмним забезпеченням і самою системою. Дані в реєстрі впорядковані в деревоподібні структури, що складаються з вузлів, які в термінології Windows називаються ключами. Кожен ключ має один батьківський ключ, один або кілька дочірніх ключів і нуль або декілька параметрів типу імя_параметра = значення. Виняток становлять кореневі ключі (вони не мають батьків) і дочірні ключі нижчого рівня (вони не мають дочірніх ключів). За замовчуванням несистемне ПО реєструє свою інформацію в кореневому ключі з ім'ям HKEY _ _ CURRENT USER. Отримати доступ до реєстру можна написавши у командному рядку ("ПУСК>" Виконати ") слово" RegEdit "- при цьому запуститися програма для редагування реєстру. Вікно цієї програми поділено на дві частини. Ліворуч (більш вузької панелі) показана деревовидна структура ключів. Самі установки називаються параметрами, що знаходяться в правій панелі. Кожен параметр має своє ім'я, значення і тип. Параметри бувають строкового типу, двійкового і типу DWORD. Їх дуже багато, але їх призначення залежить від того, в якому ключі знаходиться тієї чи інший параметр. Ключі діляться між шістьма основними розділами:

  • HKEY_CLASSES_ROOT - Містить інформацію про OLE, операціях перетягування (drag-and-drop - з англ. Перетягнути-і-відпустити) і ярликах. У даному розділі можна так само вказати програми, що запускаються при активізації файлів певного типу. Даний розділ є псевдонімом для гілки HKEY_LOCAL_MACHINE \ Software \ Classes

  • HKEY_CURRENT_USER - Містить індивідуальні установки для кожного користувача, зареєстрованого в системі. Даний розділ є псевдонімом для гілки HKEY_USERS

  • HKEY_LOCAL_MACHINE - Містить апаратні і програмні установки, необхідні для функціонування обладнання та програм. Даний розділ так само зберігає конфігурацію Windows.

  • HKEY_USERS - Містить установки користувачів і відповідні конфігураційні дані, такі як колір вікна, розташування елементів на робочому столі, шпалери, заставки.

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

  • HKEY_DYN_DATA - На відміну від інших розділів, які зберігають статистичні дані (неизменяющиеся під час сеансу), даний розділ містить покажчики на динамічні дані (постійно змінюються під час роботи комп'ютера). Windows використовує цей розділ для відстеження профілів обладнання plug-and-play, статистики по продуктивності і драйверів віртуальних пристроїв VxD.

Всі дані системного реєстру полягають у двох файлах, що знаходяться в директорії Windows - це System.dat і User.dat.

Робота з реєстром за допомогою її ж коштів здійснюється за допомогою ряду API-функцій спеціально призначених для цього. Нижче наведений їх короткий список і опис.

1.1 Опис API-функцій роботи з реєстром

Створити підрозділ у реєстрі:

RegCreateKey (Key: HKey; SubKey: PChar; var Result: HKey): Longint;

  • Key - вказує на "кореневої" розділ реєстру, в Delphi1 доступний тільки один - HKEY_CLASSES_ROOT, а в Delphi3 - все.

  • SubKey - ім'я розділу - будується за принципом шляху до файлу в DOS (приклад subkey1 \ subkey2 \ ...). Якщо такий розділ вже існує, то він відкривається.

У будь-якому випадку при успішному виклику Result містить Handle на розділ.

Про успішність виклику судять по поверненню значенням, якщо ERROR_SUCCESS, то успішно, якщо інше - помилка.

Відкрити підрозділ:

RegOpenKey (Key: HKey; SubKey: PChar; var Result: HKey): Longint;

  • Розділ Key

  • Підрозділ SubKey

Повертає Handle на підрозділ у змінній Result. Якщо розділу з таким ім'ям немає, то він не створюється.

Повернення - код помилки або ERROR_SUCCESS, якщо успішно.

Закриває розділ:

RegCloseKey (Key: HKey): Longint;

Закриває розділ, на який посилається Key.

Повернення - код помилки або ERROR_SUCCESS, якщо успішно.

Видалити підрозділ:

RegDeleteKey (Key: HKey; SubKey: PChar): Longint;

Видалити підрозділ Key \ SubKey.

Повернення - код помилки або ERROR_SUCCESS, якщо немає помилок.

Отримати імена всіх підрозділів розділу Key:

RegEnumKey (Key: HKey; index: Longint; Buffer: PChar; cb: Longint): Longint;

  • Key - Handle на відкритий або створений розділ

  • Buffer - покажчик на буфер

  • cb - розмір буфера

  • index - індекс, повинен бути дорівнює 0 при першому виклику RegEnumKey. Типове використання - в ​​циклі While, де index збільшується до тих пір, поки черговий виклик RegEnumKey не завершиться помилкою.

    Повертає текстовий рядок, пов'язану з ключем Key \ SubKey:

    RegQueryValue (Key: HKey; SubKey: PChar; Value: PChar; var cb: Longint):

    Longint;

    • Ключ \ з'єднання Key \ SubKey.

    • Value - буфер для рядки

    • cb - розмір, на вході - розмір буфера, на виході - довжина повертається рядка.

    Повернення - код помилки.

    Поставити нове значення ключа Key \ SubKey:

    RegSetValue (Key: HKey; SubKey: PChar; ValType: Longint; Value: PChar;

    cb: Longint): Longint;

    • Ключ \ з'єднання Key \ SubKey.

    • ValType - тип задається змінною,

    • Value - буфер для змінної

    • cb - розмір буфера. У Windows 3.1 допустимо тільки Value = REG_SZ.

    Повернення - код помилки або ERROR_SUCCESS, якщо немає помилок.

    Видаляє значення lpValueName знаходиться в ключі hKey:

    RegDeleteValue (HKEY hKey, LPCTSTR lpValueName);

    • hKey - ключ. hKey мав бути відкритий з доступом KEY_SET_VALUE процедурою RegOpenKey.

    • lpValueName - значення, що знаходиться в ключі hKey.

    Повертає ERROR_SUCCESS якщо успішно.

    Видає список значень у ключа hKey:

    LONG RegEnumValue (HKEY hKey, DWORD dwIndex, LPTSTR lpValueName,

    LPDWORD lpcbValueName, LPDWORD lpReserved, LPDWORD lpType,

    LPBYTE lpData, LPDWORD lpcbData);

    • hKey - ключ.

    • dwIndex - цей параметр повинен бути 0 при першому виклику, а далі по анологіі з RegEnumKey (тобто можна використовувати в циклі),

    • lpValueName - буфер для назви значення

    • lpcbValueName - розмір lpValueName

    • lpReserved повинно бути завжди 0

    • lpType - буфер для назви типу (int)

    • lpData - буфер для даних

    • lpcbData-розмір для lpData

    Примітка:

    При кожній новому виклику функції після попереднього потрібно заново перепризначити lpcbValueName. {LpcbValueName = sizeof (lpValueName)}

    1.2 Опис API-функцій роботи з потоками

    Створити потоку:

    function CreateThread (

    lpThreadAttributes: Pointer; / / Покажчик на атрибути захисту потоку

    dwStackSize: LongWord; / / Розмір стека, в байтах

    lpStartAddress: TThreadFunc; / / Покажчик на функцію потоку

    lpParameter: Pointer; / / Атрибут для нового потоку

    dwCreationFlags: LongWord; / / Прапори створення

    var lpThreadId: LongWord / / Покажчик на що повертається

    / / Ідентифікатор потоку

    ): Integer;

    Створення окремого потоку виконання:

    function BeginThread (

    SecurityAttributes: Pointer; / / Покажчик на атрибути захисту потоку

    StackSize: LongWord; / / Розмір стека, в байтах

    ThreadFunc: TThreadFunc; / / Покажчик на функцію потоку

    Parameter: Pointer; / / Артібути потоку

    CreationFlags: LongWord; / / Прапори створення

    var ThreadId: Cardinal / / Покажчик ідентифікатор потоку

    ): Integer;

    Завершення виконання потоку:

    procedure EndThread (ExitCode: Integer);

    завершує потік із зазначеним ExitCode

    Негайне припинення виконання потоку:

    TerminateThread (

    hThered: Cardinal; / / Покажчик на завершується потік

    dwExitCode: Cardinal / / прапори виходу

    );

    Атрибути захисту потоку:

    • CREATE_SUSPENDED - Потік створюється у загальмованому стані і не виконується, поки Windows API функція ResumeThread не буде викликано. Якщо цей прапор не включено, новий потік починає виконуватися відразу при створенні.

    • STACK_SIZE_PARAM_IS_A_RESERVATION - Параметр StackSize визначає розмір стека для потоку. Якщо цей прапор не включено, новий потік призначений заданий компонувальником за умовчанням розмір стека.

    2. Опис програмної реалізації

    2.1 Опис структури програми

    2.1.1 Діаграма взаємодії модулів

    Програма реалізована на 2х модулях, один з яких базуючись на API-функції Windows здійснює взаємодію з системним реєстром, а другий надає інформацію користувачеві про поточні значення зумовлених параметрів, і заносить зроблені користувачем зміни параметрів до реєстру. Ось як це виглядає:

    Виклик функція

    2.1.2 Опис структури модулів

    Модуль MiniReg не несе функціонального навантаження, всі функції описані в ньому є лише надбудовами над WinAPI для спрощення їх використання. Опис функцій модуля можна знайти в розділі "Функції модуля MiniReg". Тому слід зазначити лінійність структури модуля і його функцій, тому опис взаємодії функцій в модулі немає (всі взаємодії здійснюються через параметри), тому структуру модуля я не наводжу.

    Модуль Unit 1 є модулем головною (і єдиною) форми програми. Тим не менше всі елементи пов'язані з формі не несуть функціонального навантаження, що відноситься до рішення поставленої задачі і лише виконують допоміжні функції (наприклад: вибір зображення для установки його в якості фонового, або збереження поточного фонового зображення в довільному графічному файлі). Всі функції покладені на три потоки, що відповідають трьом основним вкладках. У функції потоків входить читання параметрів реєстру коли вкладка на не неактивних підлеглих вкладках і запис параметрів активної вкладки. При цьому використовується та особливість API-функцій Windows, що параметри лічені кілька разів з реєстру не видаляються з пам'яті, а деякий час залишаються в ній, що дозволяє не турбуватися про швидкодію потоків постійно стежать за змінами параметрів реєстру. Крім цього, той факт що потоки постійно записують значення параметрів активної вкладки до реєстру, теж не повинен нікого бентежити, оскільки параметри збігаються зі значеннями в реєстрі не записуються в нього повторно, завдяки тому що вони порівнюються з тими що зберігаються в пам'яті і тільки в тому випадку якщо не рівні їм записуються до реєстру фізично. Пам'ять ж оновлюється у разі зміни відповідних параметрів реєстру автоматично.

    Нижче наведена діаграма використання потоками модуля Unit 1 функцій модуля MiniReg.

    2.2 Функції модуля MiniReg

    1. Функція RegSetString:

      1. Тема: function RegSetString (RootKey: HKEY; Name: String;

    Value: String): boolean;

      1. Призначення: Установка ключа Name гілки кореня RootKey текстового значення Value і повернення true, у разі успіху.

      2. Вхідні параметри: RootKey, Name, Value

      3. Вихідні параметри: -

    1. Функція RegSetMultiString:

      1. Тема: function RegSetMultiString (RootKey: HKEY; Name: String;

    Value: String): boolean;

      1. Призначення: Установка ключа Name гілки кореня RootKey текстового значення Value з кількох рядків, і повернення true, у разі успіху.

      2. Вхідні параметри: RootKey, Name, Value

      3. Вихідні параметри: -

    1. Функція RegSetDWORD:

      1. Тема: function RegSetDWORD (RootKey: HKEY; Name: String;

    Value: Cardinal): boolean;

      1. Призначення: Установка ключа Name гілки кореня RootKey цілочисельного значення Value, і повернення true, у разі успіху.

      2. Вхідні параметри: RootKey, Name, Value

      3. Вихідні параметри: -

    1. Функція RegSetBinary:

      1. Тема: function RegSetDWORD (RootKey: HKEY; Name: String;

    Value: Cardinal): boolean;

      1. Призначення: Установка ключа Name гілки кореня RootKey цілочисельного значення Value, і повернення true, у разі успіху.

      2. Вхідні параметри: RootKey, Name, Value

      3. Вихідні параметри: -

    1. Функція RegSetBinary:

      1. Тема: function RegSetBinary (RootKey: HKEY; Name: String;

    Value: Array of Byte): boolean;

      1. Призначення: Установка ключа Name гілки кореня RootKey бінарного значення Value, і повернення true, у разі успіху.

      2. Вхідні параметри: RootKey, Name, Value

      3. Вихідні параметри: -

    1. Функція RegGetString:

      1. Тема: function RegGetString (RootKey: HKEY; Name: String;

    var Value: Cardinal): boolean;

      1. Призначення: Отримання ключа Name гілки кореня RootKey текстового значення Value, і повернення true, у разі успішного отримання даних.

      2. Вхідні параметри: RootKey, Name

      3. Вихідні параметри: Value

    1. Функція RegGetMultiString:

      1. Тема: function RegGetMultiString (RootKey: HKEY; Name: String;

    var Value: Cardinal): boolean;

      1. Призначення: Отримання ключа Name гілки кореня RootKey багато строкового значення Value, і повернення true, у разі успішного отримання даних.

      2. Вхідні параметри: RootKey, Name

      3. Вихідні параметри: Value

    1. Функція RegGetDWORD:

      1. Тема: function RegGetDWORD (RootKey: HKEY; Name: String;

    var Value: Cardinal): boolean;

      1. Призначення: Отримання ключа Name гілки кореня RootKey цілочисельного значення Value, і повернення true, у разі успішного отримання даних.

      2. Вхідні параметри: RootKey, Name

      3. Вихідні параметри: Value

    1. Функція RegGetBinary:

      1. Тема: function RegGetBinary (RootKey: HKEY; Name: String;

    var Value: String): boolean;

      1. Призначення: Отримання ключа Name гілки кореня RootKey бінарного значення Value в строковою форма, і повернення true, у разі успішного отримання даних.

      2. Вхідні параметри: RootKey, Name

      3. Вихідні параметри: Value

    1. Функція RegGetValueType:

      1. Тема: function RegGetValueType (RootKey: HKEY; Name: String; var Value: Cardinal): boolean;

      2. Призначення: Отримання типу ключа Name гілки кореня RootKey в Value, і повернення true, у разі його існування.

      3. Вхідні параметри: RootKey, Name

      4. Вихідні параметри: Value

    2. Функція:

      1. Тема: function RegSetDWORD (RootKey: HKEY; Name: String;

    Value: Cardinal): boolean;

      1. Призначення: Установка ключа Name гілки кореня RootKey цілочисельного значення Value, і повернення true, у разі успіху.

      2. Вхідні параметри: RootKey, Name, Value

      3. Вихідні параметри: -

    1. Функція RegKeyExists:

      1. Тема: function RegKeyExists (RootKey: HKEY; Name: String):

    boolean;

      1. Призначення: Перевірка існуванню ключа Name гілки кореня RootKey і повернення рузультати.

      2. Вхідні параметри: RootKey, Name

      3. Вихідні параметри: -

    1. Функція RegDelValue:

      1. Тема: function RegDelValue (RootKey: HKEY; Name: String):

    boolean;

      1. Призначення: Видалення ключа Name гілки кореня RootKey і повернення результату виконання операції.

      2. Вхідні параметри: RootKey, Name

      3. Вихідні параметри: -

    1. Функція RegAddKey:

      1. Тема: function RegAddKey (RootKey: HKEY; Name: String):

    boolean;

      1. Призначення: Створення нового ключа Name гілки кореня RootKey і повернення результату виконання операції.

      2. Вхідні параметри: RootKey, Name

      3. Вихідні параметри: -

    1. Функція RegDelKey:

      1. Тема: function RegDelKey (RootKey: HKEY; Name: String):

    boolean;

      1. Призначення: Видалення Улючі Name гілки кореня RootKey і повернення результату виконання операції.

      2. Вхідні параметри: RootKey, Name

      3. Вихідні параметри: -

    1. Функція RegConnect:

      1. Тема: function RegConnect (MachineName: String;

    RootKey: HKEY; var RemoteKey: HKEY): boolean;

      1. Призначення: Підключення до реєстру машини з ім'ям MachineName, і читання з неї кореня RootKey в RemoteKey, з поверненнях прапора успішного виконання операції.

      2. Вхідні параметри: MachineName, RootKey

      3. Вихідні параметри: RemoteKey

          1. Функція RegDisconnect:

            1. Тема: function RegDisconnect (RemoteKey: HKEY): boolean;

            2. Призначення: Відключення від віддаленого кореневого ключа (звільнення віддаленого ключа RemoteKey), і повернення прапора успішного виконання операції.

            3. Вхідні параметри: RemoteKey

            4. Вихідні параметри: -

          2. Функція RegEnumKeys:

            1. Тема: function RegEnumKeys (RootKey: HKEY; Name: String;

          var KeyList: String): boolean;

            1. Призначення: Отримання списку ключів гілки Name кореня RootKey в KeyList, і повернення true при відсутності помилок виконання операції.

            2. Вхідні параметри: RootKey, Name

            3. Вихідні параметри: KeyList

          1. Функція RegEnumValues:

            1. Тема: function RegEnumValues ​​(RootKey: HKEY; Name: String;

          var ValueList: String): boolean;

            1. Призначення: Отримання списку значень ключів гілки Name кореня RootKey в ValueList, і повернення true при відсутності помилок виконання операції.

            2. Вхідні параметри: RootKey, Name

            3. Вихідні параметри: ValueList

          2.3 Функції основного модуля (Unit 1)

                        1. Процедура Execute1:

            1. Тема: procedure Execute 1;

            2. Призначення: Функція отримує \ записує параметри з реєстру і заносить \ зчитує значень відповідних прапорів вкладки "Система".

            3. Вхідні параметри: -

            4. Вихідні параметри: -

          1. Процедура Execute2:

            1. Тема: procedure Execute 2;

            2. Призначення: Функція отримує \ записує параметри з реєстру і заносить \ зчитує значень відповідних прапорів вкладки 'Захист'.

            3. Вхідні параметри: -

            4. Вихідні параметри: -

          2. Процедура Execute3:

            1. Тема: procedure Execute 3;

            2. Призначення: Функція отримує \ записує параметри з реєстру і заносить \ зчитує значень відповідних прапорів вкладки 'Робочий стіл'.

            3. Вхідні параметри: -

            4. Вихідні параметри: -

          3. Програмна реалізація

          3.1 Модуль роботи з реєстром (MiniReg)

          unit MiniReg;

          interface

          uses Windows;

          function RegSetString (RootKey: HKEY; Name: String;

          Value: String): boolean;

          function RegSetMultiString (RootKey: HKEY; Name: String;

          Value: String): boolean;

          function RegSetExpandString (RootKey: HKEY; Name: String;

          Value: String): boolean;

          function RegSetDWORD (RootKey: HKEY; Name: String;

          Value: Cardinal): boolean;

          function RegSetBinary (RootKey: HKEY; Name: String;

          Value: Array of Byte): boolean;

          function RegGetString (RootKey: HKEY; Name: String;

          Var Value: String): boolean;

          function RegGetMultiString (RootKey: HKEY; Name: String;

          Var Value: String): boolean;

          unction RegGetExpandString (RootKey: HKEY; Name: String;

          Var Value: String): boolean;

          function RegGetDWORD (RootKey: HKEY; Name: String;

          Var Value: Cardinal): boolean;

          function RegGetBinary (RootKey: HKEY; Name: String;

          Var Value: String): boolean;

          function RegGetValueType (RootKey: HKEY; Name: String;

          var Value: Cardinal): boolean;

          function RegValueExists (RootKey: HKEY; Name: String):

          boolean;

          function RegKeyExists (RootKey: HKEY; Name: String):

          boolean;

          function RegDelValue (RootKey: HKEY; Name: String): boolean;

          function RegAddKey (RootKey: HKEY; Name: String): boolean;

          function RegDelKey (RootKey: HKEY; Name: String): boolean;

          function RegConnect (MachineName: String; RootKey: HKEY;

          var RemoteKey: HKEY): boolean;

          function RegDisconnect (RemoteKey: HKEY): boolean;

          function RegEnumKeys (RootKey: HKEY; Name: String;

          var KeyList: String): boolean;

          function RegEnumValues ​​(RootKey: HKEY; Name: String;

          var ValueList: String): boolean;

          implementation

          function LastPos (Needle: Char; Haystack: String): integer;

          begin

          for Result: = Length (Haystack) downto 1 do

          if Haystack [Result] = Needle then

          Break;

          end;

          function RegConnect (MachineName: String; RootKey: HKEY; var RemoteKey: HKEY): boolean;

          begin

          Result: = (RegConnectRegistry (PChar (MachineName), RootKey, RemoteKey)

          = ERROR_SUCCESS);

          end;

          function RegDisconnect (RemoteKey: HKEY): boolean;

          begin

          Result: = (RegCloseKey (RemoteKey) = ERROR_SUCCESS);

          end;

          function RegSetValue (RootKey: HKEY; Name: String; ValType: Cardinal;

          PVal: Pointer; ValSize: Cardinal): boolean;

          Var SubKey: String; n: integer; dispo: DWORD; hTemp: HKEY;

          begin

          Result: = False;

          n: = LastPos ('\', Name);

          if n> 0 then begin

          SubKey: = Copy (Name, 1, n - 1);

          if RegCreateKeyEx (RootKey, PChar (SubKey), 0, nil, REG_OPTION_NON_VOLATILE, KEY_WRITE,

          nil, hTemp, @ dispo) = ERROR_SUCCESS then begin

          SubKey: = Copy (Name, n + 1, Length (Name) - n);

          Result: = (RegSetValueEx (hTemp, PChar (SubKey), 0, ValType, PVal, ValSize) = ERROR_SUCCESS);

          RegCloseKey (hTemp);

          end;

          end;

          end;

          function RegGetValue (RootKey: HKEY; Name: String; ValType: Cardinal;

          var PVal: Pointer; var ValSize: Cardinal): boolean;

          var

          SubKey: String; n: integer; MyValType: DWORD;

          hTemp: HKEY; Buf: Pointer; BufSize: Cardinal;

          begin

          Result: = False;

          n: = LastPos ('\', Name);

          if n> 0 then begin

          SubKey: = Copy (Name, 1, n - 1);

          if RegOpenKeyEx (RootKey, PChar (SubKey), 0, KEY_READ, hTemp) = ERROR_SUCCESS then begin

          SubKey: = Copy (Name, n + 1, Length (Name) - n);

          if RegQueryValueEx (hTemp, PChar (SubKey), nil, @ MyValType, nil, @ BufSize) = ERROR_SUCCESS then begin

          GetMem (Buf, BufSize);

          if RegQueryValueEx (hTemp, PChar (SubKey), nil, @ MyValType, Buf, @ BufSize) = ERROR_SUCCESS then begin

          if ValType = MyValType then begin

          PVal: = Buf;

          ValSize: = BufSize;

          Result: = True;

          end

          else begin

          FreeMem (Buf);

          end;

          end

          else begin

          FreeMem (Buf);

          end;

          end;

          RegCloseKey (hTemp);

          end;

          end;

          end;

          function RegSetString (RootKey: HKEY; Name: String; Value: String): boolean;

          begin

          Result: = RegSetValue (RootKey, Name, REG_SZ, PChar (Value + # 0), Length (Value) + 1);

          end;

          function RegSetMultiString (RootKey: HKEY; Name: String; Value: String): boolean;

          begin

          Result: = RegSetValue (RootKey, Name, REG_MULTI_SZ, PChar (Value + # 0 # 0), Length (Value) + 2);

          end;

          function RegSetExpandString (RootKey: HKEY; Name: String; Value: String): boolean;

          begin

          Result: = RegSetValue (RootKey, Name, REG_EXPAND_SZ, PChar (Value + # 0), Length (Value) + 1);

          end;

          function RegSetDword (RootKey: HKEY; Name: String; Value: Cardinal): boolean;

          begin

          Result: = RegSetValue (RootKey, Name, REG_DWORD, @ Value, SizeOf (Cardinal));

          end;

          function RegSetBinary (RootKey: HKEY; Name: String; Value: Array of Byte): boolean;

          begin

          Result: = RegSetValue (RootKey, Name, REG_BINARY, @ Value [Low (Value)], length (Value));

          end;

          function RegGetString (RootKey: HKEY; Name: String; Var Value: String): boolean;

          var

          Buf: Pointer; BufSize: Cardinal;

          begin

          Result: = False;

          if RegGetValue (RootKey, Name, REG_SZ, Buf, BufSize) then begin

          Dec (BufSize);

          SetLength (Value, BufSize);

          f BufSize> 0 then

          CopyMemory (@ Value [1], Buf, BufSize);

          FreeMem (Buf);

          Result: = True;

          end;

          end;

          function RegGetMultiString (RootKey: HKEY; Name: String; Var Value: String): boolean;

          var

          Buf: Pointer; BufSize: Cardinal;

          begin

          Result: = False;

          if RegGetValue (RootKey, Name, REG_MULTI_SZ, Buf, BufSize) then begin

          Dec (BufSize);

          SetLength (Value, BufSize);

          if BufSize> 0 then

          CopyMemory (@ Value [1], Buf, BufSize);

          FreeMem (Buf);

          Result: = True;

          end;

          end;

          function RegGetExpandString (RootKey: HKEY; Name: String; Var Value: String): boolean;

          var

          Buf: Pointer; BufSize: Cardinal;

          begin

          Result: = False;

          if RegGetValue (RootKey, Name, REG_EXPAND_SZ, Buf, BufSize) then begin

          Dec (BufSize);

          SetLength (Value, BufSize);

          if BufSize> 0 then

          CopyMemory (@ Value [1], Buf, BufSize);

          FreeMem (Buf);

          Result: = True;

          end;

          end;

          function RegGetDWORD (RootKey: HKEY; Name: String; Var Value: Cardinal): boolean;

          var

          Buf: Pointer; BufSize: Cardinal;

          begin

          Result: = False;

          if RegGetValue (RootKey, Name, REG_DWORD, Buf, BufSize) then begin

          CopyMemory (@ Value, Buf, BufSize);

          FreeMem (Buf);

          Result: = True;

          end;

          end;

          function RegGetBinary (RootKey: HKEY; Name: String; Var Value: String): boolean;

          var

          Buf: Pointer; BufSize: Cardinal;

          begin

          Result: = False;

          if RegGetValue (RootKey, Name, REG_BINARY, Buf, BufSize) then begin

          SetLength (Value, BufSize);

          CopyMemory (@ Value [1], Buf, BufSize);

          FreeMem (Buf);

          Result: = True;

          end;

          end;

          function RegValueExists (RootKey: HKEY; Name: String): boolean;

          var

          SubKey: String; n: integer; hTemp: HKEY;

          begin

          Result: = False;

          n: = LastPos ('\', Name);

          if n> 0 then begin

          SubKey: = Copy (Name, 1, n - 1);

          if RegOpenKeyEx (RootKey, PChar (SubKey), 0, KEY_READ, hTemp) = ERROR_SUCCESS then begin

          SubKey: = Copy (Name, n + 1, Length (Name) - n);

          Result: = (RegQueryValueEx (hTemp, PChar (SubKey), nil, nil, nil, nil) = ERROR_SUCCESS);

          RegCloseKey (hTemp);

          end;

          end;

          end;

          function RegGetValueType (RootKey: HKEY; Name: String; var Value: Cardinal): boolean;

          var

          SubKey: String; n: integer; hTemp: HKEY; ValType: Cardinal;

          begin

          Result: = False;

          Value: = REG_NONE;

          n: = LastPos ('\', Name);

          if n> 0 then begin

          SubKey: = Copy (Name, 1, n - 1);

          if (RegOpenKeyEx (RootKey, PChar (SubKey), 0, KEY_READ, hTemp) = ERROR_SUCCESS) then begin

          SubKey: = Copy (Name, n + 1, Length (Name) - n);

          Result: = (RegQueryValueEx (hTemp, PChar (SubKey), nil, @ ValType, nil, nil) = ERROR_SUCCESS);

          if Result then

          Value: = ValType;

          RegCloseKey (hTemp);

          end;

          end;

          end;

          function RegKeyExists (RootKey: HKEY; Name: String): boolean;

          var

          SubKey: String; n: integer; hTemp: HKEY;

          begin

          Result: = False;

          n: = LastPos ('\', Name);

          if n> 0 then begin

          SubKey: = Copy (Name, 1, n - 1);

          if RegOpenKeyEx (RootKey, PChar (SubKey), 0, KEY_READ, hTemp) = ERROR_SUCCESS then begin

          Result: = True;

          RegCloseKey (hTemp);

          end;

          end;

          end;

          function RegAddKey (RootKey: HKEY; Name: String): boolean;

          var

          hTemp: HKEY;

          begin

          Result: = (RegCreateKey (RootKey, PChar (Name), hTemp) = ERROR_SUCCESS);

          end;

          function RegDelValue (RootKey: HKEY; Name: String): boolean;

          var

          SubKey: String; n: integer; hTemp: HKEY;

          begin

          Result: = False;

          n: = LastPos ('\', Name);

          if n> 0 then begin

          SubKey: = Copy (Name, 1, n - 1);

          if RegOpenKeyEx (RootKey, PChar (SubKey), 0, KEY_WRITE, hTemp) = ERROR_SUCCESS then begin

          SubKey: = Copy (Name, n + 1, Length (Name) - n);

          Result: = (RegDeleteValue (hTemp, PChar (SubKey)) = ERROR_SUCCESS);

          RegCloseKey (hTemp);

          end;

          end;

          end;

          function RegDelKey (RootKey: HKEY; Name: String): boolean;

          var

          SubKey: String; n: integer; hTemp: HKEY;

          begin

          Result: = False;

          n: = LastPos ('\', Name);

          if n> 0 then begin

          SubKey: = Copy (Name, 1, n - 1);

          if RegOpenKeyEx (RootKey, PChar (SubKey), 0, KEY_WRITE, hTemp) = ERROR_SUCCESS then begin

          SubKey: = Copy (Name, n + 1, Length (Name) - n);

          Result: = (RegDeleteKey (hTemp, PChar (SubKey)) = ERROR_SUCCESS);

          RegCloseKey (hTemp);

          end;

          end;

          end;

          function RegEnum (RootKey: HKEY; Name: String; var ResultList: String; const DoKeys: Boolean): boolean;

          var

          i: integer; iRes: integer; s: String; hTemp: HKEY; Buf: Pointer; BufSize: Cardinal;

          begin

          Result: = False;

          ResultList: ='';

          if RegOpenKeyEx (RootKey, PChar (Name), 0, KEY_READ, hTemp) = ERROR_SUCCESS then begin

          Result: = True;

          BufSize: = 1024;

          GetMem (buf, BufSize);

          i: = 0;

          iRes: = ERROR_SUCCESS;

          while iRes = ERROR_SUCCESS do begin

          BufSize: = 1024;

          if DoKeys then

          iRes: = RegEnumKeyEx (hTemp, i, buf, BufSize, nil, nil, nil, nil)

          else

          iRes: = RegEnumValue (hTemp, i, buf, BufSize, nil, nil, nil, nil);

          if iRes = ERROR_SUCCESS then begin

          SetLength (s, BufSize);

          CopyMemory (@ s [1], buf, BufSize);

          if ResultList =''then

          ResultList: = s

          Else ResultList: = Concat (ResultList, # 13 # 10, s);

          inc (i);

          end; end;

          FreeMem (buf);

          RegCloseKey (hTemp);

          end; end;

          function RegEnumValues ​​(RootKey: HKEY; Name: String; var ValueList: String): boolean;

          begin

          Result: = RegEnum (RootKey, Name, ValueList, False);

          end;

          function RegEnumKeys (RootKey: HKEY; Name: String; var KeyList: String): boolean;

          begin Result: = RegEnum (RootKey, Name, KeyList, True);

          end;

          en

          3.2 Основний модуль програми (Unit 1)



          unit Unit1;

          interface

          uses

          Windows, Messages, SysUtils, Variants, Classes, Graphics,

          Controls, Forms, Dialogs, ComCtrls, StdCtrls, ExtCtrls,

          Buttons, ExtDlgs;

          const

          ClearPageFileAtShutdown: String =

          'SYSTEM \ CurrentControlSet \ Control \ Session'

          + 'Manager \ Memory Management \ ClearPageFileAtShutdown';

          DebugDrWatsonAuto: String =

          'SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \'

          + 'AeDebug \ Auto';

          AlwaysUnloadDLL: String =

          'SOFTWARE \ Microsoft \ Windows \ CurrentVersion \'

          + 'Explorer \ AlwaysUnloadDLL';

          NoInstrumentation: String =

          'Software \ Microsoft \ Windows \ CurrentVersion \'

          + 'Policies \ Explorer \ NoInstrumentation';

          DefaultSeparateVDM: String =

          'SYSTEM \ CurrentControlSet \ Control \ WOW \'

          + 'DefaultSeparateVDM';

          DoReport: String =

          'SOFTWARE \ Microsoft \ PCHealth \ ErrorReporting \ DoReport';

          ShowUI: String =

          'SOFTWARE \ Microsoft \ PCHealth \ ErrorReporting \ ShowUI';

          PromptPasswordOnResume: String =

          'Software \ Policies \ Microsoft \ Windows \'

          + 'System \ Power \ PromptPasswordOnResume';

          BootOptimizeFunction: String =

          'SOFTWARE \ Microsoft \ Dfrg \ BootOptimizeFunction \'

          + 'Enable';

          ConsoleQuickEdit: String = 'Console \ QuickEdit';

          ShutdownReasonUI: String =

          'Software \ Policies \ Microsoft \ Windows NT \'

          + 'Reliability \ ShutdownReasonUI';

          NoLowDiskSpaceChecks: String =

          'Software \ Microsoft \ Windows \ CurrentVersion \'

          + 'Policies \ Explorer \ NoLowDiskSpaceChecks';

          MinAnimate: String =

          'Control Panel \ Desktop \ WindowMetrics \ MinAnimate';

          SeparateProcess: String =

          'Software \ Microsoft \ Windows \ CurrentVersion \'

          + 'Explorer \ Advanced \ SeparateProcess';

          AutoRestartShell: String =

          'SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \'

          + 'Winlogon \ AutoRestartShell';

          IsShortcut: String = 'SOFTWARE \ Classes \ lnkfile \ IsShortcut';

          LinkImg: String =

          'Software \ Microsoft \ Windows \ CurrentVersion \ Explorer \ link';

          NoSaveSettings: String =

          'Software \ Microsoft \ Windows \ CurrentVersion \'

          + 'Policies \ Explorer \ NoSaveSettings';

          DragFullWindows: String =

          'Control Panel \ Desktop \ DragFullWindows';

          EnableBalloonTips: String = 'Software \ Microsoft \ Windows \ CurrentVersion \'

          + 'Explorer \ Advanced \ EnableBalloonTips';

          TaskbarGlomming: String =

          'Software \ Microsoft \ Windows \ CurrentVersion \'

          + 'Explorer \ Advanced \ TaskbarGlomming';

          TaskbarGroupSize: String =

          'Software \ Microsoft \ Windows \ CurrentVersion \'

          + 'Explorer \ Advanced \ TaskbarGroupSize';

          NoRecentDocsHistory: String =

          'Software \ Microsoft \ Windows \ CurrentVersion \'

          + 'Policies \ Explorer \ NoRecentDocsHistory';

          Start_AutoCascade: String =

          'Software \ Microsoft \ Windows \ CurrentVersion \'

          + 'Explorer \ Advanced \ Start_AutoCascade';

          NoCommonGroups: String =

          'Software \ Microsoft \ Windows \ CurrentVersion \'

          + 'Policies \ Explorer \ NoCommonGroups';

          StartMenuScrollPrograms: String =

          'Software \ Microsoft \ Windows \'

          + 'CurrentVersion \ Explorer \ Advanced \ StartMenuScrollPrograms';

          IntelliMenus: String = 'Software \ Microsoft \ Windows \'

          + 'CurrentVersion \ Explorer \ Advanced \ IntelliMenus';

          Start_LargeIcons: String = 'Software \ Microsoft \ Windows \'

          + 'CurrentVersion \ Explorer \ Advanced \ Start_LargeIcons';

          StartMenuChange: String = 'Software \ Microsoft \ Windows \'

          + 'CurrentVersion \ Explorer \ Advanced \ StartMenuChange';

          CodePage: String =

          'SYSTEM \ CurrentControlSet \ Control \ Nls \ CodePage \';

          DosKeybCodes: String =

          'SYSTEM \ CurrentControlSet \ Control \ Keyboard Layout \'

          + 'DosKeybCodes \ 00000409';

          AutoEndTasks: String = 'Control Panel \ Desktop \ AutoEndTasks';

          AutoRunCD: String =

          'SYSTEM \ CurrentControlSet \ Services \ Cdrom \ AutoRun';

          DontDisplayLastUserName: String =

          'SOFTWARE \ Microsoft \ Windows \ CurrentVersion \'

          + 'Policies \ System \ dontdisplaylastusername';

          DisableStatusMessages: String =

          'SOFTWARE \ Microsoft \ Windows \ CurrentVersion \'

          + 'Policies \ System \ DisableStatusMessages';

          VerboseStatus: String =

          'SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Policies \'

          + 'System \ verbosestatus';

          Hotkey: String = '. DEFAULT \ Keyboard Layout \ Toggle \ Hotkey';

          InitialKeyboardIndicators: String = '. DEFAULT \ Control Panel \ Keyboard \'

          + 'InitialKeyboardIndicators';

          DisableTaskMgr: String =

          'Software \ Microsoft \ Windows \ CurrentVersion \'

          + 'Policies \ System \ DisableTaskMgr';

          DisableRegistryTools: String =

          'Software \ Microsoft \ Windows \ CurrentVersion \'

          + 'Policies \ System \ DisableRegistryTools';

          NoLogOff: String =

          'Software \ Microsoft \ Windows \ CurrentVersion \ Policies \'

          + 'Explorer \ NoLogOff';

          NoClose: String =

          'Software \ Microsoft \ Windows \ CurrentVersion \ Policies \'

          + 'Explorer \ NoClose';

          NoControlPanel: String =

          'Software \ Microsoft \ Windows \ CurrentVersion \ Policies \'

          + 'Explorer \ NoControlPanel';

          NoDispCPL: String =

          'Software \ Microsoft \ Windows \ CurrentVersion \ Policies \'

          + 'System \ NoDispCPL';

          DisableCMD: String =

          'Software \ Policies \ Microsoft \ Windows \ System \ DisableCMD';

          LanmanServer: String =

          'SYSTEM \ CurrentControlSet \ Services \ LanmanServer \ Parameters \';

          RestrictAnonymous: String =

          'SYSTEM \ CurrentControlSet \ Control \ Lsa \ RestrictAnonymous';

          NoViewContextMenu: String =

          'Software \ Microsoft \ Windows \ CurrentVersion \'

          + 'Policies \ Explorer \ NoViewContextMenu';

          NoFileMenu: String =

          'Software \ Microsoft \ Windows \ CurrentVersion \'

          + 'Policies \ Explorer \ NoFileMenu';

          NoShellSearchButton: String =

          'Software \ Microsoft \ Windows \ CurrentVersion \'

          + 'Policies \ Explorer \ NoShellSearchButton';

          NoSetTaskbar: String =

          'Software \ Microsoft \ Windows \ CurrentVersion \'

          + 'Policies \ Explorer \ NoSetTaskbar';

          NoChangeStartMenu: String =

          'Software \ Microsoft \ Windows \ CurrentVersion \'

          + 'Policies \ Explorer \ NoChangeStartMenu';

          NoFind: String = 'Software \ Microsoft \ Windows \ CurrentVersion \'

          + 'Policies \ Explorer \ NoFind';

          NoRun: String = 'Software \ Microsoft \ Windows \ CurrentVersion \'

          + 'Policies \ Explorer \ NoRun';

          NoSMHelp: String =

          'Software \ Microsoft \ Windows \ CurrentVersion \'

          + 'Policies \ Explorer \ NoSMHelp';

          NoRecentDocsMenu: String =

          'Software \ Microsoft \ Windows \ CurrentVersion \'

          + 'Policies \ Explorer \ NoRecentDocsMenu';

          NoTrayContextMenu: String =

          'Software \ Microsoft \ Windows \ CurrentVersion \'

          + 'Policies \ Explorer \ NoTrayContextMenu';

          PaintDesktopVersion: String = 'Control Panel \ Desktop \ PaintDesktopVersion';

          NoDesktop: String =

          'Software \ Microsoft \ Windows \ CurrentVersion \ Policies \'

          + 'Explorer \ NoDesktop';

          NoActiveDesktop: String =

          'Software \ Microsoft \ Windows \ CurrentVersion \ Policies \'

          + 'Explorer \ NoActiveDesktop';

          NoDispBackgroundPage: String =

          'Software \ Microsoft \ Windows \ CurrentVersion \'

          + 'Policies \ System \ NoDispBackgroundPage';

          NoDispScrSavPage: String =

          'Software \ Microsoft \ Windows \ CurrentVersion \'

          + 'Policies \ System \ NoDispScrSavPage';

          NoDispSettingsPage: String =

          'Software \ Microsoft \ Windows \ CurrentVersion \'

          + 'Policies \ System \ NoDispSettingsPage';

          NoDispAppearancePage: String =

          'Software \ Microsoft \ Windows \ CurrentVersion \'

          + 'Policies \ System \ NoDispAppearancePage';

          Wallpaper: String = 'Control Panel \ Desktop \ Wallpaper';

          TileWallpaper: String = 'Control Panel \ Desktop \ TileWallpaper';

          procedure IncEdit1; stdcall;

          procedure IncEdit2; stdcall;

          procedure IncEdit3; stdcall;

          type

          TForm1 = class (TForm)

          PageControl1: TPageControl;

          TabSheet1: TTabSheet;

          PageControl2: TPageControl;

          TabSheet6: TTabSheet;

          CheckBox1: TCheckBox;

          CheckBox2: TCheckBox;

          CheckBox3: TCheckBox;

          CheckBox4: TCheckBox;

          CheckBox5: TCheckBox;

          CheckBox6: TCheckBox;

          CheckBox8: TCheckBox;

          CheckBox9: TCheckBox;

          TabSheet7: TTabSheet;

          CheckBox12: TCheckBox;

          CheckBox13: TCheckBox;

          CheckBox14: TCheckBox;

          CheckBox15: TCheckBox;

          CheckBox17: TCheckBox;

          CheckBox18: TCheckBox;

          CheckBox19: TCheckBox;

          TabSheet9: TTabSheet;

          CheckBox20: TCheckBox;

          CheckBox23: TCheckBox;

          CheckBox24: TCheckBox;

          CheckBox25: TCheckBox;

          CheckBox26: TCheckBox;

          CheckBox28: TCheckBox;

          TabSheet10: TTabSheet;

          CheckBox29: TCheckBox;

          CheckBox30: TCheckBox;

          CheckBox31: TCheckBox;

          TabSheet11: TTabSheet;

          CheckBox32: TCheckBox;

          CheckBox33: TCheckBox;

          CheckBox34: TCheckBox;

          CheckBox35: TCheckBox;

          CheckBox36: TCheckBox;

          TabSheet3: TTabSheet;

          PageControl4: TPageControl;

          TabSheet14: TTabSheet;

          TabSheet16: TTabSheet;

          TabSheet17: TTabSheet;

          TabSheet4: TTabSheet;

          CheckBox37: TCheckBox;

          CheckBox38: TCheckBox;

          CheckBox39: TCheckBox;

          CheckBox40: TCheckBox;

          CheckBox41: TCheckBox;

          CheckBox42: TCheckBox;

          CheckBox43: TCheckBox;

          ComboBox2: TComboBox;

          CheckBox46: TCheckBox;

          CheckBox22: TCheckBox;

          ComboBox1: TComboBox;

          CheckBox47: TCheckBox;

          CheckBox48: TCheckBox;

          CheckBox49: TCheckBox;

          CheckBox55: TCheckBox;

          CheckBox54: TCheckBox;

          CheckBox53: TCheckBox;

          CheckBox52: TCheckBox;

          CheckBox51: TCheckBox;

          CheckBox50: TCheckBox;

          CheckBox56: TCheckBox;

          CheckBox57: TCheckBox;

          CheckBox58: TCheckBox;

          CheckBox59: TCheckBox;

          CheckBox60: TCheckBox;

          CheckBox61: TCheckBox;

          CheckBox62: TCheckBox;

          CheckBox63: TCheckBox;

          CheckBox21: TCheckBox;

          Image1: TImage;

          Image2: TImage;

          Image3: TImage;

          Image4: TImage;

          Image5: TImage;

          Image6: TImage;

          Image7: TImage;

          Image8: TImage;

          Image9: TImage;

          Label1: TLabel;

          Label2: TLabel;

          Label3: TLabel;

          Label4: TLabel;

          Label5: TLabel;

          Label6: TLabel;

          Label7: TLabel;

          Label8: TLabel;

          Label9: TLabel;

          Bevel1: TBevel;

          Bevel2: TBevel;

          Bevel3: TBevel;

          Bevel4: TBevel;

          Bevel5: TBevel;

          Bevel6: TBevel;

          Bevel7: TBevel;

          Bevel8: TBevel;

          Bevel9: TBevel;

          Label11: TLabel;

          Label10: TLabel;

          Label12: TLabel;

          Label13: TLabel;

          Label14: TLabel;

          Label15: TLabel;

          Label16: TLabel;

          Label17: TLabel;

          Label18: TLabel;

          Bevel10: TBevel;

          Bevel11: TBevel;

          Bevel12: TBevel;

          Bevel13: TBevel;

          Bevel14: TBevel;

          Bevel15: TBevel;

          Bevel16: TBevel;

          Bevel17: TBevel;

          Panel1: TPanel;

          Image10: TImage;

          Button1: TButton;

          Button2: TButton;

          Button3: TButton;

          OpenPictureDialog1: TOpenPictureDialog;

          SavePictureDialog1: TSavePictureDialog;

          procedure FormShow (Sender: TObject);

          procedure FormClose (Sender: TObject; var Action: TCloseAction);

          procedure CheckBox33Click (Sender: TObject);

          procedure CheckBox21Click (Sender: TObject);

          procedure Button2Click (Sender: TObject);

          procedure Button3Click (Sender: TObject);

          procedure Button1Click (Sender: TObject);

          private

          th1, th2, th3: Cardinal;

          h1, h2, h3: Integer;

          fstart: Boolean;

          end;

          procedure Execute1;

          procedure Execute2;

          procedure Execute3;

          var

          Form1: TForm1;

          implementation

          uses MiniReg;

          {$ R *. dfm}

          procedure Execute1;

          var f: Boolean; d, d1, d2: DWORD; s, s1, s2: String; a1, a0: array of Byte;

          begin

          SetLength (a1, 1); SetLength (a0, 1); a1 [0]: = 1; a0 [0]: = 0;

          while true do begin

          f: = (Form1.PageControl1.ActivePageIndex <> 0);

          if f or (Form1.PageControl2.ActivePageIndex <> 0)

          or Form1.fstart then begin

          RegGetDWORD (HKEY_LOCAL_MACHINE,

          ClearPageFileAtShutdown, d);

          Form1.CheckBox1.Checked: = (d> 0); d: = 0;

          RegGetString (HKEY_LOCAL_MACHINE,

          DebugDrWatsonAuto, s);

          Form1.CheckBox2.Checked: = (s <>'') and (s = 0 ");

          RegGetDWORD (HKEY_LOCAL_MACHINE,

          AlwaysUnloadDLL, d);

          Form1.CheckBox3.Checked: = (d> 0); d: = 0;

          RegGetDWORD (HKEY_CURRENT_USER,

          NoInstrumentation, d);

          Form1.CheckBox4.Checked: = (d> 0); d: = 0;

          RegGetString (HKEY_LOCAL_MACHINE,

          DefaultSeparateVDM, s);

          Form1.CheckBox5.Checked: = (s = 'yes');

          RegGetDWORD (HKEY_LOCAL_MACHINE, DoReport,

          d1);

          RegGetDWORD (HKEY_LOCAL_MACHINE, ShowUI, d2);

          Form1.CheckBox6.Checked: = (d1 = 0) or (d2 = 0);

          RegGetString (HKEY_LOCAL_MACHINE,

          BootOptimizeFunction, s);

          Form1.CheckBox8.Checked: = (s <>'') and (s = 'Y');

          RegGetDWORD (HKEY_CURRENT_USER,

          ConsoleQuickEdit, d);

          Form1.CheckBox9.Checked: = (d> 0); d: = 0;

          end

          else begin

          if Form1.CheckBox1.Checked then

          RegSetDWORD (HKEY_LOCAL_MACHINE,

          ClearPageFileAtShutdown, 1)

          else RegSetDWORD (HKEY_LOCAL_MACHINE,

          ClearPageFileAtShutdown, 0);

          if Form1.CheckBox2.Checked then

          RegSetString (HKEY_LOCAL_MACHINE,

          DebugDrWatsonAuto, "0")

          else RegSetString (HKEY_LOCAL_MACHINE,

          DebugDrWatsonAuto, "1");

          if Form1.CheckBox3.Checked then

          RegSetDWORD (HKEY_LOCAL_MACHINE,

          AlwaysUnloadDLL, 1)

          else RegSetDWORD (HKEY_LOCAL_MACHINE,

          AlwaysUnloadDLL, 0);

          if Form1.CheckBox4.Checked then

          RegSetDWORD (HKEY_CURRENT_USER,

          NoInstrumentation, 1)

          else RegSetDWORD (HKEY_CURRENT_USER,

          NoInstrumentation, 0);

          if Form1.CheckBox5.Checked then

          RegSetString (HKEY_LOCAL_MACHINE,

          DefaultSeparateVDM, 'yes')

          else RegSetString (HKEY_LOCAL_MACHINE,

          DefaultSeparateVDM, 'no');

          if Form1.CheckBox6.Checked then begin

          RegSetDWORD (HKEY_LOCAL_MACHINE, DoReport,

          0);

          RegSetDWORD (HKEY_LOCAL_MACHINE, ShowUI, 0);

          end

          else begin

          RegSetDWORD (HKEY_LOCAL_MACHINE, DoReport,

          1)

          RegSetDWORD (HKEY_LOCAL_MACHINE, ShowUI, 1); end;

          if Form1.CheckBox8.Checked then

          RegSetString (HKEY_LOCAL_MACHINE,

          BootOptimizeFunction, 'Y')

          else RegSetString (HKEY_LOCAL_MACHINE,

          BootOptimizeFunction, 'N');

          if Form1.CheckBox9.Checked then

          RegSetDWORD (HKEY_CURRENT_USER,

          ConsoleQuickEdit, 1)

          else RegSetDWORD (HKEY_CURRENT_USER,

          ConsoleQuickEdit, 0);

          end;

          if f or (Form1.PageControl2.ActivePageIndex <> 1)

          or Form1.fstart then begin

          RegGetDWORD (HKEY_CURRENT_USER,

          NoLowDiskSpaceChecks, d);

          Form1.CheckBox12.Checked: = (d> 0);

          RegGetString (HKEY_CURRENT_USER, MinAnimate, s);

          Form1.CheckBox13.Checked: = (s <>'') and (s = '1 ');

          RegGetDWORD (HKEY_CURRENT_USER,

          SeparateProcess, d);

          Form1.CheckBox14.Checked: = (d> 0);

          RegGetDWORD (HKEY_LOCAL_MACHINE,

          AutoRestartShell, d);

          Form1.CheckBox15.Checked: = (d> 0);

          RegGetBinary (HKEY_CURRENT_USER, LinkImg, s);

          Form1.CheckBox17.Checked: = (ord (s [1]) = 0); s: ='';

          RegGetBinary (HKEY_CURRENT_USER, NoSaveSettings,

          s);

          Form1.CheckBox18.Checked: = (s <>'') and (s = 0 "); s: ='';

          RegGetString (HKEY_CURRENT_USER, DragFullWindows,

          s);

          Form1.CheckBox19.Checked: = (s <>'') and (s = '1 ');

          end

          else begin

          if Form1.CheckBox12.Checked then

          RegSetDWORD (HKEY_CURRENT_USER,

          NoLowDiskSpaceChecks, 1)

          else RegSetDWORD (HKEY_CURRENT_USER,

          NoLowDiskSpaceChecks, 0);

          if Form1.CheckBox13.Checked then

          RegSetString (HKEY_CURRENT_USER, MinAnimate, "1")

          else RegSetString (HKEY_CURRENT_USER, MinAnimate,

          "0");

          if Form1.CheckBox14.Checked then

          RegSetDWORD (HKEY_CURRENT_USER,

          SeparateProcess, 1)

          else RegSetDWORD (HKEY_CURRENT_USER,

          SeparateProcess, 0);

          if Form1.CheckBox15.Checked then

          RegSetDWORD (HKEY_LOCAL_MACHINE,

          AutoRestartShell, 1)

          else RegSetDWORD (HKEY_LOCAL_MACHINE,

          AutoRestartShell, 0);

          if Form1.CheckBox17.Checked then

          RegSetBinary (HKEY_CURRENT_USER, LinkImg, a0)

          else RegSetBinary (HKEY_CURRENT_USER, LinkImg, a1);

          if Form1.CheckBox18.Checked then

          RegSetBinary (HKEY_CURRENT_USER,

          NoSaveSettings, a1)

          else RegSetBinary (HKEY_CURRENT_USER,

          NoSaveSettings, a0);

          if Form1.CheckBox19.Checked then

          RegSetString (HKEY_CURRENT_USER,

          DragFullWindows, "1")

          else RegSetString (HKEY_CURRENT_USER,

          DragFullWindows, '0 ');

          end;

          if f or (Form1.PageControl2.ActivePageIndex <> 2)

          or Form1.fstart then begin

          RegGetDWORD (HKEY_CURRENT_USER,

          EnableBalloonTips, d);

          Form1.CheckBox22.Checked: = (d> 0);

          RegGetDWORD (HKEY_CURRENT_USER,

          TaskbarGlomming, d);

          Form1.CheckBox21.Checked: = (d> 0);

          Form1.ComboBox1.Enabled: = (d> 0);

          RegGetDWORD (HKEY_CURRENT_USER,

          TaskbarGroupSize, d);

          Form1.ComboBox1.ItemIndex: = Integer (d);

          RegGetDWORD (HKEY_CURRENT_USER,

          NoRecentDocsHistory, d);

          Form1.CheckBox20.Checked: = (d> 0);

          RegGetDWORD (HKEY_CURRENT_USER,

          Start_AutoCascade, d);

          Form1.CheckBox23.Checked: = (d> 0);

          RegGetDWORD (HKEY_CURRENT_USER,

          NoCommonGroups, d);

          Form1.CheckBox24.Checked: = (d> 0);

          RegGetString (HKEY_CURRENT_USER,

          StartMenuScrollPrograms, s);

          Form1.CheckBox25.Checked: = (s <>'') and (s = 'YES');

          RegGetDWORD (HKEY_CURRENT_USER, IntelliMenus,

          d);

          Form1.CheckBox26.Checked: = (d> 0);

          RegGetDWORD (HKEY_CURRENT_USER,

          StartMenuChange, d);

          Form1.CheckBox28.Checked: = (d> 0);

          end

          else begin

          if Form1.CheckBox22.Checked then

          RegSetDWORD (HKEY_CURRENT_USER,

          EnableBalloonTips, 1)

          else RegSetDWORD (HKEY_CURRENT_USER,

          EnableBalloonTips, 0);

          if Form1.CheckBox21.Checked then

          RegSetDWORD (HKEY_CURRENT_USER,

          TaskbarGlomming, 1)

          else RegSetDWORD (HKEY_CURRENT_USER,

          TaskbarGlomming, 0);

          RegSetDWORD (HKEY_CURRENT_USER,

          TaskbarGroupSize, DWORD (Form1.ComboBox1.ItemIndex));

          if Form1.CheckBox20.Checked then

          RegSetDWORD (HKEY_CURRENT_USER,

          NoRecentDocsHistory, 1)

          else RegSetDWORD (HKEY_CURRENT_USER,

          NoRecentDocsHistory, 0);

          if Form1.CheckBox23.Checked then

          RegSetDWORD (HKEY_CURRENT_USER,

          Start_AutoCascade, 1)

          else RegSetDWORD (HKEY_CURRENT_USER,

          Start_AutoCascade, 0);

          if Form1.CheckBox24.Checked then

          RegSetDWORD (HKEY_CURRENT_USER,

          NoCommonGroups, 1)

          else RegSetDWORD (HKEY_CURRENT_USER,

          NoCommonGroups, 0);

          if Form1.CheckBox25.Checked then

          RegSetString (HKEY_CURRENT_USER,

          StartMenuScrollPrograms, 'YES')

          else RegSetString (HKEY_CURRENT_USER,

          StartMenuScrollPrograms, 'NO');

          if Form1.CheckBox26.Checked then

          RegSetDWORD (HKEY_CURRENT_USER, IntelliMenus, 1)

          else RegSetDWORD (HKEY_CURRENT_USER,

          IntelliMenus, 0);

          if Form1.CheckBox28.Checked then

          RegSetDWORD (HKEY_CURRENT_USER,

          StartMenuChange, 1)

          else RegSetDWORD (HKEY_CURRENT_USER,

          StartMenuChange, 0);

          end;

          if f or (Form1.PageControl2.ActivePageIndex <> 3)

          or Form1.fstart then begin

          RegGetString (HKEY_LOCAL_MACHINE,

          CodePage + '1250 ', s1);

          RegGetString (HKEY_LOCAL_MACHINE,

          CodePage + '1252 ', s2);

          Form1.CheckBox29.Checked: = (s1 = 'c_1251.nls')

          and (s2 = 'c_1251.nls');

          RegGetString (HKEY_LOCAL_MACHINE, DosKeybCodes,

          s);

          Form1.CheckBox30.Checked: = (s = 'ru');

          RegGetString (HKEY_CURRENT_USER, AutoEndTasks, s);

          Form1.CheckBox31.Checked: = (s <>'') and (s = '1 ');

          RegGetDWORD (HKEY_LOCAL_MACHINE, AutoRunCD,

          d);

          Form1.CheckBox37.Checked: = (d = 0);

          end

          else begin

          if Form1.CheckBox29.Checked then begin

          RegSetString (HKEY_LOCAL_MACHINE,

          CodePage + '1250 ',' c_1251.nls ');

          RegSetString (HKEY_LOCAL_MACHINE,

          CodePage + '1252 ',' c_1251.nls '); end

          else begin

          RegSetString (HKEY_LOCAL_MACHINE,

          CodePage + '1250 ',' c_1250.nls ');

          RegSetString (HKEY_LOCAL_MACHINE,

          CodePage + '1252 ',' c_1252.nls '); end;

          if Form1.CheckBox30.Checked then

          RegSetString (HKEY_LOCAL_MACHINE,

          DosKeybCodes, 'ru')

          else RegSetString (HKEY_LOCAL_MACHINE,

          DosKeybCodes, 'us');

          if Form1.CheckBox31.Checked then

          RegSetString (HKEY_CURRENT_USER, AutoEndTasks,

          "1")

          else RegSetString (HKEY_CURRENT_USER,

          AutoEndTasks, '0 ');

          if Form1.CheckBox37.Checked then

          RegSetDWORD (HKEY_LOCAL_MACHINE,

          AutoRunCD, 0)

          else RegSetDWORD (HKEY_LOCAL_MACHINE,

          AutoRunCD, 1);

          end;

          if f or (Form1.PageControl2.ActivePageIndex <> 4)

          or Form1.fstart then begin

          RegGetDWORD (HKEY_LOCAL_MACHINE,

          DontDisplayLastUserName, d);

          Form1.CheckBox32.Checked: = (d> 0);

          RegGetDWORD (HKEY_LOCAL_MACHINE,

          DisableStatusMessages, d);

          Form1.CheckBox33.Checked: = (d> 0);

          Form1.CheckBox34.Enabled: = (d = 0);

          RegGetDWORD (HKEY_LOCAL_MACHINE,

          VerboseStatus, d);

          Form1.CheckBox34.Checked: = (d> 0);

          RegGetString (HKEY_USERS, Hotkey, s);

          Form1.CheckBox35.Checked: = (s <>'') and (s = '2 '); s: ='';

          RegGetString (HKEY_USERS, InitialKeyboardIndicators, s);

          Form1.CheckBox36.Checked: = (s <>'') and (s = '2 ');

          end

          else begin

          if Form1.CheckBox32.Checked then

          RegSetDWORD (HKEY_LOCAL_MACHINE,

          DontDisplayLastUserName, 1)

          else RegSetDWORD (HKEY_LOCAL_MACHINE,

          DontDisplayLastUserName, 0);

          if Form1.CheckBox33.Checked then

          RegSetDWORD (HKEY_LOCAL_MACHINE,

          DisableStatusMessages, 1)

          else RegSetDWORD (HKEY_LOCAL_MACHINE,

          DisableStatusMessages, 0);

          if Form1.CheckBox34.Checked then

          RegSetDWORD (HKEY_LOCAL_MACHINE,

          VerboseStatus, 1)

          else RegSetDWORD (HKEY_LOCAL_MACHINE,

          VerboseStatus, 0);

          if Form1.CheckBox35.Checked then

          RegSetString (HKEY_USERS, Hotkey, '2 ')

          else RegSetString (HKEY_USERS, Hotkey, "1");

          if Form1.CheckBox36.Checked then

          RegSetString (HKEY_USERS, InitialKeyboardIndicators, '2 ')

          else RegSetString (HKEY_USERS, InitialKeyboardIndicators,

          "0");

          end;

          Sleep (1000);

          end;

          end;

          procedure Execute2;

          var f: Boolean; d, d1, d2: DWORD; s: String;

          begin

          while true do begin

          f: = (Form1.PageControl1.ActivePageIndex <> 1);

          if f or (Form1.PageControl4.ActivePageIndex <> 0)

          or Form1.fstart then begin

          RegGetDWORD (HKEY_CURRENT_USER,

          DisableTaskMgr, d);

          Form1.CheckBox38.Checked: = (d> 0);

          RegGetDWORD (HKEY_CURRENT_USER,

          DisableRegistryTools, d);

          Form1.CheckBox39.Checked: = (d> 0);

          RegGetDWORD (HKEY_CURRENT_USER, NoLogOff, d);

          Form1.CheckBox40.Checked: = (d> 0);

          RegGetDWORD (HKEY_CURRENT_USER, NoClose, d);

          Form1.CheckBox41.Checked: = (d> 0);

          RegGetDWORD (HKEY_CURRENT_USER,

          NoControlPanel, d);

          Form1.CheckBox42.Checked: = (d> 0);

          RegGetDWORD (HKEY_CURRENT_USER, NoDispCPL, d);

          Form1.CheckBox43.Checked: = (d> 0);

          RegGetDWORD (HKEY_CURRENT_USER, DisableCMD,

          d);

          Form1.ComboBox2.ItemIndex: = Integer (d); d1: = 5; d2: = 5;

          RegGetDWORD (HKEY_LOCAL_MACHINE,

          RestrictAnonymous, d);

          Form1.CheckBox46.Checked: = (d> 0);

          end

          else begin

          if Form1.CheckBox38.Checked then

          RegSetDWORD (HKEY_CURRENT_USER,

          DisableTaskMgr, 1)

          else RegSetDWORD (HKEY_CURRENT_USER,

          DisableTaskMgr, 0);

          if Form1.CheckBox39.Checked then

          RegSetDWORD (HKEY_CURRENT_USER,

          DisableRegistryTools, 1)

          else RegSetDWORD (HKEY_CURRENT_USER,

          DisableRegistryTools, 0);

          if Form1.CheckBox40.Checked then

          RegSetDWORD (HKEY_CURRENT_USER, NoLogOff, 1)

          else RegSetDWORD (HKEY_CURRENT_USER, NoLogOff,

          0);

          if Form1.CheckBox41.Checked then

          RegSetDWORD (HKEY_CURRENT_USER, NoClose, 1)

          else RegSetDWORD (HKEY_CURRENT_USER, NoClose,

          0);

          if Form1.CheckBox42.Checked then

          RegSetDWORD (HKEY_CURRENT_USER,

          NoControlPanel, 1)

          else RegSetDWORD (HKEY_CURRENT_USER,

          NoControlPanel, 0);

          if Form1.CheckBox43.Checked then

          RegSetDWORD (HKEY_CURRENT_USER,

          NoDispCPL, 1)

          else RegSetDWORD (HKEY_CURRENT_USER,

          NoDispCPL, 0);

          RegSetDWORD (HKEY_CURRENT_USER, DisableCMD,

          DWORD (Form1.ComboBox2.ItemIndex));

          if Form1.CheckBox46.Checked then

          RegSetDWORD (HKEY_LOCAL_MACHINE,

          RestrictAnonymous, 1)

          else RegSetDWORD (HKEY_LOCAL_MACHINE,

          RestrictAnonymous, 0);

          end;

          if f or (Form1.PageControl4.ActivePageIndex <> 1)

          or Form1.fstart then begin

          RegGetDWORD (HKEY_CURRENT_USER,

          NoViewContextMenu, d);

          Form1.CheckBox47.Checked: = (d> 0);

          RegGetDWORD (HKEY_CURRENT_USER, NoFileMenu,

          d);

          Form1.CheckBox48.Checked: = (d> 0);

          RegGetDWORD (HKEY_CURRENT_USER,

          NoShellSearchButton, d);

          Form1.CheckBox49.Checked: = (d> 0);

          end

          else begin

          if Form1.CheckBox47.Checked then

          RegSetDWORD (HKEY_CURRENT_USER,

          NoViewContextMenu, 1)

          else RegSetDWORD (HKEY_CURRENT_USER,

          NoViewContextMenu, 0);

          if Form1.CheckBox48.Checked then

          RegSetDWORD (HKEY_CURRENT_USER,

          NoFileMenu, 1)

          else RegSetDWORD (HKEY_CURRENT_USER,

          NoFileMenu, 0);

          if Form1.CheckBox49.Checked then

          RegSetDWORD (HKEY_CURRENT_USER,

          NoShellSearchButton, 1)

          else RegSetDWORD (HKEY_CURRENT_USER,

          NoShellSearchButton, 0);

          end;

          if f or (Form1.PageControl4.ActivePageIndex <> 2)

          or Form1.fstart then begin

          RegGetDWORD (HKEY_CURRENT_USER, NoSetTaskbar,

          d);

          Form1.CheckBox50.Checked: = (d> 0);

          RegGetDWORD (HKEY_CURRENT_USER,

          NoChangeStartMenu, d);

          Form1.CheckBox51.Checked: = (d> 0);

          RegGetDWORD (HKEY_CURRENT_USER, NoFind, d);

          Form1.CheckBox52.Checked: = (d> 0);

          RegGetDWORD (HKEY_CURRENT_USER, NoRun, d);

          Form1.CheckBox53.Checked: = (d> 0);

          RegGetDWORD (HKEY_CURRENT_USER, NoSMHelp, d);

          Form1.CheckBox54.Checked: = (d> 0);

          RegGetDWORD (HKEY_CURRENT_USER,

          NoRecentDocsMenu, d);

          Form1.CheckBox55.Checked: = (d> 0);

          RegGetDWORD (HKEY_CURRENT_USER,

          NoTrayContextMenu, d);

          Form1.CheckBox56.Checked: = (d> 0);

          end

          else begin

          if Form1.CheckBox50.Checked then

          RegSetDWORD (HKEY_CURRENT_USER,

          NoSetTaskbar, 1)

          else RegSetDWORD (HKEY_CURRENT_USER,

          NoSetTaskbar, 0);

          if Form1.CheckBox51.Checked then

          RegSetDWORD (HKEY_CURRENT_USER,

          NoChangeStartMenu, 1)

          else RegSetDWORD (HKEY_CURRENT_USER,

          NoChangeStartMenu, 0);

          if Form1.CheckBox52.Checked then

          RegSetDWORD (HKEY_CURRENT_USER, NoFind, 1)

          else RegSetDWORD (HKEY_CURRENT_USER, NoFind, 0);

          if Form1.CheckBox53.Checked then

          RegSetDWORD (HKEY_CURRENT_USER, NoRun, 1)

          else RegSetDWORD (HKEY_CURRENT_USER, NoRun, 0);

          if Form1.CheckBox54.Checked then

          RegSetDWORD (HKEY_CURRENT_USER, NoSMHelp, 1)

          else RegSetDWORD (HKEY_CURRENT_USER,

          NoSMHelp, 0);

          if Form1.CheckBox55.Checked then

          RegSetDWORD (HKEY_CURRENT_USER,

          NoRecentDocsMenu, 1)

          else RegSetDWORD (HKEY_CURRENT_USER,

          NoRecentDocsMenu, 0);

          if Form1.CheckBox56.Checked then

          RegSetDWORD (HKEY_CURRENT_USER,

          NoTrayContextMenu, 1)

          else RegSetDWORD (HKEY_CURRENT_USER,

          NoTrayContextMenu, 0);

          end;

          Sleep (1000);

          end;

          end;

          procedure Execute3;

          var f: Boolean; d, d1, d2: DWORD; s, s1, s2: String;

          begin

          while true do begin

          if (Form1.PageControl1.ActivePageIndex <> 2)

          or Form1.fstart then begin

          RegGetDWORD (HKEY_CURRENT_USER,

          PaintDesktopVersion, d);

          Form1.CheckBox57.Checked: = (d> 0);

          RegGetDWORD (HKEY_CURRENT_USER, NoDesktop, d);

          Form1.CheckBox58.Checked: = (d> 0);

          RegGetDWORD (HKEY_CURRENT_USER,

          NoActiveDesktop, d);

          Form1.CheckBox59.Checked: = (d> 0);

          RegGetDWORD (HKEY_CURRENT_USER,

          NoDispBackgroundPage, d);

          Form1.CheckBox60.Checked: = (d> 0);

          RegGetDWORD (HKEY_CURRENT_USER,

          NoDispScrSavPage, d);

          Form1.CheckBox61.Checked: = (d> 0);

          RegGetDWORD (HKEY_CURRENT_USER,

          NoDispSettingsPage, d);

          Form1.CheckBox62.Checked: = (d> 0);

          RegGetDWORD (HKEY_CURRENT_USER,

          NoDispAppearancePage, d);

          Form1.CheckBox63.Checked: = (d> 0);

          end

          else begin

          if Form1.CheckBox57.Checked then

          RegSetDWORD (HKEY_CURRENT_USER,

          PaintDesktopVersion, 1)

          else RegSetDWORD (HKEY_CURRENT_USER,

          PaintDesktopVersion, 0);

          if Form1.CheckBox58.Checked then

          RegSetDWORD (HKEY_CURRENT_USER, NoDesktop, 1)

          else RegSetDWORD (HKEY_CURRENT_USER,

          NoDesktop, 0);

          if Form1.CheckBox59.Checked then

          RegSetDWORD (HKEY_CURRENT_USER,

          NoActiveDesktop, 1)

          else RegSetDWORD (HKEY_CURRENT_USER,

          NoActiveDesktop, 0);

          if Form1.CheckBox60.Checked then

          RegSetDWORD (HKEY_CURRENT_USER,

          NoDispBackgroundPage, 1)

          else RegSetDWORD (HKEY_CURRENT_USER,

          NoDispBackgroundPage, 0);

          if Form1.CheckBox61.Checked then

          RegSetDWORD (HKEY_CURRENT_USER,

          NoDispScrSavPage, 1)

          else RegSetDWORD (HKEY_CURRENT_USER,

          NoDispScrSavPage, 0);

          if Form1.CheckBox62.Checked then

          RegSetDWORD (HKEY_CURRENT_USER,

          NoDispSettingsPage, 1)

          else RegSetDWORD (HKEY_CURRENT_USER,

          NoDispSettingsPage, 0);

          if Form1.CheckBox63.Checked then

          RegSetDWORD (HKEY_CURRENT_USER,

          NoDispAppearancePage, 1)

          else RegSetDWORD (HKEY_CURRENT_USER,

          NoDispAppearancePage, 0);

          end;

          Sleep (1000);

          end;

          end;

          procedure IncEdit1; begin Execute1; end;

          procedure IncEdit2; begin Execute2; end;

          procedure IncEdit3; begin Execute3; end;

          procedure TForm1.CheckBox33Click (Sender: TObject);

          begin CheckBox34.Enabled: = not CheckBox33.Checked; end;

          procedure TForm1.CheckBox21Click (Sender: TObject);

          begin ComboBox1.Enabled: = CheckBox21.Checked; end;

          procedure TForm1.FormShow (Sender: TObject);

          begin

          fstart: = true;

          Form1.PageControl1.ActivePageIndex: = 2;

          Form1.PageControl2.ActivePageIndex: = 4;

          h1: = BeginThread (nil, 1024, @ incedit1, nil, 1, th1);

          h2: = BeginThread (nil, 1024, @ incedit2, nil, 2, th2);

          h3: = BeginThread (nil, 1024, @ incedit3, nil, 3, th3);

          Form1.PageControl2.ActivePageIndex: = 0;

          Form1.PageControl1.ActivePageIndex: = 0;

          Sleep (1000);

          Button3Click (Sender);

          fstart: = false;

          end;

          procedure TForm1.FormClose (Sender: TObject; var Action: TCloseAction);

          begin

          TerminateThread (h1, 0);

          TerminateThread (h2, 0);

          TerminateThread (h3, 0);

          end;

          procedure TForm1.Button2Click (Sender: TObject);

          var s: String;

          begin

          if OpenPictureDialog1.Execute then begin

          s: = OpenPictureDialog1.FileName;

          RegSetString (HKEY_CURRENT_USER, Wallpaper, s);

          RegSetString (HKEY_CURRENT_USER, TileWallpaper, '0 ');

          SystemParametersInfo (SPI_SETDESKWALLPAPER, 0, nil,

          SPIF_SENDWININICHANGE);

          Screen.Realign;

          Button3Click (Sender);

          end;

          end;

          procedure TForm1.Button3Click (Sender: TObject);

          var s: String;

          begin

          RegGetString (HKEY_CURRENT_USER, Wallpaper, s);

          if FileExists (s) then

          Image10.Picture.LoadFromFile (s);

          end;

          procedure TForm1.Button1Click (Sender: TObject);

          begin

          if Image10.Picture.GetNamePath <>''then

          if SavePictureDialog1.Execute then

          Image10.Picture.SaveToFile (SavePictureDialog1.FileName);

          end;

          end.



          Інтерфейс програми


          Інтерфейс програми заснований на ідеї поділу налаштувань (системи) на категорії, представлені вкладками. Кожна вкладка вікна програми має певний набір параметрів відповідний певної групи (вкладки першого рівня) і підгрупі (вкладки другого рівня) налаштувань. Тепер розглянемо кожну з вкладок більш докладніше.

          Вкладу "Система"

          Дана вкладка призначення для налаштування деяких основних параметрів системи, які найбільш привертають увагу користувача. Тим не менш, деякі досить цікаві параметри тут не зустрінуться, за тією простою причиною, що ними може керувати і сама система, та й на більшості сучасних комп'ютерів вони не впливають на стабільність і швидкодію системи (наприклад, змінити розмір файлу підкачки і взагалі дозволити / заборонити його використання тут не можна - розміру файлу підкачки встановлюваного системою за замовчуванням цілком вистачає для роботи системи, при тому обсязі ВП ПК що зараз доступний користувачеві).

          Назва подвкладкі може прозвучати як тавтологія, але кількість повторів одного слова в даному випадку тут не грає ролі, оскільки ця вкладка несе на собі настройки основних служб Windows. Наприклад, параметр "Запускати 16-бітові застосування в окремих процесах" відповідає за режим роботи 16-розрядної підсистеми, і дозволяє зробити роботу консольних додатків більш стабільною (якщо одне з одночасно запущених додатків зробить помилку - це не приведе краху інших). Так параметр "Очищати файл підкачки перед перезавантаженням системи" дозволяє прискорити завантаження системи та її подальшу роботу, тому що весь сторінковий файл (-и) будуть очищатися і системі не потрібно буде використовувати його не зайняту з минулого сеансу роботи частина, а почне заповнювати його з самого початку. Прапор "Відключити вбудований відладчик Dr. Watson" забороняє використовувати стандартний засіб налагодження додатків, що дозволяє істотно прискорити роботу системи та відключити вікно нав'язливі вікна з повідомленням про помилки додатки (у більшості випадків). "Автоматично вивантажувати не використовувані бібліотеки" - параметр, включення якого змушує систему не зберігати в пам'яті бібліотеки які давно не використовувалися, це дозволяє трохи звільнити пам'ять, особливо коли необхідно багато додатків використовувати одночасно, але може призвести до дещо нестабільної роботи системи. "Відключити стеження Windows за користувачем" - відключає ведення системою журналу часто запускаються, відкритих додатків і т.д. "Не відсилати в Microsoft звіти про помилки" - відключає появу запиту надіслати звіт про помилку програми або системи її розробникам, тому що це іноді нервує, а при налагодженні свого застосування просто виводить з себе. Опція "Оптимізувати системні файли при завантаженні" змушує системи дефрагментувати системні файли (не використовуються в даний момент) як на жорсткому диску так і у ВП, але тільки при завантаженні системи, що може призвести до уповільнення її завантаження, але прискорить її подальшу роботу. І нарешті, останній параметр даної вкладки "Використовувати швидке редагування в командному рядку" дозволяє використовувати кнопки миші для копіювання і вставки (без контекстного меню - воно все одно буде недоступне!).

          Вкладка "Провідник" призначена для налаштування параметрів системної служби "Explorer" ("Провідник"). Оскільки в Windows Провідник є і графічною оболонкою і програмою навігації по файловій системі, то слід уточнити, що тут представлені параметри для Провідника як графічної оболонки. Опція "Відключити повідомлення про недолік вільного місця" в принципі наведена тут більше для систем під управлінням Windows 2000 і більш ранніх, тому що саме вони більш використовуються на ПК з жорсткими дисками малого обсягу. "Анімація при згортанні і розгортанні вікон" заставлена ​​в системі за умовчанням і робить інтерфейс більш барвистим, але вимагає дещо більш ресурсів для оболонки, відключення цієї опції дозволяє виділити більше процесорного часу і пам'яті на дійсно необхідні цілі (актуально для слабких машин). "Запуск вікна Провідника в окремому процесі", дозволяє зробити роботу системи більш стабільною за рахунок того що вікна Провідника працюють не в окремих потоках, а в окремих процесах і при "зависанні" одного вікна весь Робочий стіл з іншими вікнами Провідника не буде закриватися. Параметр "Автоматично перезавантажувати провідник при помилках" змушує стежити за стабільною роботою провідника, і якщо він не відповідає на запити системи - перезавантажувати його, це може врятувати від тривалих зависань системи з причин пов'язаних з роботою оболонки або Провідників. "Не додавати" Ярлик для ... "у нових ярликів" говорить сама за себе - ім'я ярлика буде те саме що і об'єкта на який він посилається. "Відключити автозапись стану вікон Провідника" говорить системі про те, що не треба зберігати розміри і положення останнього вікна провідника для використання їх під час наступного запуску Провідника. "Показати вміст вікна при перетягуванні" змушує систему при переміщенні вікна динамічно змінювати положення перетягуваного вона, а не відображати рамку вікна до завершення перетягування (відключення опції актуально для слабких машин).

          Вкладка "Панель завдань і меню Пуск" служить для зміни деяких параметрів відповідних елементів. Опція "Показувати спливаючі підказки" дозволяє системі виводити "підказки" для елементів меню Пуск і панелі завдань. За допомогою опції "Групувати схожі кнопки на панелі завдань" дозволяє вивільнити місце для відображення кнопок нових вікон завдяки угруповання вікон з однієї програми в кнопку зі спадним списком. А список уточнення цього параметра може допомогти налаштувати цю функцію користувачеві під себе. Параметр "Не вести історію відкритих документів" змусить систему очистити список недавно відкритих документів в меню Пуск і не більше не заборонить його поповнення. Опція "Розкривати меню при наведенні і затримки покажчика" дозволить відкривати підпункти меню Пуск просто наведенням вказівника на нього, при цьому клік вже не потрібне буде, хоча і не заборонений (включено за замовчуванням). "Не показувати загальні ярлики (All Users)" дозволить відображення в меню Пуск тільки ярликом поточного користувача (для кожного користувача задається окремо). "Використовувати Продивіться меню пуск" за замовчуванням вимкнено, для відображення меню в кілька рядів щоб показати всі його пункти, а з прокруткою меню буде мати одну колонку і кнопки прокрутки, у випадку якщо не пунктів більше ніж на одну колонку (можливо актуально для ПК з моніторами малого дозволу або за індивідуальним смаком). "Використання скороченого меню" приховає ті пункти меню, що давно використовувалися, до натиснення кнопок прокрутки (рекомендується використовувати з попереднім параметром, але можна і без нього). "Дозвіл перетягування об'єктів" дозволяє поміщати в меню Пуск ярлики і файли з робочого столу або іншого місця простим перетягуванням у потрібну категорію.

          Вкладка "Вирішення проблем" може допомогти виправити деякі неприємні ситуації коли замість російського тексту відображаються всякі незрозумілі знаки або коли система не завершується через завислого додатка. Так параметр "Використовувати кодування 1251 замість 1252" може допомогти вирішити допомогти вирішити проблему з відображенням російського тексту в деяких додатках. "Перехід на російську розкладку в DOS додатках" дозволить вводити російський текст в консольних додатках самостійно не змінюють розкладку самостійно. Опція "Автоматично завершувати завислі застосування" може бути дуже корисна, особливо при перезавантаження, тому що вона змушує систему чекати самостійного завершення програми певний час, а потім примусово завершувати їх роботу вважаючи їх завислими, це може істотно підвищити швидкість виключення ПК. Параметр "Відключити автозапуск компакт-дисків" забороняє автозапуск так званих "AutoRun" додатків присутніх на всіх сучасних дисках з ПЗ (ігрових, збірниках музики для ПК і т.д.).

          Вкладка "Завантаження системи" дозволяє змінити деякі помітні користувачеві параметри завантаження системи, тобто до входу в той чи оной сеанс. Так опція "Не показувати ім'я останнього користувача" забороняє системі відображати ім'я останнього використовує систему користувача (актуально для систем попередніх Windows XP, а так само в самій XP при використанні класичного стилю). "Не показувати повідомлення при вході / виході" позбавить користувача від відображення всякого роду спливаючих вікон при завантаженні або завершенні роботи системи (у тому числі і вікон з повідомленнями від помилки). "Показ виконуваних команд при вході / виході" призведе до появи вікна із звітом про виконуваних у поточний час (і виконаних) командах. "Використовувати Ctrl + Shift для перемикання розкладки" - говорить саме за себе. Опція "Включити Num Lock при запуску" змусить систему включити відповідний режим клавіатури.

          Вкладу "Захист"

          Ця вкладка надає інформація про параметри захисту і дозволяє їх змінити. Під захистом в даному випадку мається на увазі не шифрування або доступ з паролем / по привілеї, а заборона виклику певних служб і відображення деяких вкладок системних утиліт, для заборони зміни певних параметрів.

          Вкладка "Система" несе на собі опції заборони використання тих чи інших служб системи. Наприклад опція "Заборонити виклик диспетчера завдань" запобігає виклик системної служби Диспетчер завдань, а "Заборона зміни властивостей екрану" не дозволяє отримати доступ до властивостей екрану, що відкриваються через контекстне меню робочого столу або через панель завдань, але тим не менш не прибирають команди їх виклику . "Заборона редагування реєстру" не допускає внесення змін до реєстру і забороняє доступ до системної утиліті RegEdit. "Заборона завершення сеансу" напевно більше потрібно для тих систем, що повинні постійно працювати, таких як сервери, а запобігання завершення роботи на звичайних станціях, я думаю ні до чого. Опція "Заборонити завершення роботи і прибрати кнопку з меню Пуск" виконує аналогічні попереднього параметри дії, але вони стосуються не окремого сеансу роботи користувача, а роботи системи в цілому. "Заборона запуску аплетів в Панелі управління" дозволяє роботу Панелі управління тільки з її стандартними утилітами, а використання утиліт (в даному випадку аплетов) встановлених стороннім ПЗ буде недоступне. Далі на цій вкладці розташовується список, що розкривається для налаштування "захисту" командного рядка, щоб запобігти несанкціонованому доступу та / або заборонити використання bat або reg файлів запускаються консольними програмами та потенційно здатних зашкодити системі. Опція "Заборонити анонімним користувачам переглядати ресурси системи" заборонить доступ як локальних так і мережевих користувачів увійшли як "Гості" або приховують своє ім'я до переглянь і відповідно отримання доступу до ресурсів системи.

          Вкладка "Меню Пуск і Панель завдань" управляє доступом до налаштувань відповідних елементів інтерфейсу і деякими їх елементам. Так, опція "Зробити недоступними властивості Панелі завдань і меню Пуск" забороняє відкриття діалогу налаштувань меню Пуск і панелі завдань. "Заборона модифікації меню Пуск" запобігає зміна порядку і складу пунктів меню. "Заборона пункту Пошук в меню Пуск" запобігає запуск з головного меню утиліти пошуку, але не забороняє її виклик з Провідника. Аналогічно з наступними опціями: "Заборонити пункт Виконати в меню Пуск", "Заборонити пункт Довідка та підтримка в меню Пуск", "Заборонити пункт Недавні документи в меню Пуск". Параметр "Заборонити контекстне меню панелі задач" не тільки не дозволить змінювати параметри Панелі завдань через її контекстне меню, але заборонить і саме контекстне меню.

          Вкладу "Робочий стіл"

          Це остання вкладка програми і на ній подвкладок, тому що використовуваних мною параметрів мало для поділу їх на вкладки. Дана вкладка дозволяє настроїти доступ до налаштувань Робочого столу, і змінити фонове зображення. Так опція "Версія Windows на робочому столі" змусить explorer виводити рядки з версією системи по кутах екрана. А ось опції "Заборонити робочий стіл" і "Заборонити active Desktop" не призводять до відображення нової інформації, а навпаки забороняють її висновок - перша опція забороняє відображення всіх значків на Робочому столу, навіть тих що відносяться до активного користувача, а друга забороняє використання в як фон Робочого столу будь-якого зображення та / або web-сторінки. Інші параметри починаються зі слів "сховати вкладку" відносяться до діалогу властивостей Робочого столу і примушують систему приховувати однойменні вкладки цього вікна. Що стосується останніх елементів даної вкладки, розташованих нижче останнього роздільника, то вони надають можливість перегляду поточного фонового зображення (навіть якщо його відображення заборонено на робочому столі) і його зміна, а так само можливість збереження його в довільному графічному файлі. При цьому виходить інформація з реєстру лише про місцезнаходження файлу зображення і його установка, саме зображення вже читається з файлу.


          Висновок


          Тепер підіб'ємо підсумки. У курсовому проекті були використані API-функції роботи з реєстром для роботи з реєстром, а так само для роботи з потоками. Результат виконання курсового проекту - додаток з трьома дочірніми потоками зчитувальними з реєстру значення параметром, розподілених за трьома основними категоріями (параметри системи (її основних компонент), захисту (управлінні доступом до деяких параметрів системи) і робочого столу (управління доступу до налаштувань робочого столу і зміна деяких параметрів)), і заносячи зміни цих параметрів до реєстру. До складу створеного програми входить модуль, в якому були описані функції-надбудови над API функціями для зведення роботи з ними до мінімуму, та спрощення їх використання. Таким чином завдання курсового проекту я вважаю виконаною.


          Використана література


          1. Система програмування Delphi 7. Фаронов В. 2005 С.-П.

          2. Microsoft Windows 2000 Professional. Александров А. 2003 З .- П.

          3. Microsoft Windows XP. Home Edition. Кокорєв О. 2006 С.-П.

          4. Delphi 7. Горман В.М. 2005 р. М.


      Додати в блог або на сайт

      Цей текст може містити помилки.

      Програмування, комп'ютери, інформатика і кібернетика | Курсова
      262.9кб. | скачати


      Схожі роботи:
      Архітектура системного реєстру Windows
      Адміністрування системного реєстру Win9x nt 2000
      Налаштування локальної мережі і підключення до мережі інтернет для Windows XP і Windows 7
      Налаштування інтерфейсу операційної системи Windows
      Налаштування файлу підкачки для оптимізації Windows XP
      Предметна область системного аналізу Основні поняття системного аналізу
      Робота з гарячими клавішами в ОС Windows Призначення гарячих клавіш в ОС WINDOWS -функції
      Операційні системи WINDOWS NT NetWare UNIX Оперцiйна система Windows NT
      Пошук даних в ОС Windows Основні прийоми роботи із пошуком в ОС WINDOWS
      © Усі права захищені
      написати до нас