Учебная работа. Курсовая работа: Настройка Windows по средствам системного реестра

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Загрузка...
Контрольные рефераты

Учебная работа. Курсовая работа: Настройка 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 (PersonalComputer). Главный мыслью, которой является организация взаимодействия юзера сразу с несколькими приложениями и прозрачная работа с аппаратными средствами. Но это тема уже другого курсового проекта, а на данный момент пойдет речь о способностях опции операционной системы Microsoft®
Windows®
с помощью, так именуемого, системного реестра.

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

Как можно применять системный реестр, чтоб поменять опции ОС «под себя» и убыстрить либо улучшить её работу на примере (который я именовал
), будет кратко изложено в разделе
. Описание примера и методы его работы будет изготовлено в разделе
.

О программной реализации MiniTweaker-а речь пойдет в разделе
, а его начальный текст можно отыскать в соответственном разделе (
).

Подведение итогов, анализ полноты решения задачки курсового проекта и способностях использования его данных в остальных «актуальных» задачках рассказывается в
.


Постановка задачки

Системный реестр – это кладезь различных данных, тут хранятся опции как самой ОС, так и не системного программного обеспечения (дальше ПО ), а так же надстройки юзеров, использующих данную систему, и данные о аппаратных средствах. Целью данного курсового проекта является внедрение системного реестра как средства манипулирования опциями ОС и пользовательскими надстройками, при этом средствами самой системы (API-функциями). Следует увидеть, что операционная система Windows дозволяет организовать одновременную работу огромного количества потоков установок (почаще всего просто называемых – потоками) которые могут быть или независящими (либо относительно независящими, но рассмотрение данной препядствия не заходит в рамки данного курсового проекта) тогда и они именуются действиями, либо, как принято их именовать, программками (хотя это не совершенно корректно), или зависимыми, тогда они являются, определенного рода, частями потоков. В связи с данным фактом хотелось бы отметить многопоточную реализации программной части данного проекта.

Как один методов решения поставленной задачки можно предложить Tweaker – подстройщик неких, не критических, характеристик системы. В задачку Tweaker-а (в общем случае) заходит предложение юзеру ряда опций определенной программной единицы (ПО либо ОС) для последующих манипуляций с ними (просто ознакомления либо их конфигурации). При всем этом сами информация о настройках выходит или от объекта опции, или из фалов хранящих его опции. В случае манипуляции с опциями ОС логичнее и вернее будет получать опции от неё же (с помощью соответственных средств, в данном случае API-функций). В случае с ОС можно применять предоставляемые ей способности по разделению подзадач в параллельно выполняющиеся уже фактически независящие потоки, любой из которых будет созодать свою небольшую часть работы. Для Tweaker-а можно выделить два варианта подобного подхода к разделению подзадач: чтение и запись опций можно делать в различных потоках; чтение и запись можно делать в одном потоке, но для различных круп опций.


1. анализ предметной области

Системный реестр Windows – это общедоступная база данных, хранящая персональную для всякого компа настроечную информацию, применяемую программным обеспечением и самой системой. Данные в реестре упорядочены в древовидные структуры, состоящие из узлов, которые в терминологии Windows именуются ключами. Любой ключ имеет один родительский ключ, один либо несколько дочерних ключей и ноль либо несколько характеристик типа имя_параметра =значение. Исключение представляют корневые ключи (они не имеют родителей) и дочерние ключи низшего уровня (они не имеют дочерних ключей). По дефлоту несистемное ПО регистрирует свою информацию в корневом ключе с именованием




. Получить доступ к реестру можно написав в командной строке («ПУСК > «Выполнить») слово «RegEdit» — при всем этом запуститься программка для редактирования реестра. Окно данной для нас программки поделено на две части. В левой (наиболее узенькой панели) показана древовидная структура ключей. Сами установки именуются параметрами, находящимися в правой панели. Любой параметр имеет своё имя, значение и тип. Характеристики бывают строкового типа, двоичного и типа DWORD. Их весьма много, но их предназначение зависит от того, в котором ключе находится той либо другой параметр. Ключи делятся меж шестью главными разделами:

