Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ «БистСмноС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π² срСдС WindowsΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 27

Автор ДТонсон Π₯Π°Ρ€Ρ‚

lpClass β€” ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° строку, ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‰ΡƒΡŽ имя класса, ΠΈΠ»ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ, Ρ€Π°Π·Π΄Π΅Π»Π°, ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰Π΅Π΅ Π΄Π°Π½Π½Ρ‹Π΅, прСдставляСмыС Ρ€Π°Π·Π΄Π΅Π»ΠΎΠΌ. Одними ΠΈΠ· многочислСнных Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΡΠ²Π»ΡΡŽΡ‚ΡΡ REG_SZ (строка, Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰Π°ΡΡΡ Π½ΡƒΠ»Π΅Π²Ρ‹ΠΌ символом) ΠΈ REG_DWORD (Π΄Π²ΠΎΠΉΠ½ΠΎΠ΅ слово).

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ dwOptions ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 0 ΠΈΠ»ΠΈ ΠΎΠ΄Π½ΠΎ ΠΈΠ· Π΄Π²ΡƒΡ… Π²Π·Π°ΠΈΠΌΠΎΠΈΡΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰ΠΈΡ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ β€” REG_OPTION_VOLATILE ΠΈΠ»ΠΈ REG_OPTION_NON_VOLATILE. ΠŸΠΎΡΡ‚ΠΎΡΠ½Π½ΠΎ хранимая (nonvolatile) информация систСмного рССстра сохраняСтся Π² Ρ„Π°ΠΉΠ»Π΅ Π½Π° дискС ΠΈ Π½Π΅ тСряСтся послС пСрСзапуска систСмы. ΠŸΡ€ΠΈ этом Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ (volatile) Ρ€Π°Π·Π΄Π΅Π»Ρ‹ систСмного рССстра, хранящиСся Π² ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ памяти, Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ восстановлСны. 

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ samDesired ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΎΡ‚ ΠΆΠ΅ смысл, Ρ‡Ρ‚ΠΎ ΠΈ Π² случаС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ RegOpenKeyEx.

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ lpSecurityAttributes ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ NULL ΠΈΠ»ΠΈ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ Π·Π°Ρ‰ΠΈΡ‚Ρ‹. ΠžΠΏΡ†ΠΈΠΈ ΠΏΡ€Π°Π² доступа ΠΊ Ρ€Π°Π·Π΄Π΅Π»Ρƒ ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹Π±ΠΈΡ€Π°Ρ‚ΡŒΡΡ ΠΈΠ· Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ Π½Π°Π±ΠΎΡ€Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, Ρ‡Ρ‚ΠΎ ΠΈ Π² случаС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° samDesired.

lpdwDisposition β€” ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ Ρ‚ΠΈΠΏΠ° DWORD, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ ΠΎ Ρ‚ΠΎΠΌ, сущСствовал Π»ΠΈ Ρ€Π°Π·Π΄Π΅Π» Ρ€Π°Π½Π΅Π΅ (REG_OPENED_EXISTING_KEY) ΠΈΠ»ΠΈ ΠΎΠ½ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ создаСтся (REG_CREATED_NEW_KEY).

Для удалСния Ρ€Π°Π·Π΄Π΅Π»Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ функция RegDeleteKey. Двумя Π΅Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ дСскриптор ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎΠ³ΠΎ Ρ€Π°Π·Π΄Π΅Π»Π° ΠΈ имя ΠΏΠΎΠ΄Ρ€Π°Π·Π΄Π΅Π»Π°.

Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ значСниями

Для пСрСчислСния Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎΠ³ΠΎ Ρ€Π°Π·Π΄Π΅Π»Π° рССстра ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ функция RegEnumValue. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° dwIndex Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒΡΡ Ρ€Π°Π²Π½Ρ‹ΠΌ 0 ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠΌ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Ρ‚ΡŒΡΡ Π½Π° Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ Π²Ρ‹Π·ΠΎΠ²Π΅. ПослС Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚Π΅ строку, ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‰ΡƒΡŽ имя пСрСчисляСмого ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°, Π° Ρ‚Π°ΠΊΠΆΠ΅ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π΄Π°Π½Π½Ρ‹Ρ…. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ пСрСчисляСмого ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ΠΈ Π΅Π³ΠΎ Ρ‚ΠΈΠΏ. 

LONG RegEnumValue(HKEY hKey, DWORD dwIndex, LPTSTR lpValueName, LPDWORD lpcbValueName, LPDWORD lpReserved, LPDWORD lpType, LPBYTE lpData, LPDWORD lpcbData) 

ЀактичСскоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° возвращаСтся Π² Π±ΡƒΡ„Π΅Ρ€Π΅, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ lpData. Π Π°Π·ΠΌΠ΅Ρ€ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° содСрТится Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ lpcbData. Π’ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ…, содСрТащийся Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ lpType, ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ самым Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌ, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ REG_BINARY, REG_DWORD, REG_SZ (строка) ΠΈ REG_EXPAND_SZ (Ρ€Π°ΡΡˆΠΈΡ€ΡΠ΅ΠΌΠ°Ρ строка с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π·Π°ΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ окруТСния). ΠŸΠΎΠ»Π½Ρ‹ΠΉ список Ρ‚ΠΈΠΏΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ… систСмного рССстра ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π² ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ справочной систСмС.

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, всС Π»ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ пСрСчислСны, слСдуСт ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. ПослС ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ³ΠΎ нахоТдСния Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ΠΎΠ½ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π²Π½Ρ‹ΠΌ ERROR_SUCCESS.

Ѐункция RegQueryValueEx Π²Π΅Π΄Π΅Ρ‚ сСбя Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ указания ΠΈΠΌΠ΅Π½ΠΈ пСрСчисляСмого ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°, Π° Π½Π΅ Π΅Π³ΠΎ индСкса. Π­Ρ‚Ρƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² Ρ‚Π΅Ρ… случаях, ΠΊΠΎΠ³Π΄Π° извСстны ΠΈΠΌΠ΅Π½Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ². Если ΠΆΠ΅ ΠΈΠΌΠ΅Π½Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² нСизвСстны, слСдуСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ RegEnumValueEx.

Для установки значСния ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Π² ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅ слуТит функция RegSetValueEx, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ имя ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°, Ρ‚ΠΈΠΏ значСния ΠΈ фактичСскиС Π΄Π°Π½Π½Ρ‹Π΅, ΠΎΠ±Ρ€Π°Π·ΡƒΡŽΡ‰ΠΈΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅.

LONG RegSetValueEx(HKEY hKey, LPCTSTR lpValueName, DWORD Reserved, DWORD dwType, CONST BYTE * lpData, CONST cbData) 

НаконСц, для удалСния ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ функция RegDeleteValue.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€: Π²Ρ‹Π²ΠΎΠ΄ списка Ρ€Π°Π·Π΄Π΅Π»ΠΎΠ² ΠΈ содСрТимого рССстра

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° lsReq (ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° 3.4), являСтся Π²ΠΈΠ΄ΠΎΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ lsW (ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° 3.2, прСдназначСнная для Π²Ρ‹Π²ΠΎΠ΄Π° списка Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ²) ΠΈ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ Π½Π΅ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΈ ΠΈ Ρ„Π°ΠΉΠ»Ρ‹, Π° Ρ€Π°Π·Π΄Π΅Π»Ρ‹ ΠΈ ΠΏΠ°Ρ€Ρ‹ "имя-Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅" систСмного рССстра.

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° 3.4. lsReq: Π²Ρ‹Π²ΠΎΠ΄ списка Ρ€Π°Π·Π΄Π΅Π»ΠΎΠ² ΠΈ содСрТимого систСмного рССстра

/* Π“Π»Π°Π²Π° 3. lsReg: Команда Π²Ρ‹Π²ΠΎΠ΄Π° содСрТимого рССстра. Адаптированная вСрсия ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ 3.2. */

/* lsReg [ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹] ΠΏΠΎΠ΄Ρ€Π°Π·Π΄Π΅Π» */

#include "EvryThng.h"

BOOL TraverseRegistry(HKEY, LPTSTR, LPTSTR, LPBOOL);

BOOL DisplayPair(LPTSTR, DWORD, LPBYTE, DWORD, LPBOOL);

BOOL DisplaySubKey (LPTSTR, LPTSTR, PFILETIME, LPBOOL);


