Jump to content

[Resolvido] [VB.NET] Listar sub-chaves do registro do windows


Muryllo
 Share

Recommended Posts

Boas comunidade, estava ontem fazendo um experimento e nunca tinha feito isso antes da forma que preciso. trata-se de um programa que percorre o registro do windows e verifica todas as sub chaves a partir da sub chave que foi pedida. Não vejo onde está o erro, eu já havia feito algo parecido mas com arquivos (BUSCA RECURSIVA, Recursividade).

Eis o código fonte obrigado a quem puder ajudar 😉

   Public Enum GAV_Registry_Entries
    GAV_HKEY_CLASSES_ROOT = 0
    GAV_HKEY_CURRENT_USER = 1
    GAV_HKEY_LOCAL_MACHINE = 2
    GAV_HKEY_USERS = 3
    GAV_HKEY_CURRENT_CONFIG = 4
   End Enum
'
   Public Shared Function GAV_Return_Registry_Entries(ByVal GAV_HKey As GAV_Registry_Entries, ByVal GAV_Sub_Key As String) As List(Of RegistryKey)
    'Try
    Dim GAV_Current_Entry As New List(Of RegistryKey)
    If GAV_HKey = GAV_Registry_Entries.GAV_HKEY_CLASSES_ROOT Then
	    If GAV_Sub_Key = Nothing Then
		    Return Nothing
	    Else
