here a small example to parse a regfile. not finished, not fast, doesn't work for all RegistryTypes
Code: Select all
; this example isn't finished, use it of your own risk
EnableExplicit
#REG_QWORD = $40
Structure RegistryFile
hKey.l
KeyName.s
ValueName.s
Value.s
Type.l
EndStructure
Enumeration 1 ; RegTyp
#REGEDIT4
#REGEDIT5
EndEnumeration
Procedure ParseRegFile(RegFile.s, Reg.RegistryFile())
Protected FF_Reg = ReadFile(#PB_Any, RegFile)
Protected RegType.l, FileType.l = #PB_Ascii, Text.s
Protected hKey.l, KeyName.s, ValueName.s, Value.s, Type.l, temp.s
If FF_Reg
; unicodecheck
If ReadStringFormat(FF_Reg) = #PB_Unicode : FileType = #PB_Unicode : EndIf
; check for RegType
Repeat
Text = ReadString(FF_Reg, FileType)
If Trim(Text) = "REGEDIT4" : RegType = #REGEDIT4 : EndIf
If Trim(Text) = "Windows Registry Editor Version 5.00" : RegType = #REGEDIT5 : EndIf
Until RegType Or Eof(FF_Reg)
If RegType
While Not Eof(FF_Reg)
Text = Trim(ReadString(FF_Reg, FileType))
If Left(Text, 1) = "["
Text = ReplaceString(Text, "[", "")
Text = ReplaceString(Text, "]", "")
temp = StringField(Text, 1, "\")
Select temp
Case "HKEY_CLASSES_ROOT" : hKey = #HKEY_CLASSES_ROOT
Case "HKEY_CURRENT_CONFIG" : hKey = #HKEY_CURRENT_CONFIG
Case "HKEY_CURRENT_USER" : hKey = #HKEY_CURRENT_USER
Case "HKEY_DYN_DATA" : hKey = #HKEY_DYN_DATA
Case "HKEY_LOCAL_MACHINE" : hKey = #HKEY_LOCAL_MACHINE
Case "HKEY_PERFORMANCE_DATA" : hKey = #HKEY_PERFORMANCE_DATA
Case "HKEY_USERS" : hKey = #HKEY_USERS
Default : Break
EndSelect
KeyName = Right(Text, Len(Text) - Len(temp) -1)
ElseIf Text
If hkey And KeyName
ValueName = StringField(Text, 1, "=")
ValueName = ReplaceString(ValueName, #DQUOTE$, "")
temp = Right(Text, Len(Text) - Len(ValueName) - 1)
If ValueName = "@" : ValueName = "" : EndIf
temp = ReplaceString(temp, "=", "")
temp = ReplaceString(temp, #DQUOTE$, "")
temp = ReplaceString(temp, "\\", "\")
Text = temp
temp = StringField(Text, 1, ":")
Select temp
Case "dword" : Type = #REG_DWORD
Case "hex" : Type = #REG_BINARY
Case "hex(7)" : Type = #REG_MULTI_SZ
Case "hex(40)" : Type = #REG_QWORD
Default : Type = #REG_SZ
EndSelect
Select Type
Case #REG_DWORD : Value = ReplaceString(Text, "dword:", "")
Case #REG_BINARY
Value = ReplaceString(Text, "hex:", "")
While Right(Value, 1) = "\"
Value + Trim(ReadString(FF_Reg, FileType))
Wend
Case #REG_MULTI_SZ
Value = ReplaceString(Text, "hex(7):", "")
While Right(Value, 1) = "\"
Value + Trim(ReadString(FF_Reg, FileType))
Wend
Value = ReplaceString(Value, "\", "")
Case #REG_QWORD : Value = ReplaceString(Text, "hex(40):", "")
Default : Value = Text
EndSelect
AddElement(Reg())
With Reg()
\hKey = hKey
\KeyName = KeyName
\ValueName = ValueName
\Value = Value
\Type = Type
EndWith
EndIf
EndIf
Wend
Else
Debug "Registry-Format not supported"
CloseFile(FF_Reg)
ProcedureReturn #False
EndIf
CloseFile(FF_Reg)
Else
Debug "error open " + #DQUOTE$ + RegFile + #DQUOTE$
ProcedureReturn #False
EndIf
ProcedureReturn #True
EndProcedure
Procedure.s hKeyToString(hKey.l)
Select hKey
Case #HKEY_CLASSES_ROOT : ProcedureReturn "#HKEY_CLASSES_ROOT"
Case #HKEY_CURRENT_CONFIG : ProcedureReturn "#HKEY_CURRENT_CONFIG"
Case #HKEY_CURRENT_USER : ProcedureReturn "#HKEY_CURRENT_USER"
Case #HKEY_DYN_DATA : ProcedureReturn "#HKEY_DYN_DATA"
Case #HKEY_LOCAL_MACHINE : ProcedureReturn "#HKEY_LOCAL_MACHINE"
Case #HKEY_PERFORMANCE_DATA : ProcedureReturn "#HKEY_PERFORMANCE_DATA"
Case #HKEY_USERS : ProcedureReturn "#HKEY_USERS"
EndSelect
EndProcedure
Procedure HexVal(a$)
Protected Result.c, *adr.Character, i.l
a$ = Trim(UCase(a$))
If Asc(a$) = '$'
a$ = Trim(Mid(a$, 2, Len(a$)-1))
EndIf
*adr = @a$
For i = 1 To Len(a$)
Result << 4
Select *adr\c
Case '0'
Case '1' : Result + 1
Case '2' : Result + 2
Case '3' : Result + 3
Case '4' : Result + 4
Case '5' : Result + 5
Case '6' : Result + 6
Case '7' : Result + 7
Case '8' : Result + 8
Case '9' : Result + 9
Case 'A' : Result + 10
Case 'B' : Result + 11
Case 'C' : Result + 12
Case 'D' : Result + 13
Case 'E' : Result + 14
Case 'F' : Result + 15
Default : i = Len(a$)
EndSelect
*adr + 1 * SizeOf(Character)
Next
ProcedureReturn Result
EndProcedure
Procedure SaveRegAsSource(PBFile.s, Reg.RegistryFile())
Protected FF_PB.l = CreateFile(#PB_Any, PBFile)
Protected Source.s, temp.s, I.l, MyQuad.q
If FF_PB
WriteStringN(FF_PB, "; created by RegToPB")
WriteStringN(FF_PB, "")
ForEach Reg()
With Reg()
temp = hKeyToString(\hKey)
If temp
Select \Type
Case #REG_BINARY
Debug "#REG_BINARY not supported"
Case #REG_DWORD
Source = "Reg_WriteLong(" + temp + "," + #DQUOTE$ + \KeyName + #DQUOTE$ + "," + #DQUOTE$ + \ValueName + #DQUOTE$ + "," + \Value + ")"
WriteStringN(FF_PB, Source)
Case #REG_QWORD
For I = 0 To 7
PokeC(@MyQuad + I, HexVal(StringField(\Value, I + 1, ",")))
Next
Source = "Reg_WriteQuad(" + temp + "," + #DQUOTE$ + \KeyName + #DQUOTE$ + "," + #DQUOTE$ + \ValueName + #DQUOTE$ + "," + StrQ(MyQuad) + ")"
WriteStringN(FF_PB, Source)
Case #REG_MULTI_SZ
Debug "#REG_MULTI_SZ not supported"
Case #REG_SZ
Source = "Reg_WriteString(" + temp + "," + #DQUOTE$ + \KeyName + #DQUOTE$ + "," + #DQUOTE$ + \ValueName + #DQUOTE$ + "," + #DQUOTE$ + \Value + #DQUOTE$ + ")"
WriteStringN(FF_PB, Source)
EndSelect
EndIf
EndWith
Next
CloseFile(FF_PB)
ProcedureReturn #True
Else
Debug "error create " + #DQUOTE$ + PBFile + #DQUOTE$
EndIf
ProcedureReturn #False
EndProcedure
Procedure RegFileToPureSource(RegFile.s, SourceFile.s)
NewList Reg.RegistryFile()
If ParseRegFile(RegFile, Reg())
If SaveRegAsSource(SourceFile, Reg())
ProcedureReturn #True
EndIf
EndIf
ProcedureReturn #False
EndProcedure
; test
RegFileToPureSource("MyRegFile.reg", "MyTestFile.pb")
Example also in the download.