— HKEY_CLASSES_ROOT – Содержит информацию о OLE, операциях перетаскивания (drag-and-drop — с англ. перетащить-и-отпустить) и ярлычках. В данном разделе можно так же указать программки, запускаемые при активизации файлов определённого типа. Данный раздел является псевдонимом для ветки HKEY_LOCAL_MACHINESoftwareClasses

— HKEY_CURRENT_User – Содержит личные установки для всякого юзера, зарегистрированного в системе. Данный раздел является псевдонимом для ветки HKEY_USERS

— HKEY_LOCAL_MACHINE – Содержит аппаратные и программные установки, нужные для функционирования оборудования и программ. Данный раздел так же хранит конфигурацию Windows.

— HKEY_USERS – Содержит установки юзеров и надлежащие конфигурационные данные, такие как цвет окна, размещение частей на десктопе, обои, заставки.

— HKEY_CURRENT_CONFIG – Содержит информацию о текущем аппаратном профиле. Если вы не используете аппаратные профили, данный раздел содержит установки Windows по дефлоту.

— HKEY_DYN_DATA – В отличие от остальных разделов, которые хранят статистические данные (неизменяющиеся во время сеанса), данный раздел содержит указатели на динамические данные (повсевременно изменяющиеся во время работы компа). Windows употребляет данный раздел для отслеживания профилей оборудования plug-and-play, статистики по производительности и драйверов виртуальных устройств VxD.

Все данные системного реестра заключаются в 2-ух файлах, находящихся в директории Windows — это System.dat и User.dat.

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


1.1 Описание
API-функций работы с реестром

Сделать подраздел в реестре:

RegCreateKey (Key:HKey; SubKey: PChar; varResult: HKey): Longint;

· Key — показывает на «корневой» раздел реестра, в Delphi1 доступен лишь один — HKEY_CLASSES_ROOT, а в Delphi3 — все.

· SubKey — имя раздела — строится по принципу пути к файлу в DOS (пример subkey1subkey2 …). Если таковой раздел уже существует, то он раскрывается.

В любом случае при успешном вызове 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;

Удалить подраздел KeySubKey.

Возврат — код ошибки либо ERROR_SUCCESS, если нет ошибок.

Получить имена всех подразделов раздела Key:

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

· Key — Handle на открытый либо сделанный раздел

· Buffer — указатель на буфер

· cb — размер буфера

· index — индекс, должен быть равен 0 при первом вызове RegEnumKey. Обычное внедрение — в цикле While, где index возрастает до того времени, пока очередной вызов RegEnumKey не закончится ошибкой.

Возвращает текстовую строчку, связанную с ключом KeySubKey:

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

Longint;

· Ключподключ KeySubKey.

· Value — буфердлястроки

· cb — размер, на входе — размер буфера, на выходе — длина возвращаемой строчки.

Возврат — код ошибки.

Задать новое

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

cb: Longint): Longint;

· Ключподключ KeySubKey.

· ValType — тип задаваемой переменной,

· Value — буфер для переменной

· cb — размер буфера. В Windows 3.1 допустимо лишь Value=REG_SZ.

Возврат — код ошибки либо ERROR_SUCCESS, если нет ошибок.

Удаляет

RegDeleteValue(HKEY hKey, LPCTSTR lpValueName);

· hKey — ключ. hKey должен был быть открыт с доступом KEY_SET_VALUE процедурой RegOpenKey.

· lpValueName —

Возвращает 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; // Флаги сотворения

varlpThreadId: LongWord// Указатель на возвращаемый

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

): Integer;

Создание отдельного потока выполнения:

function BeginThread(

SecurityAttributes: Pointer;// Указательнаатрибутызащитыпотока

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

ThreadFunc: TThreadFunc;// Указатель на функцию потока

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

CreationFlags: LongWord;// Флагисоздания

varThreadId: 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-ой предоставляет информацию юзеру о текущих значениях предопределенных характеристик, и вносит изготовленные юзером конфигурации характеристик в системный реестр. Ах так это смотрится:

Вызов функция


2.1.2 Описание структуры модулей

Модуль MiniReg не несет многофункциональной перегрузки, все функции описанные в нем являются только надстройками над WinAPI для упрощения их использования. Описание функций модуля можно отыскать в разделе «


. Почему необходимо подчеркнуть линейность структуры модуля и его функций, потому описание взаимодействия функций в модуле нет (все взаимодействия осуществляются через характеристики), потому структуру модуля я не привожу.

Модуль Unit1 является модулем главной (и единственной) формы приложения. Тем не наименее все элементы относящиеся к форме не несут многофункциональной перегрузки, относящейся к решения поставленной задачки и только делают вспомогательные функции (к примеру: выбор изображения для установки его в качестве фонового, либо сохранение текущего фонового изображения в случайном графическом файле). Все функции возложены на три потока, соответственных трем главным вкладкам. В функции потоков заходит чтение характеристик реестра когда вкладка на не неактивных подчиненных вкладках и запись характеристик активной вкладки. При всем этом употребляется та изюминка API-функций Windows, что характеристики считанные несколько раз из реестра не удаляются из памяти, а некое время остаются в ней, что дозволяет не волноваться о быстродействии потоков повсевременно следящих за переменами характеристик реестра. Не считая этого, тот факт что потоки повсевременно записывают значения характеристик активной вкладки в реестр, тоже не должен никого смущать, т.к. характеристики совпадающие со значениями в реестре не записываются в него повторно, благодаря тому что они сравниваются с теми что хранятся в памяти и лишь в том случае если не равны им записываются в реестр на физическом уровне. память же обновляется при изменении соответственных характеристик реестра автоматом.

Ниже приведена диаграмма использования потоками модуля Unit1 функций модуля MiniReg.


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

1. Функция RegSetString:

a. Заголовок: function RegSetString(RootKey: HKEY; Name: String;

Value: String): boolean;

b. Предназначение: установка ключа Name ветки корня RootKey текстового значения Value и возврат true, в случае фуррора.

c. Входные характеристики: RootKey, Name, Value

d. Выходные характеристики:-

2. Функция RegSetMultiString:

a. Заголовок: function RegSetMultiString (RootKey: HKEY; Name: String;

Value: String): boolean;

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

c. Входные характеристики: RootKey, Name, Value

d. Выходные характеристики:-

3. Функция RegSetDWORD:

a. Заголовок: function RegSetDWORD(RootKey: HKEY; Name: String;

Value: Cardinal): boolean;

b. Предназначение: установка ключа Name ветки корня RootKey целочисленного значения Value, и возврат true, в случае фуррора.

c. Входные характеристики: RootKey, Name, Value

d. Выходные характеристики:-

4. Функция RegSetBinary:

a. Заголовок: function RegSetDWORD(RootKey: HKEY; Name: String;

Value: Cardinal): boolean;

b. Предназначение: установка ключа Name ветки корня RootKey целочисленного значения Value, и возврат true, в случае фуррора.

c. Входные характеристики: RootKey, Name, Value

d. Выходные характеристики:-

5. Функция RegSetBinary:

a. Заголовок: function RegSetBinary (RootKey: HKEY; Name: String;

Value: Array of Byte): boolean;

b. Предназначение: установка ключа Name ветки корня RootKeyбинарного значения Value, и возврат true, в случае фуррора.

c. Входные характеристики: RootKey, Name, Value

d. Выходные характеристики:-

6. Функция RegGetString:

a. Заголовок: function RegGetString (RootKey: HKEY; Name: String;

var Value: Cardinal): boolean;

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

c. Входные характеристики: RootKey, Name

d. Выходные характеристики:Value

7. Функция RegGetMultiString:

a. Заголовок: function RegGetMultiString (RootKey: HKEY; Name: String;

var Value: Cardinal): boolean;

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

c. Входные характеристики: RootKey, Name

d. Выходные характеристики:Value

8. Функция RegGetDWORD:

a. Заголовок: function RegGetDWORD (RootKey: HKEY; Name: String;

varValue: Cardinal): boolean;

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

c. Входные характеристики: RootKey, Name

d. Выходные характеристики:Value

9. Функция RegGetBinary:

a. Заголовок: function RegGetBinary (RootKey: HKEY; Name: String;

var Value: String): boolean;

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

c. Входные характеристики: RootKey, Name

d. Выходные характеристики:Value

10. Функция RegGetValueType:

a. Заголовок: function RegGetValueType (RootKey: HKEY; Name: String; var Value: Cardinal): boolean;

b. Предназначение: Получение типа ключа Name ветки корня RootKey в Value, и возврат true, в случае его существования.

c. Входные характеристики: RootKey, Name

d. Выходные характеристики:Value

11. Функция :

a. Заголовок: function RegSetDWORD(RootKey: HKEY; Name: String;

Value: Cardinal): boolean;

b. Предназначение: установка ключа Name ветки корня RootKeyцелочисленного значения Value, и возврат true, в случае фуррора.

c. Входные характеристики: RootKey, Name, Value

d. Выходные характеристики:-

12. Функция RegKeyExists:

a. Заголовок: function RegKeyExists (RootKey: HKEY; Name: String):

boolean;

b. Предназначение: Проверка сущуствования ключа Name ветки корня RootKeyи возврат рузультата.

c. Входные характеристики: RootKey, Name

d. Выходные характеристики:-

13. Функция RegDelValue:

a. Заголовок: function RegDelValue (RootKey: HKEY; Name: String):

boolean;

b. Предназначение: Удаление ключа Name ветки корня RootKeyи возврат результата выполнения операции.

c. Входные характеристики: RootKey, Name

d. Выходные характеристики:-

14. Функция RegAddKey:

a. Заголовок: function RegAddKey (RootKey: HKEY; Name: String):

boolean;

b. Предназначение: Создание новейшего ключа Name ветки корня RootKeyи возврат результата выполнения операции.

c. Входные характеристики: RootKey, Name

d. Выходные характеристики:-

15. Функция RegDelKey:

a. Заголовок: function RegDelKey (RootKey: HKEY; Name: String):

boolean;

b. Предназначение: Удаление улюча Name ветки корня RootKey и возврат результата выполнения операции.

c. Входные характеристики: RootKey, Name

d. Выходные характеристики:-

16. Функция RegConnect:

a. Заголовок: function RegConnect (MachineName: String;

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

b. Предназначение: Подключение к реестру машинки с именованием MachineName, и чтение с неё корня RootKey в RemoteKey, с возвратам флага удачного выполнения операции.

c. Входныепараметры: MachineName, RootKey

d. Выходные характеристики:RemoteKey

17. Функция RegDisconnect:

a. Заголовок: function RegDisconnect(RemoteKey: HKEY): boolean;

b. Предназначение: Отключение от удаленного корневого ключа (освобождение удаленного ключа RemoteKey), и возврат флага удачного выполнения операции.

c. Входные характеристики: RemoteKey

d. Выходные характеристики:-

18. Функция RegEnumKeys:

a. Заголовок: function RegEnumKeys (RootKey: HKEY; Name: String;

var KeyList: String): boolean;

b. Предназначение: Получение перечня ключей ветки Name корня RootKey в KeyList, и возвращение true при отсутствии ошибок выполнения операции.

c. Входные характеристики: RootKey, Name

d. Выходные характеристики: KeyList

19. Функция RegEnumValues:

a. Заголовок: function RegEnumValues (RootKey: HKEY; Name: String;

var ValueList: String): boolean;

b. Предназначение: Получение перечня значений ключей ветки Name корня RootKey в ValueList, и возвращение true при отсутствии ошибок выполнения операции.

c. Входные характеристики: RootKey, Name

d. Выходные характеристики: ValueList


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

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

a. Заголовок: procedureExecute1;

b. Предназначение: Функция получаетзаписывает характеристики из реестра и заноситсчитывает значений соответственных флагов вкладки ‘Система’.

c. Входные характеристики: —

d. Выходные характеристики: —

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

a. Заголовок: procedure Execute2;

b. Предназначение: Функция получаетзаписывает характеристики из реестра и заноситсчитывает значений соответственных флагов вкладки ‘Защита’.

c. Входные характеристики: —

d. Выходные характеристики: —

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

a. Заголовок: procedure Execute3;

b. Предназначение: Функция получаетзаписывает характеристики из реестра и заноситсчитывает значений соответственных флагов вкладки ‘Рабочий стол’.

c. Входные характеристики: —

d. Выходные характеристики: —


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 Главный модуль программки (
Unit1)

unit Unit1;

interface

uses

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

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

Buttons, ExtDlgs;

const

ClearPageFileAtShutdown: String =

‘SYSTEMCurrentControlSetControlSession ‘

+’ManagerMemory ManagementClearPageFileAtShutdown’;

DebugDrWatsonAuto: String =

‘SOFTWAREMicrosoftWindows NTCurrentVersion’

+’AeDebugAuto’;

AlwaysUnloadDLL: String =

‘SOFTWAREMicrosoftWindowsCurrentVersion’

+’ExplorerAlwaysUnloadDLL’;

NoInstrumentation: String =

‘SoftwareMicrosoftWindowsCurrentVersion’

+’PoliciesExplorerNoInstrumentation’;

DefaultSeparateVDM: String =

‘SYSTEMCurrentControlSetControlWOW’

+’DefaultSeparateVDM’;

DoReport: String =

‘SOFTWAREMicrosoftPCHealthErrorReportingDoReport’;

ShowUI: String =

‘SOFTWAREMicrosoftPCHealthErrorReportingShowUI’;

PromptPasswordOnResume: String =

‘SoftwarePoliciesMicrosoftWindows’

+’SystemPowerPromptPasswordOnResume’;

BootOptimizeFunction: String =

‘SOFTWAREMicrosoftDfrgBootOptimizeFunction’

+’Enable’;

ConsoleQuickEdit: String = ‘ConsoleQuickEdit’;

ShutdownReasonUI: String =

‘SoftwarePoliciesMicrosoftWindows NT’

+’ReliabilityShutdownReasonUI’;

NoLowDiskSpaceChecks: String =

‘SoftwareMicrosoftWindowsCurrentVersion’

+’PoliciesExplorerNoLowDiskSpaceChecks’;

MinAnimate: String =

‘Control PanelDesktopWindowMetricsMinAnimate’;

SeparateProcess: String =

‘SoftwareMicrosoftWindowsCurrentVersion’

+’ExplorerAdvancedSeparateProcess’;

AutoRestartShell: String =

‘SOFTWAREMicrosoftWindows NTCurrentVersion’

+’WinlogonAutoRestartShell’;

IsShortcut: String = ‘SOFTWAREClasseslnkfileIsShortcut’;

LinkImg: String =

‘SoftwareMicrosoftWindowsCurrentVersionExplorerlink’;

NoSaveSettings: String =

‘SoftwareMicrosoftWindowsCurrentVersion’

+’PoliciesExplorerNoSaveSettings’;

DragFullWindows: String =

‘Control PanelDesktopDragFullWindows’;

EnableBalloonTips: String = ‘SoftwareMicrosoftWindowsCurrentVersion’

+’ExplorerAdvancedEnableBalloonTips’;

TaskbarGlomming: String =

‘SoftwareMicrosoftWindowsCurrentVersion’

+’ExplorerAdvancedTaskbarGlomming’;

TaskbarGroupSize: String =

‘SoftwareMicrosoftWindowsCurrentVersion’

+’ExplorerAdvancedTaskbarGroupSize’;

NoRecentDocsHistory: String =

‘SoftwareMicrosoftWindowsCurrentVersion’

+’PoliciesExplorerNoRecentDocsHistory’;

Start_AutoCascade: String =

‘SoftwareMicrosoftWindowsCurrentVersion’

+’ExplorerAdvancedStart_AutoCascade’;

NoCommonGroups: String =

‘SoftwareMicrosoftWindowsCurrentVersion’

+’PoliciesExplorerNoCommonGroups’;

StartMenuScrollPrograms: String =

‘SoftwareMicrosoftWindows’

+’CurrentVersionExplorerAdvancedStartMenuScrollPrograms’;

IntelliMenus: String = ‘SoftwareMicrosoftWindows’

+’CurrentVersionExplorerAdvancedIntelliMenus’;

Start_LargeIcons: String = ‘SoftwareMicrosoftWindows’

+’CurrentVersionExplorerAdvancedStart_LargeIcons’;

StartMenuChange: String = ‘SoftwareMicrosoftWindows’

+’CurrentVersionExplorerAdvancedStartMenuChange’;

CodePage: String =

‘SYSTEMCurrentControlSetControlNlsCodePage’;

DosKeybCodes: String =

‘SYSTEMCurrentControlSetControlKeyboard Layout’

+’DosKeybCodes