Учебная работа. Курсовая работа: Настройка 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