Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Metodychka-lab_OS.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
1.35 Mб
Скачать

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

Для того, щоб перелічити значення деякого відкритого ключа в реєстрі, використовується функція 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,\ ; Відкрити дескриптор ключа, див. програму А

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

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

    3. 0, \

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

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

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

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

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

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

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

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

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

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

    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 є також нульовим.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]