'
		    Dim GAV_Current_Hive_Key As RegistryKey = Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(GAV_Sub_Key)
		    For Each GAV_Current_Key As String In GAV_Current_Hive_Key.GetSubKeyNames
			    MsgBox(GAV_Sub_Key)
			    For Each GAV_Current_Key_Extern As RegistryKey In GAV_Return_Registry_Entries(GAV_Registry_Entries.GAV_HKEY_CLASSES_ROOT, GAV_Sub_Key & "\" & GAV_Current_Key)
				    GAV_Current_Entry.Add(GAV_Current_Key_Extern)
			    Next
		    Next
		    Return GAV_Current_Entry
	    End If
    Else
	    If GAV_HKey = GAV_Registry_Entries.GAV_HKEY_CURRENT_CONFIG Then
'
	    Else
		    If GAV_HKey = GAV_Registry_Entries.GAV_HKEY_CURRENT_USER Then
'
		    Else
			    If GAV_HKey = GAV_Registry_Entries.GAV_HKEY_LOCAL_MACHINE Then
'
			    Else
				    If GAV_HKey = GAV_Registry_Entries.GAV_HKEY_USERS Then
'
				    End If
			    End If
		    End If
	    End If
    End If
    'Catch NTSTATUS As Exception
    'Return Nothing
    'End Try
   End Function

Ah sim, esqueci de dizer. É um limpador de registro. Nada bixo de 7 cabeças ...

Link to comment
Share on other sites

Não entendo como chegas-te a esse código tão 'feio' na minha opinião...

O teu enum GAV_Registry_Entries é inútil visto que o framework já te dá accesso a esses valores em 'Registry.CurrentUser.OpenS....' etc.

O que pretendes pode ser simplificado em

Dim registryKey As String = "O caminho da chave"
Using key As Microsoft.Win32.RegistryKey = Registry.LocalMachine.OpenSubKey(registryKey) 'LocalMachine ou o que for em cima... pode ser CurrentUser, ClassesRoot etc
For Each subkeyName As [string] In key.GetSubKeyNames()
Console.WriteLine(subkeyName)
Next
End Using
Edited by He B Te My
Link to comment
Share on other sites

Olá He B Te Me, isso não serve amigo. Não é tão linear quanto você pensa, você viu a última linha ? "Ah sim, esqueci de dizer. É um limpador de registro. Nada bixo de 7 cabeças ... " Isso muda tudo. O que eu necessito é a classe RegistryKey já aberta para ainda fazer outro ciclo FOR por fora e pegar os valores de cada sub chave. O que mostraste aí é tão linear quanto inútil, apenas mostra um array de sub chaves de UMA SÓ SUBCHAVE e eu preciso de todas. Já ouviste falar em Recursividade ? Uma função que usa a si mesma inúmeras vezes para concluir o objetivo ? Eu tento deixar o código de uma forma que seja fácil de entender, uma forma bem simples de exemplo que eu faça isso é a constante, eu sempre deixo elas em maiúsculo, em Catch eu ponho NTSTATUS, outra coisa variáveis sem começo com letra maiúscula é ridículo. Isso dificulta na hora de ler mesmo que pouco ... Eu usei o enum ali pois vou fazer um For I As integer ... e passar um por um mas isso é sequencial e o enum me ajuda nisso.

Se calhar da pra fazer isso usando GoTo ... hahaha isso descartaria o uso da recursividade. Se bem que não faz mal já que a thread iria parar por alguns segundos para processar essa lista de entradas, no mínimo deixaria o código mais feio o uso do goto mas ainda sim é uma solução

Edited by Muryllo
Link to comment
Share on other sites

E que tal pensares um bocadinho?

Dim registryKey As String = "O caminho da chave"
Using key As Microsoft.Win32.RegistryKey = Registry.LocalMachine.OpenSubKey(registryKey) 'LocalMachine ou o que for em cima... pode ser CurrentUser, ClassesRoot etc
For Each subkeyName As [string] In key.GetSubKeyNames()
Using key2 As Microsoft.Win32.RegistryKey = Registry.LocalMachine.OpenSubKey(Path.Combine(registryKey,subkeyName))
'voilá, recursividade.
End Using
Next
End Using
Edited by He B Te My
Link to comment
Share on other sites

lol, mas não é assim o quê? O código que eu pus acima faz o que o teu faz duma maneira melhor e mais limpa, não entendo o que precisas mais, e eu não sou adivinho nem ando aqui a competir.

Link to comment
Share on other sites

Quando eu disse recursividade, acho que não entendeste porque. No registro são milhões de sub chaves, uma dentro das outras são várias. O objetivo é pegar TODAS ELAS. Em teoria é claro. Pois em acesso isso não é possível. O teu código retorna somente as sub chaves de uma chave que é a "registryKey" . Não precisa chorar colega. Não estou competindo também e obrigado mais uma vez por tentar ajudar. Vou terminar o código e posto aqui.

Não vê os antivírus quando vão escanear uma unidade ? É tudo e mete pra dentro mesmo. Isso é a recursividade uma função lá dentro não sei de qual biblioteca que sai usando ela mesma pra fazer a coisa acontecer. um exemplo é a sequência de Fibonacci . já ouviu falar ? número de ouro ? constante transcendental ? mais ou menos isso.

Edited by Muryllo
Link to comment
Share on other sites

Você pensa que é magia que faz isso? O meu código acima (e o seu também) pode ser adaptado para fazer o que você pretende, se bem que aceder a todas as chaves do registo é uma ideia extremamente estúpida,e nunca na vida terás acesso a todas.

Eu até postava mais exemplos mas devido ao seu interesse em insultar-me nem me vou dar ao trabalho.

Você pensa que as "bibliotecas" têm magia lá dentro? É tudo código, tudo o que é recursivo têm loops, tais como For Next acima, mas agora que você me fala de antivirus eu lembro-me de você a tentar fazer o mesmo para os ficheiros de sistema... ou estou errado? Se você conseguiu aí você também consegue aqui, mas tenho algo que me diz que você não conseguiu...

A chava não é a 'registrykey', registrykey é uma classe do .net framework que serve para encapsular uma chave de registro no windows. https://msdn.microsoft.com/en-us/library/Microsoft.Win32.RegistryKey%28v=vs.110%29.aspx

Eu se fosse a si começaria por ler a documentação e tentar programar coisas mais fáceis em vez de tentar fazer antivirus e afins.

Vou-lhe dar uma última ajuda neste assunto, da mesma maneira que enumerei uma chave de registro acima, você pode enumerar a chave 'root' ou seja "HKEY_LOCALMACHINE" e daí enumerar todas e mais algumas chaves de registro que você quiser, já viu? Recursividade no seu melhor, boa sorte em lidar com os acessos a todas as chaves e também para os seus projectos futuros, espero que não se esqueça de fechar cada chave na sua exploração do registro, ou isso irá correr muito mal.

Link to comment
Share on other sites

Em questão do antivírus eu já fiz e vou patenteá-lo, e sim eu consegui fazer aquela busca recursiva de arquivos. tenho o código fonte aqui até ... ler mais do que eu leio as documentações do .NET ? Não ... acho que não ... quando você falou de que recursividade tem loops e de for estou falando com quem ? Nenhum dos teus códigos resolve o problema. Não interessa para que precisas das diretrizes de todas as sub chaves. Isso é um fórum claro, até imagino você falando com o seu professor de faculdade assim, não resolve o problema e manda-o "LER". Parece que você não leu seu próprio código, não é ?

Como eu disse, o código fica bagunçado colocando letras inicias de variáveis, rotinas e funções minúsculas. Se eu disse que registryKey é o nome de uma variável é porque é ... Os programadores profissionais que trabalham na microsoft não colocariam o nome de uma classe assim, se o objetivo da linguagem é ser BASIC.

Dim registryKey As String = "O caminho da chave" 'Você quem criou isso ...

Link to comment
Share on other sites

Tópico resolvido. Código fonte :

'
Public Const STATUS_NULL As Object = Nothing
Public Const STATUS_SUCCESS As String = "0x0000"
Public Const STATUS_INVALID As String = "0x0001"
Public Const STATUS_UNSUCCESSFUL As String = "0x0002"
Public Const STATUS_FALSE As String = "0x0003"
Public Const STATUS_TRUE As String = "0x0004"
'
Public Const W32_CLASSES_ROOT As String = "HKEY_CLASSES_ROOT"
Public Const W32_CURRENT_USER As String = "HKEY_CURRENT_USER"
Public Const W32_LOCAL_MACHINE As String = "HKEY_LOCAL_MACHINE"
Public Const W32_USERS As String = "HKEY_USERS"
Public Const W32_CURRENT_CONFIG As String = "HKEY_CURRENT_CONFIG"
'
Public Enum GAV_Registry_Entries
 GAV_HKEY_CLASSES_ROOT = 0
 GAV_HKEY_CURRENT_USER = 1
 GAV_HKEY_LOCAL_MACHINE = 2
 GAV_HKEY_USERS = 3
 GAV_HKEY_CURRENT_CONFIG = 4
End Enum
'
Public Structure GAV_Registry_Info
 Dim GAV_Hive_Key As Integer
 Dim GAV_Sub_Key As String
End Structure
'
Public Shared Function GAV_Registry_Conversion(ByVal GAV_Registry_Path As String) As GAV_Registry_Info
 Try
	 Dim GAV_Current_Registry_Info As GAV_Registry_Info
	 If GAV_Is_Starting_With(GAV_Registry_Path, W32_CLASSES_ROOT) = STATUS_TRUE Then
		 GAV_Current_Registry_Info.GAV_Hive_Key = GAV_Registry_Entries.GAV_HKEY_CLASSES_ROOT
		 GAV_Current_Registry_Info.GAV_Sub_Key = GAV_Return_Registry_Sub_Key(GAV_Registry_Path, W32_CLASSES_ROOT)
	 Else
		 If GAV_Is_Starting_With(GAV_Registry_Path, W32_CURRENT_USER) = STATUS_TRUE Then
			 GAV_Current_Registry_Info.GAV_Hive_Key = GAV_Registry_Entries.GAV_HKEY_CURRENT_USER
			 GAV_Current_Registry_Info.GAV_Sub_Key = GAV_Return_Registry_Sub_Key(GAV_Registry_Path, W32_CURRENT_USER)
		 Else
			 If GAV_Is_Starting_With(GAV_Registry_Path, W32_LOCAL_MACHINE) = STATUS_TRUE Then
				 GAV_Current_Registry_Info.GAV_Hive_Key = GAV_Registry_Entries.GAV_HKEY_LOCAL_MACHINE
				 GAV_Current_Registry_Info.GAV_Sub_Key = GAV_Return_Registry_Sub_Key(GAV_Registry_Path, W32_LOCAL_MACHINE)
			 Else
				 If GAV_Is_Starting_With(GAV_Registry_Path, W32_USERS) = STATUS_TRUE Then
					 GAV_Current_Registry_Info.GAV_Hive_Key = GAV_Registry_Entries.GAV_HKEY_USERS
					 GAV_Current_Registry_Info.GAV_Sub_Key = GAV_Return_Registry_Sub_Key(GAV_Registry_Path, W32_USERS)
				 Else
					 If GAV_Is_Starting_With(GAV_Registry_Path, W32_CURRENT_CONFIG) = STATUS_TRUE Then
						 GAV_Current_Registry_Info.GAV_Hive_Key = GAV_Registry_Entries.GAV_HKEY_CURRENT_CONFIG
						 GAV_Current_Registry_Info.GAV_Sub_Key = GAV_Return_Registry_Sub_Key(GAV_Registry_Path, W32_CURRENT_CONFIG)
					 Else
						 Return STATUS_NULL
					 End If
				 End If
			 End If
		 End If
	 End If
	 Return GAV_Current_Registry_Info
 Catch NTSTATUS As Exception
	 Return STATUS_NULL
 End Try
End Function
'
Public Shared Function GAV_Destroy_First_Byte(ByVal GAV_String As String) As String
 Try
	 Dim GAV_Is_First_Byte As Boolean = False
	 Dim GAV_String_Return As String = STATUS_NULL
	 For GAV_Current_Character As Integer = 0 To GAV_String.Length - 1
		 If GAV_Is_First_Byte = True Then
			 GAV_String_Return &= GAV_String.Chars(GAV_Current_Character)
		 Else
			 GAV_Is_First_Byte = True
		 End If
	 Next
	 System.GC.Collect()
	 Return GAV_String_Return
 Catch NTSTATUS As Exception
	 Return STATUS_UNSUCCESSFUL
 End Try
End Function
'
Public Shared Function GAV_Is_Starting_With(ByVal GAV_Current_Registry_Path As String, ByVal GAV_Current_String As String) As String
 Try
	 Dim GAV_Current_Status As Boolean = True
	 For GAV_Current_Character As UInt64 = 0 To GAV_Current_String.Length - 1
		 If GAV_Current_Registry_Path.Chars(GAV_Current_Character) = GAV_Current_String(GAV_Current_Character) Then
		 Else
			 GAV_Current_Status = False
			 Exit For
		 End If
	 Next
	 System.GC.Collect()
	 If GAV_Current_Status = True Then
		 Return STATUS_TRUE
	 Else
		 Return STATUS_FALSE
	 End If
 Catch NTSTATUS As Exception
	 Return STATUS_FALSE
 End Try
End Function
'
Public Shared Function GAV_Return_Registry_Sub_Key(ByVal GAV_Registry_Path As String, ByVal GAV_String_Split As String) As String
 Try
	 Dim GAV_Current_String As String = STATUS_NULL
	 Dim GAV_Current_String_Split As String = (GAV_String_Split & "\")
	 Dim GAV_Current_String_Search As Boolean = False
	 For GAV_Current_Character As UInt64 = 0 To GAV_Registry_Path.Length - 1
		 Try
			 If GAV_Current_String.Length = GAV_Current_String_Split.Length Then
				 If GAV_Current_String_Search = True Then
					 GAV_Current_String &= GAV_Registry_Path.Chars(GAV_Current_Character)
				 Else
					 If GAV_Current_String = GAV_Current_String_Split Then
						 GAV_Current_String_Search = True
						 GAV_Current_String = STATUS_NULL
						 GAV_Current_String &= GAV_Registry_Path.Chars(GAV_Current_Character)
					 Else
						 GAV_Current_String = GAV_Destroy_First_Byte(GAV_Current_String)
						 GAV_Current_String &= GAV_Registry_Path.Chars(GAV_Current_Character)
					 End If
				 End If
			 Else
				 GAV_Current_String &= GAV_Registry_Path.Chars(GAV_Current_Character)
			 End If
		 Catch STATUS As Exception
			 GAV_Current_String &= GAV_Registry_Path.Chars(GAV_Current_Character)
		 End Try
	 Next
	 System.GC.Collect()
	 Return GAV_Current_String
 Catch NTSTATUS As Exception
	 Return STATUS_INVALID
 End Try
End Function
'
Public Shared Function GAV_Item_Exists(ByVal GAV_List As List(Of String), ByVal GAV_Current_Item As String) As Boolean
 Try
	 Dim GAV_Current_Status As Boolean = False
	 For Each GAV_Current_Element As String In GAV_List
		 If GAV_Current_Element = GAV_Current_Item Then
			 GAV_Current_Status = True
			 Exit For
		 End If
	 Next
	 System.GC.Collect()
	 Return GAV_Current_Status
 Catch NTSTATUS As Exception
	 Return False
 End Try
End Function
'
Public Shared Function GAV_Object_Exists(ByVal GAV_String_Array As String(), ByVal GAV_Current_String As String) As Boolean
 Try
	 Dim GAV_Current_Status As Boolean = False
	 For Each GAV_Current_Object As String In GAV_String_Array
		 If GAV_Current_Object = GAV_Current_String Then
			 GAV_Current_Status = True
			 Exit For
		 End If
	 Next
	 Return GAV_Current_Status
 Catch NTSTATUS As Exception
	 Return False
 End Try
End Function
'
Public Shared Function GAV_Return_Registry_Entries(ByVal GAV_Hive_Key As GAV_Registry_Entries, ByVal GAV_Registry_Sub_Key As String, ByVal GAV_Registry_Sub_Keys_Exceptions As String()) As String()
 Try
	 Dim GAV_Current_Entries As New List(Of String)
	 If GAV_Hive_Key = GAV_Registry_Entries.GAV_HKEY_CLASSES_ROOT Then
		 Using GAV_Current_Hive_Key As RegistryKey = Registry.ClassesRoot.OpenSubKey(GAV_Registry_Sub_Key, False, Security.AccessControl.RegistryRights.ReadKey)
			 Try
				 For Each GAV_Current_Sub_Key As String In GAV_Current_Hive_Key.GetSubKeyNames
					 Try
						 If GAV_Object_Exists(GAV_Registry_Sub_Keys_Exceptions, GAV_Current_Sub_Key) = False Then
							 For Each GAV_Current_Key As String In GAV_Return_Registry_Entries(GAV_Hive_Key, Path.Combine(GAV_Registry_Sub_Key, GAV_Current_Sub_Key), GAV_Registry_Sub_Keys_Exceptions)
								 If GAV_Item_Exists(GAV_Current_Entries, GAV_Current_Key) = False Then
									 GAV_Current_Entries.Add(GAV_Current_Key)
								 End If
								 System.GC.Collect()
							 Next
						 End If
					 Catch STATUS As Exception
					 End Try
					 Using GAV_Current_Path_Of_Sub_Key As RegistryKey = Registry.ClassesRoot.OpenSubKey(Path.Combine(GAV_Registry_Sub_Key, GAV_Current_Sub_Key))
						 GAV_Current_Entries.Add(GAV_Current_Path_Of_Sub_Key.Name)
					 End Using
				 Next
			 Catch NTSTATUS As Exception
			 End Try
		 End Using
	 Else
		 If GAV_Hive_Key = GAV_Registry_Entries.GAV_HKEY_CURRENT_USER Then
			 Using GAV_Current_Hive_Key As RegistryKey = Registry.CurrentUser.OpenSubKey(GAV_Registry_Sub_Key, False, Security.AccessControl.RegistryRights.ReadKey)
				 Try
					 For Each GAV_Current_Sub_Key As String In GAV_Current_Hive_Key.GetSubKeyNames
						 Try
							 If GAV_Object_Exists(GAV_Registry_Sub_Keys_Exceptions, GAV_Current_Sub_Key) = False Then
								 For Each GAV_Current_Key As String In GAV_Return_Registry_Entries(GAV_Hive_Key, Path.Combine(GAV_Registry_Sub_Key, GAV_Current_Sub_Key), GAV_Registry_Sub_Keys_Exceptions)
									 If GAV_Item_Exists(GAV_Current_Entries, GAV_Current_Key) = False Then
										 GAV_Current_Entries.Add(GAV_Current_Key)
									 End If
									 System.GC.Collect()
								 Next
							 End If
						 Catch STATUS As Exception
						 End Try
						 Using GAV_Current_Path_Of_Sub_Key As RegistryKey = Registry.CurrentUser.OpenSubKey(Path.Combine(GAV_Registry_Sub_Key, GAV_Current_Sub_Key))
							 GAV_Current_Entries.Add(GAV_Current_Path_Of_Sub_Key.Name)
						 End Using
					 Next
				 Catch NTSTATUS As Exception
				 End Try
			 End Using
		 Else
			 If GAV_Hive_Key = GAV_Registry_Entries.GAV_HKEY_LOCAL_MACHINE Then
				 Using GAV_Current_Hive_Key As RegistryKey = Registry.LocalMachine.OpenSubKey(GAV_Registry_Sub_Key, False, Security.AccessControl.RegistryRights.ReadKey)
					 Try
						 For Each GAV_Current_Sub_Key As String In GAV_Current_Hive_Key.GetSubKeyNames
							 Try
								 If GAV_Object_Exists(GAV_Registry_Sub_Keys_Exceptions, GAV_Current_Sub_Key) = False Then
									 For Each GAV_Current_Key As String In GAV_Return_Registry_Entries(GAV_Hive_Key, Path.Combine(GAV_Registry_Sub_Key, GAV_Current_Sub_Key), GAV_Registry_Sub_Keys_Exceptions)
										 If GAV_Item_Exists(GAV_Current_Entries, GAV_Current_Key) = False Then
											 GAV_Current_Entries.Add(GAV_Current_Key)
										 End If
										 System.GC.Collect()
									 Next
								 End If
							 Catch STATUS As Exception
							 End Try
							 Using GAV_Current_Path_Of_Sub_Key As RegistryKey = Registry.LocalMachine.OpenSubKey(Path.Combine(GAV_Registry_Sub_Key, GAV_Current_Sub_Key))
								 GAV_Current_Entries.Add(GAV_Current_Path_Of_Sub_Key.Name)
							 End Using
						 Next
					 Catch NTSTATUS As Exception
					 End Try
				 End Using
			 Else
				 If GAV_Hive_Key = GAV_Registry_Entries.GAV_HKEY_USERS Then
					 Using GAV_Current_Hive_Key As RegistryKey = Registry.Users.OpenSubKey(GAV_Registry_Sub_Key, False, Security.AccessControl.RegistryRights.ReadKey)
						 Try
							 For Each GAV_Current_Sub_Key As String In GAV_Current_Hive_Key.GetSubKeyNames
								 Try
									 If GAV_Object_Exists(GAV_Registry_Sub_Keys_Exceptions, GAV_Current_Sub_Key) = False Then
										 For Each GAV_Current_Key As String In GAV_Return_Registry_Entries(GAV_Hive_Key, Path.Combine(GAV_Registry_Sub_Key, GAV_Current_Sub_Key), GAV_Registry_Sub_Keys_Exceptions)
											 If GAV_Item_Exists(GAV_Current_Entries, GAV_Current_Key) = False Then
												 GAV_Current_Entries.Add(GAV_Current_Key)
											 End If
											 System.GC.Collect()
										 Next
									 End If
								 Catch STATUS As Exception
								 End Try
								 Using GAV_Current_Path_Of_Sub_Key As RegistryKey = Registry.Users.OpenSubKey(Path.Combine(GAV_Registry_Sub_Key, GAV_Current_Sub_Key))
									 GAV_Current_Entries.Add(GAV_Current_Path_Of_Sub_Key.Name)
								 End Using
							 Next
						 Catch NTSTATUS As Exception
						 End Try
					 End Using
				 Else
					 If GAV_Hive_Key = GAV_Registry_Entries.GAV_HKEY_CURRENT_CONFIG Then
						 Using GAV_Current_Hive_Key As RegistryKey = Registry.CurrentConfig.OpenSubKey(GAV_Registry_Sub_Key, False, Security.AccessControl.RegistryRights.ReadKey)
							 Try
								 For Each GAV_Current_Sub_Key As String In GAV_Current_Hive_Key.GetSubKeyNames
									 Try
										 If GAV_Object_Exists(GAV_Registry_Sub_Keys_Exceptions, GAV_Current_Sub_Key) = False Then
											 For Each GAV_Current_Key As String In GAV_Return_Registry_Entries(GAV_Hive_Key, Path.Combine(GAV_Registry_Sub_Key, GAV_Current_Sub_Key), GAV_Registry_Sub_Keys_Exceptions)
												 If GAV_Item_Exists(GAV_Current_Entries, GAV_Current_Key) = False Then
													 GAV_Current_Entries.Add(GAV_Current_Key)
												 End If
												 System.GC.Collect()
											 Next
										 End If
									 Catch STATUS As Exception
									 End Try
									 Using GAV_Current_Path_Of_Sub_Key As RegistryKey = Registry.CurrentConfig.OpenSubKey(Path.Combine(GAV_Registry_Sub_Key, GAV_Current_Sub_Key))
										 GAV_Current_Entries.Add(GAV_Current_Path_Of_Sub_Key.Name)
									 End Using
								 Next
							 Catch NTSTATUS As Exception
							 End Try
						 End Using
					 End If
				 End If
			 End If
		 End If
	 End If
	 Return GAV_Current_Entries.ToArray
 Catch NTSUCCESS As Exception
	 Return {STATUS_UNSUCCESSFUL}
 End Try
End Function
'

Biblioteca : GAVLIB.DLL

Imports : Microsoft.Win32

Função : GAV_Return_Registry_Entries(Chave_do_Registro, Sub-chave, {Chaves_Exceções})

Retorno : String()

Algoritmo : Recursivo

Usando a função :

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
	For Each X As String In GAV_Return_Registry_Entries(GAV_Registry_Entries.GAV_HKEY_LOCAL_MACHINE, "Software", {"Classes", "Clientes"})
		Dim Y As GAV_Registry_Info = GAV_Registry_Conversion(X)
		MsgBox(Y.GAV_Hive_Key & " " & Y.GAV_Sub_Key)
	Next
End Sub

Essa função não altera valores no registro, apenas lista as sub chaves de uma colmeia.

Edited by Muryllo
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.