int _tmain(int argc, LPTSTR argv[]) {

 BOOL Flags[2], ok = TRUE;

 TCHAR KeyName[MAX_PATH + 1];

 LPTSTR pScan;

 DWORD i, KeyIndex;

 HKEY hKey, hNextKey;

 /* Π’Π°Π±Π»ΠΈΡ†Π° ΠΏΡ€Π΅Π΄ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… ΠΈΠΌΠ΅Π½ ΠΈ дСскрипторов Ρ€Π°Π·Π΄Π΅Π»ΠΎΠ². */

 LPTSTR PreDefKeyNames[] = {

  _Π’("HKEY_LOCAL_MACHINE"), _T("HKEY_CLASSES_ROOT"),

  _Π’("HKEY CURRENT USER"), _T ("HKEY CURRENT CONFIG"), NULL

 };

 HKEY PreDefKeys[] = {

  HKEY_LOCAL_MACHINE, HKEY_CLASSES_ROOT, HKEY_CURRENT_USER, HKEY_CURRENT_CONFIG

 };

 KeyIndex = Options(argc, argv, _T("Rl"), &Flags[0], &Flags[1], NULL);

 /* "Π Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒ" шаблон поиска Π½Π° "Ρ€Π°Π·Π΄Π΅Π»" ΠΈ "ΠΏΠΎΠ΄Ρ€Π°Π·Π΄Π΅Π»". */

 /* Π’ΠΎΡΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ€Π°Π·Π΄Π΅Π». */

 pScan = argv[KeyIndex];

 for (i = 0; *pScan != _T('\\') && *pScan != _T('\0'); pScan++, i++) KeyName [i] = *pScan;

 KeyName[i] = _T('\0');

 if (*pScan == _T('\\')) pScan++;

 /* ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€Π΅Π΄ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ имя Ρ€Π°Π·Π΄Π΅Π»Π° Π² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ HKEY.*/

 for (i = 0; PreDefKeyNames [i] != NULL && _tcscmp(PreDefKeyNames[i], KeyName) != 0; i++);

 hKey = PreDefKeys[i];

 RegOpenKeyEx(hKey, pScan, 0, KEY_READ, &hNextKey);

 hKey = hNextKey;

 ok = TraverseRegistry(hKey, argv[KeyIndex], NULL, Flags);

 return ok ? 0 : 1;

}


BOOL TraverseRegistry(HKEY hKey, LPTSTR FullKeyName, LPTSTR SubKey, LPBOOL Flags)

/*Π‘ΠΎΠ²Π΅Ρ€ΡˆΠΈΡ‚ΡŒ ΠΎΠ±Ρ…ΠΎΠ΄ Ρ€Π°Π·Π΄Π΅Π»ΠΎΠ² ΠΈ ΠΏΠΎΠ΄Ρ€Π°Π·Π΄Π΅Π»ΠΎΠ² рССстра, Ссли Π·Π°Π΄Π°Π½ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ –R.*/

{

 HKEY hSubK;

 BOOL Recursive = Flags[0];

 LONG Result;

 DWORD ValType, Index, NumSubKs, SubKNameLen, ValNameLen, ValLen;

 DWORD MaxSubKLen, NumVals, MaxValNameLen, MaxValLen;

 FILETIME LastWriteTime;

 LPTSTR SubKName, ValName;

 LPBYTE Val;

 TCHAR FullSubKName[MAX_PATH + 1];

 /* ΠžΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ дСскриптор Ρ€Π°Π·Π΄Π΅Π»Π°. */

 RegOpenKeyEx(hKey, SubKey, 0, KEY_READ, &hSubK);

 /* ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ€Π°Π·Π΄Π΅Π»Π° ΠΈ Ρ€Π°ΡΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ. */

 RegQueryInfoKey(hSubK, NULL, NULL, NULL, &NumSubKs, &MaxSubKLen, NULL, &NumVals, &MaxValNameLen, &MaxValLen, NULL, &LastWriteTime);

 SubKName = malloc (MaxSubKLen+1); /* Π Π°Π·ΠΌΠ΅Ρ€ Π±Π΅Π· ΡƒΡ‡Π΅Ρ‚Π° Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰Π΅Π³ΠΎ Π½ΡƒΠ»Π΅Π²ΠΎΠ³ΠΎ символа. */

 ValName = malloc(MaxValNameLen+1); /* Π£Ρ‡Π΅ΡΡ‚ΡŒ Π½ΡƒΠ»Π΅Π²ΠΎΠΉ символ. */

 Val = malloc(MaxValLen); /* Π Π°Π·ΠΌΠ΅Ρ€ Π² Π±Π°ΠΉΡ‚Π°Ρ…. */

 /* ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΡ€ΠΎΡ…ΠΎΠ΄: ΠΏΠ°Ρ€Ρ‹ "имя-Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅". */

 for (Index = 0; Index < NumVals; Index++) {

  ValNameLen = MaxValNameLen + 1; /* УстанавливаСтся ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·! */

  ValLen = MaxValLen + 1;

  RegEnumValue(hSubK, Index, ValName, &ValNameLen, NULL, &ValType, Val, &ValLen);

  DisplayPair(ValName, ValType, Val, ValLen, Flags);

 }

 /* Π’Ρ‚ΠΎΡ€ΠΎΠΉ ΠΏΡ€ΠΎΡ…ΠΎΠ΄: ΠΏΠΎΠ΄Ρ€Π°Π·Π΄Π΅Π»Ρ‹. */

 for (Index = 0; Index < NumSubKs; Index++) {

  SubKNameLen = MaxSubKLen + 1;

  RegEnumKeyEx(hSubK, Index, SubKName, &SubKNameLen, NULL, NULL, NULL, &LastWriteTime);

  DisplaySubKey(FullKName, SubKName, &LastWriteTime, Flags);

  if (Recursive) {

   _stprintf(FullSubKName, _T("%s\\%s"), FullKName, SubKName);

   TraverseRegistry(hSubK, FullSubKName, SubKName, Flags);

  }

 }

 _tprintf(_T("\n"));

 free(SubKName);

 free(ValName);

 free(Val);

 RegCloseKey(hSubK);

 return TRUE;

}


BOOL DisplayPair(LPTSTR ValueName, DWORD ValueType, LPBYTE Value, DWORD ValueLen, LPBOOL Flags)

/* Ѐункция, ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°ΡŽΡ‰Π°Ρ ΠΏΠ°Ρ€Ρ‹ "имя-Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅". */

{

 LPBYTE pV = Value;

 DWORD i;

 _tprintf(_T("\nValue: %s = "), ValueName);

 switch (ValueType) {

 case REG_FULL_RESOURCE_DESCRIPTOR: /* 9: описаниС оборудования. */

 case REG_BINARY: /* 3: Π›ΡŽΠ±Ρ‹Π΅ Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅. */

  for (i = 0; i < ValueLen; i++, pV++) _tprintf (_T (" %x"), *pV);

  break;

 case REG_DWORD: /* 4: 32-Π±ΠΈΡ‚ΠΎΠ²ΠΎΠ΅ число. */

  _tprintf(_T ("%x"), (DWORD)*Value);

  break;

 case REG_MULTI SZ: /*7: массив строк, Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰ΠΈΡ…ΡΡ Π½ΡƒΠ»Π΅Π²Ρ‹ΠΌ символом.*/

 case REG_SZ: /* 1: строка, Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰Π°ΡΡΡ Π½ΡƒΠ»Π΅Π²Ρ‹ΠΌ символом. */

  _tprintf(_T("%s"), (LPTSTR)Value);

  break;

 /* … НСсколько Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ‚ΠΈΠΏΠΎΠ² … */

 }

 return TRUE;

}


BOOL DisplaySubKey(LPTSTR KeyName, LPTSTR SubKeyName, PFILETIME pLastWrite, LPBOOL Flags) {

 BOOL Long = Flags[1];

 SYSTEMTIME SysLastWrite;

 _tprintf(_T("\nSubkey: %s"), KeyName);

 if (_tcslen(SubKeyName) > 0) _tprintf (_T ("\\%s "), SubKeyName);

 if (Long) {

  FileTimeToSystemTime(pLastWrite, &SysLastWrite);

  _tprintf(_T("%02d/%02d/%04d %02d:%02d:%02d"), SysLastWrite.wMonth, SysLastWrite.wDay, SysLastWrite.wYear, SysLastWrite.wHour, SysLastWrite.wMinute, SysLastWrite.wSecond);

 }

 return TRUE;

}

РСзюмС

Π’ Π³Π»Π°Π²Π°Ρ… 2 ΠΈ 3 описаны всС Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ Π²Π°ΠΆΠ½Ρ‹Π΅ Π±Π°Π·ΠΎΠ²Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ, ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°ΠΌΠΈ ΠΈ ΠΊΠΎΠ½ΡΠΎΠ»ΡŒΠ½Ρ‹ΠΌ Π²Π²ΠΎΠ΄ΠΎΠΌ/Π²Ρ‹Π²ΠΎΠ΄ΠΎΠΌ. ИспользованиС этих Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ для построСния Ρ‚ΠΈΠΏΠΈΡ‡Π½Ρ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Π»ΠΈ многочислСнныС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹. Как ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ послСдний ΠΈΠ· ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ², ΠΌΠ΅ΠΆΠ΄Ρƒ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ систСмным рССстром ΠΈ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмой имССтся ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΠ±Ρ‰Π΅Π³ΠΎ.

Π’ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Π³Π»Π°Π²Π°Ρ… Π±ΡƒΠ΄ΡƒΡ‚ рассмотрСны Ρ‚Π°ΠΊΠΈΠ΅ ΡƒΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½ΡΡ‚Π²ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π°, ΠΊΠ°ΠΊ асинхронныС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»ΠΎΠ². Π­Ρ‚ΠΈΡ… срСдств Π±ΡƒΠ΄Π΅Ρ‚ достаточно для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ воспроизвСсти Π² Windows ΠΏΠΎΡ‡Ρ‚ΠΈ любой ΠΈΠ· ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… Π²ΠΈΠ΄ΠΎΠ² ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ², доступных ΠΏΡ€ΠΈ использовании UNIX ΠΈΠ»ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π‘.