'*************************************** ' by Davide Chiappetta '*************************************** Public Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (ByRef Destination As Any, ByRef Source As Any, ByVal length As Long) Public Type FILETIME dwLowDateTime As Long dwHighDateTime As Long End Type Public Declare Function RegEnumValue Lib "advapi32.dll" _ Alias "RegEnumValueA" _ (ByVal hKey As Long, _ ByVal dwIndex As Long, _ ByVal lpValueName As String, _ lpcbValueName As Long, _ ByVal lpReserved As Long, _ lpType As Long, _ lpData As Any, _ lpcbData As Long) As Long Public Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal ulOptions As Long, ByVal samDesired As Long, phkResult As Long) As Long Public Declare Function RegEnumKey Lib "advapi32.dll" Alias "RegEnumKeyA" (ByVal hKey As Long, ByVal dwIndex As Long, ByVal lpName As String, ByVal cbName As Long) As Long Public Declare Function RegQueryValue Lib "advapi32.dll" Alias "RegQueryValueA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal lpValue As String, lpcbValue As Long) As Long Public Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long Public Declare Function RegDeleteKey Lib "advapi32.dll" Alias "RegDeleteKeyA" (ByVal hKey As Long, ByVal lpSubKey As String) As Long Public Declare Function RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, lpType As Long, lpData As Any, lpcbData As Long) As Long Public Declare Function RegQueryInfoKey Lib "advapi32.dll" Alias "RegQueryInfoKeyA" (ByVal hKey As Long, ByVal lpClass As String, ByRef lpcbClass As Long, ByRef lpReserved As Long, ByRef lpcSubKeys As Long, ByRef lpcbMaxSubKeyLen As Long, ByRef lpcbMaxClassLen As Long, ByRef lpcValues As Long, ByRef lpcbMaxValueNameLen As Long, ByRef lpcbMaxValueLen As Long, ByRef lpcbSecurityDescriptor As Long, ByRef lpftLastWriteTime As FILETIME) As Long Public Declare Function RegEnumKeyEx Lib "advapi32.dll" _ Alias "RegEnumKeyExA" (ByVal hCurKey As Long, _ ByVal dwIndex As Long, ByVal lpName As String, _ lpcbName As Long, ByVal lpReserved As Long, _ ByVal lpClass As String, lpcbClass As Long, _ lpftLastWriteTime As FILETIME) As Long Public Const ERROR_SUCCESS = 0& Public Const HKEY_CLASSES_ROOT = &H80000000 Public Const HKEY_CURRENT_CONFIG = &H80000005 Public Const HKEY_CURRENT_USER = &H80000001 Public Const HKEY_LOCAL_MACHINE = &H80000002 Public Const HKEY_USERS = &H80000003 Public Const STANDARD_RIGHTS_ALL = &H1F0000 Public Const KEY_QUERY_VALUE = &H1 Public Const KEY_SET_VALUE = &H2 Public Const KEY_CREATE_SUB_KEY = &H4 Public Const KEY_ENUMERATE_SUB_KEYS = &H8 Public Const KEY_NOTIFY = &H10 Public Const KEY_CREATE_LINK = &H20 Public Const SYNCHRONIZE = &H100000 Public Const KEY_ALL_ACCESS = _ ((STANDARD_RIGHTS_ALL Or _ KEY_QUERY_VALUE Or _ KEY_SET_VALUE Or _ KEY_CREATE_SUB_KEY Or _ KEY_ENUMERATE_SUB_KEYS Or _ KEY_NOTIFY Or KEY_CREATE_LINK) And _ (Not SYNCHRONIZE)) Public Const KEY_READ = 131097 Public Const ERROR_NO_MORE_ITEMS = 259& Public Const MAX_LENGTH As Long = 2048 Public m_SelectedSection As Long Public Const REG_BINARY = 3 Public Const REG_DWORD = 4 Public Const REG_DWORD_BIG_ENDIAN = 5 Public Const REG_DWORD_LITTLE_ENDIAN = 4 Public Const REG_EXPAND_SZ = 2 Public Const REG_FULL_RESOURCE_DESCRIPTOR = 9 Public Const REG_LINK = 6 Public Const REG_MULTI_SZ = 7 Public Const REG_NONE = 0 Public Const REG_RESOURCE_LIST = 8 Public Const REG_RESOURCE_REQUIREMENTS_LIST = 10 Public Const REG_SZ = 1 Public g_sSubKey As String Public Sub GetRecursiveSubkeys(ByVal hRoot As Long, ByVal key_name As String) Dim hKey As Long Dim subkeys As Collection Dim subkey_num As Long Dim length As Long Dim subkey_name As String ' Open the key. If RegOpenKeyEx(hRoot, key_name, 0&, KEY_ALL_ACCESS, hKey) <> ERROR_SUCCESS Then Exit Sub End If ' Enumerate the subkeys. Set subkeys = New Collection subkey_num = 0 Do ' Enumerate subkeys until we get an error. length = 256 subkey_name = Space$(length) If RegEnumKey(hKey, subkey_num, subkey_name, length) <> ERROR_SUCCESS Then RegCloseKey hKey Exit Do End If subkey_num = subkey_num + 1 subkey_name = Left$(subkey_name, InStr(subkey_name, Chr$(0)) - 1) subkeys.Add subkey_name Loop For subkey_num = 1 To subkeys.Count DoEvents 'trovo ora i valori di ogni sottochiave trovata sopra e le associo per lo show con le varie sottochiavi trovate g_sSubKey = g_sSubKey & key_name & "\" & subkeys(subkey_num) & vbCrLf sValue = GetEnumValue(hRoot, key_name & "\" & subkeys(subkey_num)) If sValue <> "" Then g_sSubKey = g_sSubKey & sValue & vbCrLf End If GetRecursiveSubkeys hRoot, key_name & "\" & subkeys(subkey_num) Next subkey_num RegCloseKey hKey End Sub Public Sub GetKeyAndSubKey(ByVal hRoot As Long, ByVal key_name As String) Dim pos As Integer Dim parent_key_name As String Dim parent_hKey As Long If Right$(key_name, 1) = "\" Then key_name = Left$(key_name, Len(key_name) - 1) 'value first time for root key g_sSubKey = key_name & vbCrLf sValueRoot = GetEnumValue(hRoot, key_name) 'find the value root key If sValueRoot <> "" Then g_sSubKey = g_sSubKey & sValueRoot & vbCrLf End If 'start recursion GetRecursiveSubkeys hRoot, key_name End Sub Function GetEnumValue(ByVal hRoot As Long, ByVal key_name As String) As String Dim res As Long Dim Index As Long Dim ValueString As String Dim ValueStringLen As Long Dim DataType As Long Dim DataString As String Dim DataStringLen As Long Dim hKey As Long Dim sNameAndValue As String If RegOpenKeyEx(hRoot, key_name, 0&, KEY_ALL_ACCESS, hKey) <> ERROR_SUCCESS Then Exit Function Index = 0 Do 'Initialise Strings each time ValueStringLen = MAX_LENGTH ValueString = Space(ValueStringLen) DataType = 0 DataStringLen = MAX_LENGTH DataString = Space(DataStringLen) 'The ByVal Keyword before the DataString is essential res = RegEnumValue(hKey, Index, ValueString, ValueStringLen, 0, DataType, ByVal DataString, DataStringLen) If res = ERROR_NO_MORE_ITEMS Then Exit Do If (res = ERROR_SUCCESS And ValueStringLen > 0) Or (res = ERROR_SUCCESS And DataStringLen > 0) Then Dim ptrWord As Long Select Case DataType Case REG_BINARY sType = "REG_BINARY" sValue = "" For a = 1 To DataStringLen - 1 If a = 20 Then Exit For chars = Mid(DataString, a, 1) If chars < Chr(32) Then chars = "." sValue = sValue & chars Next a Case REG_DWORD sType = "DWORD" CopyMemory ptrWord, ByVal DataString, 4 sValue = "0x" & Hex(ptrWord) Case REG_NONE sType = "REG_NONE" Case REG_LINK sType = "REG_LINK" Case REG_RESOURCE_REQUIREMENTS_LIST sType = "REG_RESOURCE_REQUIREMENTS_LIST" sValue = Mid(DataString, 1, InStr(DataString, Chr(0)) - 1) Case REG_RESOURCE_LIST sType = "REG_RESOURCE_LIST" sValue = Mid(DataString, 1, InStr(DataString, Chr(0)) - 1) Case REG_EXPAND_SZ sType = "REG_EXPAND_SZ" sValue = Mid(DataString, 1, InStr(DataString, Chr(0)) - 1) Case REG_SZ sType = "REG_SZ" sValue = Mid(DataString, 1, InStr(DataString, Chr(0)) - 1) Case REG_MULTI_SZ sType = "REG_MULTI_SZ" sValue = Mid(DataString, 1, InStr(DataString, Chr(0)) - 1) Case Else sType = "UNKNOWN" sValue = Left(DataString, DataStringLen - 1) End Select sName = Left(ValueString, ValueStringLen) If sName = "" Then sName = "(Default)" sNameAndValue = sNameAndValue & vbTab & sName & ": " & vbTab & sValue & vbTab & " [" & sType & "]" & vbCrLf End If Index = Index + 1 Loop While res <> ERROR_NO_MORE_ITEMS RegCloseKey hKey GetEnumValue = sNameAndValue End Function Private Sub DeleteSubkeys(ByVal section As Long, ByVal key_name As String) Dim hKey As Long Dim subkeys As Collection Dim subkey_num As Long Dim length As Long Dim subkey_name As String ' Open the key. If RegOpenKeyEx(section, key_name, _ 0&, KEY_ALL_ACCESS, hKey) <> ERROR_SUCCESS _ Then MsgBox "Error opening key '" & key_name & "'" Exit Sub End If ' Enumerate the subkeys. Set subkeys = New Collection subkey_num = 0 Do ' Enumerate subkeys until we get an error. length = 256 subkey_name = Space$(length) If RegEnumKey(hKey, subkey_num, _ subkey_name, length) _ <> ERROR_SUCCESS Then Exit Do subkey_num = subkey_num + 1 subkey_name = Left$(subkey_name, InStr(subkey_name, Chr$(0)) - 1) subkeys.Add subkey_name Loop ' Recursively delete the subkeys and their subkeys. For subkey_num = 1 To subkeys.Count ' Delete the subkey's subkeys. DeleteSubkeys section, key_name & "\" & subkeys(subkey_num) ' Delete the subkey. RegDeleteKey hKey, subkeys(subkey_num) Next subkey_num ' Close the key. RegCloseKey hKey End Sub ' Delete this key. Public Sub RecursiveDeleteKey(ByVal section As Long, ByVal key_name As String) Dim pos As Integer Dim parent_key_name As String Dim parent_hKey As Long If Right$(key_name, 1) = "\" Then key_name = Left$(key_name, Len(key_name) - 1) ' Delete the key's subkeys. DeleteSubkeys section, key_name ' Get the parent's name. pos = InStrRev(key_name, "\") If pos = 0 Then ' This is a top-level key. ' Delete it from the section. RegDeleteKey section, key_name Else ' This is not a top-level key. ' Find the parent key. parent_key_name = Left$(key_name, pos - 1) key_name = Mid$(key_name, pos + 1) ' Open the parent key. If RegOpenKeyEx(section, _ parent_key_name, _ 0&, KEY_ALL_ACCESS, parent_hKey) <> ERROR_SUCCESS _ Then MsgBox "Error opening parent key" Else ' Delete the key from its parent. RegDeleteKey parent_hKey, key_name ' Close the parent key. RegCloseKey parent_hKey End If End If End Sub '****************************************************** ' main: (create button and textbox etc.) ' example: ' HKEY_CLASSES_ROOT = &H80000000 ' GetKeyAndSubKey &H80000000 , "CLSID" 'es: lista all CLSID and Values ' RecursiveDeleteKey &H80000000 , "Excel.Sheet.5" 'es: delete all Excel.Sheet.5 and Values '******************************************************
Linguaggio macchina,Kernel,Driver,Debugger user-mode/kernel-mode,Sistemi Operativi,Debugger,Visual Basic 6,C,C++,Nasm,Masm,Winsock,Socket,Sniffer; Cinema,Sceneggiature,Script,Movie,Films,Strutture narrative,Melanie Anne Phillips,Syd Field,Robert McKee...
domenica 6 novembre 2011
VB6: Get Keys and SubKeys recursively and get Values
Iscriviti a:
Post (Atom)