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 ΠΈΠ»ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΡΠ½ΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ Π‘.