Перелічення списку значень для заданого ключа реєстру

Для того, щоб перелічити значення деякого відкритого ключа в реєстрі, використовується функція RegEnumValue. Ця функція копіює одне значення і блок даних кожного разу, коли викликається.

Приклад виклику функції RegEnumValue – Програма Г

Г1..386

Г2..model flat, stdcall

Г3. include c:\masm32\include\windows.inc

Г4. include c:\masm32\include\kernel32.inc

Г5. include c:\masm32\include\advapi32.inc

Г6. include c:\masm32\include\user32.inc

Г7. include c:\masm32\include\masm32.inc

Г8. includelib c:\masm32\lib\kernel32.lib

Г9. includelib c:\masm32\lib\user32.lib

Г10. includelib c:\masm32\lib\masm32.lib

Г11. includelib c:\masm32\lib\advapi32.lib

Г12..data

Г13. id  dd 0     ; Номер того значення з якого отримується
                  ; інформація (0 – перший, 1 – другий, і т.д.)

Г14. Subkey db "Control Panel\International",0; Назва ключа, який відкривається

Г15. hkey  dd?     ; Змінна, яка отримає дескриптор ключа

Г16. name_v db 255 dup (0); Буфер для збереження імені перелічуваного значення

Г17. name_l dd 255   ; Змінна, яка визначає довжину буфера в Г16

Г18. val_v db 255 dup (0); Буфер для збереження даних з перелічуваного значення

Г19. val_l dd 255   ; Змінна, яка визначає довжину буфера в Г18

Г20. tab  db 9,0   ; 9 – код керуючого символу “табуляція”, 0 –заверш.стр.

Г21..code

Г22. start:

Г23. invoke RegOpenKeyEx,\; Відкрити дескриптор ключа, див. програму А

Г23.1. HKEY_CURRENT_USER, \; Точка в реєстрі з якої відкривається ключ

Г23.2. addr Subkey, \      ; Див. Г14

Г23.3. 0, \               

Г23.4. KEY_EXECUTE, \      ; Доступ до відкритого ключа на зчитування

Г23.5. addr hkey     ; Помістити дескриптор відкритого ключа в Г15

Г24. invoke RegEnumValue, \; Перелічити одне з значень, які містяться в ключі

Г24.1. hkey, \       ; Дескриптор відкритого ключа

Г24.2. id, \         ; Номер значення, див. Г13

Г24.3. addr name_v, \      ; Вказує на буфер Г16

Г24.4. addr name_l, \      ; Вказує на змінну Г17

Г24.5. 0, \          ; Зарезервований і мусить бути 0

Г24.6. 0, \          ; Тип значення нас не цікавить

Г24.7. addr val_v, \ ; Вказує на буфер Г18

Г24.8. addr val_l    ; Вказує на змінну Г19

Г25. invoke StdOut, addr name_v; Друкує назву значення

Г26. invoke StdOut, addr tab; Друкує табуляцію

Г27. invoke StdOut, addr val_v; Друкує вміст значення

Г28. invoke ExitProcess,0

Г29. end start

Програма Г відкриває ключ реєстру “HKEY_CURRENT_USER\Control Panel\International” (Г23) і отримує назву і вміст першого значення в цьому ключі (Г24). Виводить на екран назву і вміст значення розділені табуляцією (Г25-Г27).

Опишемо деякі аргументи функції RegEnumValue:

Г24.1 – дескриптор відкритого ключа з якого береться значення.

Г24.2 – номер значення, з якого отримується інформація. У програмі Г запитується лише перше значення. Для виводу всіх наступних значень цей параметр слід збільшувати на одиницю в кожному наступному виклику RegEnumValue поки вона не поверне в ЕАХ значення ERROR_NO_MORE_ITEMS.

Оскільки значення є несортованими, будь-яке нове значення може отримати випадковий індекс. Це означає, що функція може повертати значення в будь-якому порядку.

Г24.3 вказує на буфер Г16, який отримає ім'я значення.

Г24.4 вказує на змінну Г17, яка визначає розмір в байтах буфера Г16. Цей розмір повинен включати завершувальний нуль в кінці стрічки. Після виконання функція RegEnumValue записує в змінну Г17 кількість символів збережених у буфері Г16.

Г24.6 – містить нуль, бо тип не потрібен в даному прикладі. Але Г24.6 може вказувати на змінну, яка приймає код типу для значення. Повний список кодів подано вище в описі аргументу В21.4.

Г24.7 вказує на буфер Г18, який отримує інформаційний вміст значення. Цей параметр може бути нульовим, коли інформація не потрібна.

Г24.8 вказує на змінну Г19, яка містить розмір буфера Г18 в байтах. Коли функція RegEnumValue завершує виконання, ця змінна отримує кількість байт, які збережено в буфері Г18.

Г24.8 може приймати нуль, тільки в тому випадку, коли Г24.7 є також нульовим.

 


Виявлення змін в гілці реєстру

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

Синхронний виклик значно простіший за асинхронний: функція не завершить свого виконання поки не відбудеться зміна. Синхронний виклик здійснюється так:

invoke RegNotifyChangeKeyValue, hkey, bs, \

REG_NOTIFY_CHANGE_LAST_SET, 0, FALSE

де hkey – дескриптор ключа (А14), відкритий за допомогою функції RegOpenKeyEx (A17) з режимом доступу (A17.4), який дорівнює KEY_NOTIFY.

bs – ознака включення дерева всіх підключів при очікуванні зміни. Може приймати значення TRUE (включати) або FALSE (не включати).

REG_NOTIFY_CHANGE_LAST_SET – очікування змін в значеннях ключа. Змінами вважаються додавання або знищення значень або зміна існуючого значення. Є ще інші режими очікування з якими можна ознайомитися в документації (файл допомоги WIN32.HLP, який знаходиться в мережі ІКІТ за адресою
\\nt-backup\Predmetu\SPZ\HELP_WIN32APIENG\).

Останні два параметри 0, FALSE необхідні для синхронного виклику.

Асинхронний виклик здійснюється з такими ж значеннями як для синхронного виклику крім двох останніх значень (0 і FALSE), які треба замінити на hEvent (дескриптор об’єкту події, створений функцією CreateEvent) і TRUE. Потім асинхронний виклик вимагає виклику очікуючої функції (див. лаб. 5).

 



Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: