ExamineRegistry procedures

Share your advanced PureBasic knowledge/code with the community.
boyoss
User
User
Posts: 74
Joined: Fri Feb 05, 2016 10:11 am

ExamineRegistry procedures

Post by boyoss »

Code: Select all

Global yh_reg_TopKey.l, yh_reg_SubKey.s, yh_reg_Index.l, yh_reg_hkey.l
Global yh_reg_KeyName.s, yh_reg_KeyValue.s

Procedure ExamineRegistry(TopKey.l, SubKey.s)
	yh_reg_TopKey = TopKey
	yh_reg_SubKey = SubKey
	yh_reg_Index = 0
	If RegOpenKeyEx_(yh_reg_TopKey, yh_reg_SubKey, 0, #KEY_READ, @yh_reg_hkey)
		ProcedureReturn 0
	Else
		ProcedureReturn 1
	EndIf
EndProcedure

Procedure NextRegistryKey()
	Define.l lenName, lenValue, a
	
	yh_reg_KeyName.s  = Space(511) :  lenName.l  = Len(yh_reg_KeyName)
	yh_reg_KeyValue.s = Space(511) :  lenValue.l = Len(yh_reg_KeyValue)
	
	If RegEnumValue_(yh_reg_hkey, yh_reg_Index, @yh_reg_KeyName, @lenName, #Null, @dwType, @yh_reg_KeyValue, @lenValue)
		ProcedureReturn 0
	EndIf
	
	yh_reg_KeyName = Left(yh_reg_KeyName, lenName)
	yh_reg_KeyValue = Left(yh_reg_KeyValue, lenValue - 1)
	
	yh_reg_Index + 1
	ProcedureReturn 1
EndProcedure

Procedure.s RegistryKeyName()
	ProcedureReturn yh_reg_KeyName
EndProcedure

Procedure.s RegistryKeyValue()
	ProcedureReturn yh_reg_KeyValue
EndProcedure

Procedure FinishRegistry()
	RegCloseKey_(yh_reg_hkey)
EndProcedure

ExamineRegistry(#HKEY_LOCAL_MACHINE, "SOFTWARE\Microsoft\Windows NT\CurrentVersion")

While NextRegistryKey()
	Debug RegistryKeyName() + " = " + RegistryKeyValue()
Wend

FinishRegistry()
eJan
Enthusiast
Enthusiast
Posts: 365
Joined: Sun May 21, 2006 11:22 pm
Location: Sankt Veit am Flaum

Re: ExamineRegistry procedures

Post by eJan »

Thanks boyoss, some errors are present.
Debug output:

Code: Select all

SystemRoot = C:\Windows
BuildBranch = rs1_release
BuildGUID = ffffffff-ffff-ffff-ffff-ffffffffffff
BuildLab = 14393.rs1_release.161220-1747
BuildLabEx = 14393.693.amd64fre.rs1_release.161220-1747
CompositionEditionID = Professional
CurrentBuild = 14393
CurrentBuildNumber = 14393
CurrentMajorVersionNumber = 

CurrentMinorVersionNumber = 
CurrentType = Multiprocessor Free
CurrentVersion = 6.3
EditionID = Professional
InstallationType = Client
InstallDate = �埞 
ProductName = Windows 10 Pro
ReleaseId = 1607
SoftwareType = System
UBR = ʵ
PathName = C:\Windows
Customizations = ModernApps
DigitalProductId = ¤
Where the registry values are:

Code: Select all

CurrentMajorVersionNumber   REG_DWORD   a (hex)
CurrentMinorVersionNumber   REG_DWORD   0 (hex) 
InstallDate   REG_DWORD   57dedbb5 (hex)
UBR   REG_DWORD   2b5 (hex)
Registry export:

Code: Select all

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion]
"SystemRoot"="C:\\Windows"
"BuildBranch"="rs1_release"
"BuildGUID"="ffffffff-ffff-ffff-ffff-ffffffffffff"
"BuildLab"="14393.rs1_release.161220-1747"
"BuildLabEx"="14393.693.amd64fre.rs1_release.161220-1747"
"CompositionEditionID"="Professional"
"CurrentBuild"="14393"
"CurrentBuildNumber"="14393"
"CurrentMajorVersionNumber"=dword:0000000a
"CurrentMinorVersionNumber"=dword:00000000
"CurrentType"="Multiprocessor Free"
"CurrentVersion"="6.3"
"EditionID"="Professional"
"InstallationType"="Client"
"InstallDate"=dword:57dedbb5
"ProductName"="Windows 10 Pro"
"ReleaseId"="1607"
"SoftwareType"="System"
"UBR"=dword:000002b5
"PathName"="C:\\Windows"
"Customizations"="ModernApps"
"DigitalProductId"=hex:a4,00,00,00,03,00,00,00,30,30,33,33,31,2d,31,30,30,30,\
  30,2d,30,30,30,30,31,2d,41,41,30,32,31,00,ef,0c,00,00,5b,54,48,5d,58,31,39,\
  2d,39,38,37,39,35,00,00,00,ef,0c,10,00,00,00,34,3d,c5,39,4e,bd,6e,2f,09,00,\
  00,00,00,00,7c,29,89,57,85,58,09,e6,03,00,00,00,00,00,00,00,00,00,00,00,00,\
  00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
  00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
  00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,19,6b,24,5b
"DigitalProductId4"=hex:f8,04,00,00,04,00,00,00,30,00,30,00,30,00,30,00,30,00,\
  2d,00,30,00,33,00,33,00,31,00,31,00,2d,00,30,00,30,00,30,00,2d,00,30,00,30,\
  00,30,00,30,00,30,00,31,00,2d,00,30,00,33,00,2d,00,31,00,30,00,33,00,33,00,\
  2d,00,39,00,32,00,30,00,30,00,2e,00,30,00,30,00,30,00,30,00,2d,00,31,00,39,\
  00,37,00,32,00,30,00,31,00,36,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
  00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,32,00,64,00,65,00,36,\
  00,37,00,33,00,39,00,32,00,2d,00,62,00,37,00,61,00,37,00,2d,00,34,00,36,00,\
  32,00,61,00,2d,00,62,00,31,00,63,00,61,00,2d,00,31,00,30,00,38,00,64,00,64,\
  00,31,00,38,00,39,00,66,00,35,00,38,00,38,00,00,00,00,00,00,00,00,00,00,00,\
  00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
  00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
  00,00,00,00,00,00,00,00,00,00,00,00,50,00,72,00,6f,00,66,00,65,00,73,00,73,\
  00,69,00,6f,00,6e,00,61,00,6c,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
  00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
  00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
  00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
  00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
  00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
  00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
  00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
  00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
  00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
  00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
  00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
  00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
  00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
  00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
  00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
  00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
  00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
  00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
  00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
  00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,ef,0c,10,00,00,00,34,3d,c5,39,\
  4e,bd,6e,2f,09,00,0e,e4,81,90,98,72,8c,2e,3e,fa,e9,23,90,15,be,09,33,33,2a,\
  a0,70,0a,fb,db,6a,5d,f3,29,54,41,85,91,7f,c2,2f,87,a3,97,80,51,ce,34,9a,69,\
  ec,37,3d,a3,8a,90,1b,ee,bb,41,fd,85,98,65,03,a1,6e,20,df,05,5b,00,54,00,48,\
  00,5d,00,58,00,31,00,39,00,2d,00,39,00,38,00,37,00,39,00,35,00,00,00,00,00,\
  00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
  00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
  00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
  00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,56,00,\
  6f,00,6c,00,75,00,6d,00,65,00,3a,00,47,00,56,00,4c,00,4b,00,00,00,00,00,00,\
  00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
  00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
  00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
  00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
  00,56,00,6f,00,6c,00,75,00,6d,00,65,00,00,00,00,00,00,00,00,00,00,00,00,00,\
  00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
  00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
  00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
  00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
  00,00,00,00
"ProductId"="00331-10000-00001-AA021"
"RegisteredOwner"="Windows User"
"RegisteredOrganization"=""
"InstallTime"=hex(b):e1,2c,09,cd,d9,11,d2,01
Win 10 Pro EN x64 v1607 14393.693
Image
infratec
Always Here
Always Here
Posts: 6883
Joined: Sun Sep 07, 2008 12:45 pm
Location: Germany

Re: ExamineRegistry procedures

Post by infratec »

A bit extended:

Code: Select all

EnableExplicit


Global yh_reg_TopKey.l, yh_reg_SubKey.s, yh_reg_Index.l, yh_reg_hkey.l
Global yh_reg_KeyName.s, yh_reg_KeyValue.s

Procedure ExamineRegistry(TopKey.l, SubKey.s)
  yh_reg_TopKey = TopKey
  yh_reg_SubKey = SubKey
  yh_reg_Index = 0
  If RegOpenKeyEx_(yh_reg_TopKey, yh_reg_SubKey, 0, #KEY_READ|#KEY_WOW64_64KEY, @yh_reg_hkey)
    ProcedureReturn #False
  Else
    ProcedureReturn #True
  EndIf
EndProcedure

Procedure NextRegistryKey()
  Protected.l lenName, lenValue, a, dwType, Result
  Protected.i i
  Protected Help$
  
  yh_reg_KeyName.s  = Space(511) :  lenName.l  = StringByteLength(yh_reg_KeyName)
  yh_reg_KeyValue.s = Space(511) :  lenValue.l = StringByteLength(yh_reg_KeyValue)
  
  Result = RegEnumValue_(yh_reg_hkey, yh_reg_Index, @yh_reg_KeyName, @lenName, #Null, @dwType, @yh_reg_KeyValue, @lenValue)
  If Result = #ERROR_NO_MORE_ITEMS
    ;Debug "No more items"
    ProcedureReturn #False
  EndIf
  
  If Result = #ERROR_MORE_DATA
    ;Debug lenValue
    yh_reg_KeyValue.s = Space((lenValue + 2) >> 1)
    ;Debug StringByteLength(yh_reg_KeyValue)
    lenValue = StringByteLength(yh_reg_KeyValue)
    lenName = StringByteLength(yh_reg_KeyName)
    Result = RegEnumValue_(yh_reg_hkey, yh_reg_Index, @yh_reg_KeyName, @lenName, #Null, @dwType, @yh_reg_KeyValue, @lenValue)
  EndIf
  
  ;Debug Result
  ;Debug yh_reg_Index
  
  If Result = #ERROR_SUCCESS
    
    yh_reg_KeyName = Left(yh_reg_KeyName, lenName)
    Select dwType
      Case #REG_SZ
        yh_reg_KeyValue = Left(yh_reg_KeyValue, lenValue - 1)
        
      Case #REG_BINARY
        Help$ = "binary:"
        For i = 0 To lenValue - 1
          Help$ + RSet(Hex(PeekA(@yh_reg_KeyValue + i)), 2, "0") + " "
        Next i
        yh_reg_KeyValue = Help$
        
      Case #REG_DWORD
        yh_reg_KeyValue = "dword:" + RSet(Hex(PeekL(@yh_reg_KeyValue), #PB_Long), 8, "0") + " (" + Str(PeekL(@yh_reg_KeyValue)) + ")"
        
      Case #REG_QWORD
        yh_reg_KeyValue = "qword:" + RSet(Hex(PeekQ(@yh_reg_KeyValue), #PB_Quad), 16, "0") + " (" + Str(PeekQ(@yh_reg_KeyValue)) + ")"
        
      Default
        Debug "dwType " + Str(dwType) + " not implemented yet"
        
    EndSelect
    
  EndIf
  
  yh_reg_Index + 1
  ProcedureReturn #True
EndProcedure

Procedure.s RegistryKeyName()
  ProcedureReturn yh_reg_KeyName
EndProcedure

Procedure.s RegistryKeyValue()
  ProcedureReturn yh_reg_KeyValue
EndProcedure

Procedure FinishRegistry()
  RegCloseKey_(yh_reg_hkey)
EndProcedure

ExamineRegistry(#HKEY_LOCAL_MACHINE, "SOFTWARE\Microsoft\Windows NT\CurrentVersion")

While NextRegistryKey()
  Debug RegistryKeyName() + " = " + RegistryKeyValue()
Wend

FinishRegistry()
But it should be completely rewritten with usage of *buffers instead of strings
and maybe as module with static variables.

Bernd
Post Reply