I hope this tool helps many. It took a lot of trail n errors and a lot of time. Finally happy to see the outcome. This is a complete Reg file Parser.
This is the first version. As of now only "Reg to Ahk" is implemented. "Ahk to Reg" will be implemented in the next version. The code is almost ready. Needs some cleanup and have to address some minor bugs.
Features that you are planned in the next version
1. RegDelete - As of now only RegWrite is implemented
2- "Ahk to Reg file Conversion
3. Any useful features based on your wonderful suggestions and support
Code: Select all
#NoEnv
#Warn
#MaxMem 512
SetBatchLines -1
SetWorkingDir %A_ScriptDir%
{ ;ErrorList
Error1 = "Error1: Multilines Exist.Operation Ends"
Error2 = "Blanks Exists.Operation Ends"
Error3 = "Couldn't Process Some Data.Operation Ends"
Error4 = "Key Count Validation Mismatch. Operation Ends"
}
{ ;GUI
Gui Font, s10
Gui Add, Text, x15 y10 w105 h29 Left, Version 1.0
;Gui Add, Text, x15 y10 w105 h29 Left, This tool converts
;Gui Add, Text, x126 y10 w70 h29 Left cRed, "reg to ahk"
;Gui Add, Text, x200 y10 w60 h29 Left, and also
;Gui Add, Text, x258 y10 w70 h29 Left cRed, "ahk to reg"
Gui Add, Text, x605 y10 w70 h29 Right, Author:
Gui Add, Text, x675 y10 w110 h29 Right cBlue, Nagendra Kumar
;Gui Font
Gui Add, Edit, x15 y45 w630 h23 vSelectFile ReadOnly, Select any *.reg file or *.ahk script file
Gui Add, Button, x655 y45 w60 h23 Default vSelectBtn gSelectFile, Select
Gui Add, Button, x725 y45 w60 h23 vSaveBtn gSelectOutFile, Save
Gui Add, Progress, x15 y80 w630 h23 -Smooth vMyProgress, 0
Gui Add, Button, x655 y80 w100 h23 vConvertBtn gConvertProcessStart, Convert
Gui Add, Button, x765 y80 w20 h23 vHelpBtn gHelp, ?
Gui Add, Text, x18 y110 w770 h29, Details:
Gui Add, Edit, x15 y130 w770 h92 ReadOnly vOpDetails Border VScroll cBlue,
Gui Add, Text, x18 y235 w150 h23, Data:
Gui Add, Edit, x15 y260 w770 h230 ReadOnly vShowContents Border,
GuiControl, Disable, ConvertBtn
GuiControl, Disable, SaveBtn
Gui Show, w800 h500, Registry Converter for Autohotkey v1.0 (Reg to Ahk + Ahk to Reg)
Return
}
GuiEscape:
GuiClose:
ExitApp
{ ;Input File Selection
SelectFile: ;{
FileSelectFile, SelectedFile, 3, , Open a file, *.reg; *.ahk
if ErrorLevel
return
SplitPath, SelectedFile, OutFileName, OutDir, OutExtension, OutNameNoExt, OutDrive
If (OutExtension = "REG")
MainOperation = Convert to AHK
else If (OutExtension = "AHK")
MainOperation = Convert to REG
else
{
MsgBox, Please Choose either *.reg file or *.ahk file
return
}
GuiControl,, SelectFile, %SelectedFile%
InitialText = Please Wait..... Loading the File
GuiControl,, OpDetails, %InitialText%
FileGetSize, InFileSize, %SelectedFile%, M
EstimatedTime := Round(InFileSize * 8.5 / 100, 0)
TimeUnits = Minutes
FileRead, InputFileData, %SelectedFile%
GuiControl,, ShowContents, %InputFileData%
If (MainOperation = "Convert to AHK")
DetailsReport = %InitialText%`nSelected a Registry File.`nFile Size: %InFileSize% MB`nEstimated Time for Conversion : %EstimatedTime% %TimeUnits%`nReady to Convert Reg File to Ahk Script
else If (MainOperation = "Convert to REG")
DetailsReport = %InitialText%`nSelected a Ahk Script File.`nFile Size: %InFileSize% MB`nEstimated Time for Conversion : %EstimatedTime% %TimeUnits%`nReady to Convert Ahk Script to Reg File
GuiControl,, OpDetails, %DetailsReport%
ControlSend Edit2, ^{End}, A
GuiControl, Enable, ConvertBtn
GuiControl,, ConvertBtn, %MainOperation%
return
}
{ ;Analysing the Conversion Process Needed
ConvertProcessStart:
If (MainOperation = "Convert to AHK")
GoSub, Reg2AhkConverion
else If (MainOperation = "Convert to REG")
GoSub, Ahk2RegConverion
else
{ Msgbox, Somethng went wrong
return
}
return
}
Reg2AhkConverion:
{ ;Registry to Autohotkey Conversion
StartTime := A_TickCount
GuiControl, Disable, ConvertBtn
DetailsReport = %DetailsReport%`nConversion Started at %A_Hour%:%A_Min%:%A_Sec%
GuiControl,, OpDetails, %DetailsReport%
ControlSend Edit2, ^{End}, A
{ ;Remove Header
StdString = Windows Registry Editor Version 5.00
OrgRegData := StrReplace(InputFileData, StdString)
InputFileData =
}
{ ;Fix Multiline Data
Needle := Chr(92) Chr(13) Chr(10) Chr(32) Chr(32)
OrgRegDataFix1 := StrReplace(OrgRegData, Needle)
OrgRegData =
}
{ ;Check if Still Multilines Exist
Count = 0
Loop, Parse, OrgRegDataFix1, `n, `r
{
If A_LoopField
{
StringLeft, FirstLetter, A_LoopField, 1
If !(FirstLetter = Chr(91) or FirstLetter = Chr(64) or FirstLetter = Chr(34) or FirstLetter = Chr(87))
Count++
}
}
If not Count = 0
ErrorProcedure(Error1)
}
{ ;Fix Blank Lines
OrgRegDataFix2 := VarLineBlanksFix(OrgRegDataFix1)
OrgRegDataFix1 =
}
{ ;Check if Still Blank lines Exist
Loop, Parse, OrgRegDataFix2, `n, `r
If !A_LoopField
ErrorProcedure(Error2)
}
{ ;Load Data into Array
OriginalData := Object()
Loop, Parse, OrgRegDataFix2, `n, `r
OriginalData[A_Index, "RawData"] := A_LoopField
OrgRegDataFix2 =
EmptyMem()
Prog_cnt := OriginalData.MaxIndex() * 2.5
GuiControl, +Range0-%Prog_cnt%, MyProgress
Bar1 := OriginalData.MaxIndex() / 4
GuiControl,, MyProgress, +%Bar1%
}
{ ;Main Process1: Parsing the Reg Data
DetailsReport = %DetailsReport%`nAnalysing Data......
GuiControl,, OpDetails, %DetailsReport%
ControlSend Edit2, ^{End}, A
KeyPos := Object()
KeyPosCounter = 1
CheckCounter = 0
Loop, % OriginalData.MaxIndex()
{
aaa := OriginalData[A_Index, "RawData"]
{ ;Mark Keys
If (SubStr(aaa, 1, 6) = "[HKEY_")
{
OriginalData[A_Index, "Type"] := "Key"
KeyPos[KeyPosCounter] := A_Index
KeyPosCounter++
OriginalData[A_Index, "KeyName"] := SubStr(OriginalData[A_Index, "RawData"], 2, StrLen(OriginalData[A_Index, "RawData"]) - 2)
OriginalData[A_Index, "RawData"] := ""
}
}
{ ;REG_DWORD Process1
SearchString = "=dword:
IfInString, aaa, "=dword:
{
FoundPos := InStr(aaa, SearchString,,,1)
StringTrimRight, Var1, aaa, StrLen(aaa) - FoundPos
StringTrimRight, FirstLetter, Var1, StrLen(Var1) - 1
If (FirstLetter = Chr(34))
StringTrimLeft, Var1, Var1, 1
StringTrimLeft, LasttLetter, Var1, StrLen(Var1) - 1
If (LasttLetter = Chr(34))
StringTrimRight, Var1, Var1, 1
OriginalData[A_Index, "Type"] := "REG_DWORD"
OriginalData[A_Index, "ValueName"] := Var1
StringTrimLeft, Var1, aaa, FoundPos + 7
OriginalData[A_Index, "Data"] := Var1
OriginalData[A_Index, "RawData"] := ""
}
}
{ ;REG_DWORD Process2
IfInString, aaa, @=dword:
{
OriginalData[A_Index, "Type"] := "REG_DWORD"
OriginalData[A_Index, "ValueName"] := ""
StringTrimLeft, Var1, aaa, 8
OriginalData[A_Index, "Data"] := Var1
OriginalData[A_Index, "RawData"] := ""
}
IfInString, aaa, @=hex(4):
{
OriginalData[A_Index, "Type"] := "REG_DWORD"
OriginalData[A_Index, "ValueName"] := ""
StringTrimLeft, Var1, aaa, 8
OriginalData[A_Index, "Data"] := Var1
OriginalData[A_Index, "RawData"] := ""
}
}
{ ;REG_SZ Process1
SearchString = "="
IfInString, aaa, "="
{
FoundPos := InStr(aaa, SearchString,,,1)
StringTrimRight, Var1, aaa, StrLen(aaa) - FoundPos
StringTrimRight, FirstLetter, Var1, StrLen(Var1) - 1
If (FirstLetter = Chr(34))
StringTrimLeft, Var1, Var1, 1
StringTrimLeft, LasttLetter, Var1, StrLen(Var1) - 1
If (LasttLetter = Chr(34))
StringTrimRight, Var1, Var1, 1
OriginalData[A_Index, "Type"] := "REG_SZ"
OriginalData[A_Index, "ValueName"] := Var1
StringTrimLeft, Var1, aaa, FoundPos + 2
StringTrimRight, Var1, Var1, 1
OriginalData[A_Index, "Data"] := Var1
OriginalData[A_Index, "RawData"] := ""
}
}
{ ;REG_BINARY & REG_NONE Process1
SearchString = "=hex:
IfInString, aaa, "=hex:
{
FoundPos := InStr(aaa, SearchString,,,1)
StringTrimRight, Var1, aaa, StrLen(aaa) - FoundPos
StringTrimRight, FirstLetter, Var1, StrLen(Var1) - 1
If (FirstLetter = Chr(34))
StringTrimLeft, Var1, Var1, 1
StringTrimLeft, LasttLetter, Var1, StrLen(Var1) - 1
If (LasttLetter = Chr(34))
StringTrimRight, Var1, Var1, 1
OriginalData[A_Index, "ValueName"] := Var1
StringTrimLeft, Var1, aaa, FoundPos + 5
Length := StrLen(Var1)
Var1 := StrReplace(Var1, "`,", "`,", OutputVarCount, -1)
If Var1
{
If (OutputVarCount = (Length - 2) / 3)
{
Var1 := StrReplace(Var1, "`,",, OutputVarCount, -1)
OriginalData[A_Index, "Data"] := Var1
If Var1
OriginalData[A_Index, "Type"] := "REG_BINARY"
Else
OriginalData[A_Index, "Type"] := "REG_NONE"
}
}
Else
OriginalData[A_Index, "Type"] := "REG_BINARY"
OriginalData[A_Index, "RawData"] := ""
}
}
{ ;REG_NONE Process2
SearchString = "=hex(0):
IfInString, aaa, "=hex(0):
{
FoundPos := InStr(aaa, SearchString,,,1)
StringTrimRight, Var1, aaa, StrLen(aaa) - FoundPos
StringTrimRight, FirstLetter, Var1, StrLen(Var1) - 1
If (FirstLetter = Chr(34))
StringTrimLeft, Var1, Var1, 1
StringTrimLeft, LasttLetter, Var1, StrLen(Var1) - 1
If (LasttLetter = Chr(34))
StringTrimRight, Var1, Var1, 1
OriginalData[A_Index, "Type"] := "REG_None"
OriginalData[A_Index, "ValueName"] := Var1
StringTrimLeft, Var1, aaa, FoundPos + 8
OriginalData[A_Index, "Data"] := Var1
OriginalData[A_Index, "RawData"] := ""
}
}
{ ;REG_SZ & REG_NONE Process2
SearchString = @=hex(0):
IfInString, aaa, @=hex(0):
{
StringTrimLeft, Var1, aaa, 9
OriginalData[A_Index, "ValueName"] := ""
If Var1
{
StringLeft, xxx, Var1, 1
StringRight, yyy, Var1, 1
If (xxx = Chr(34))
StringTrimLeft, Var1, Var1, 1
If (yyy = Chr(34))
StringTrimRight, Var1, Var1, 1
OriginalData[A_Index, "Data"] := Var1
OriginalData[A_Index, "Type"] := "REG_NONE"
}
Else
{
OriginalData[A_Index, "Data"] := ""
OriginalData[A_Index, "Type"] := "REG_SZ"
}
OriginalData[A_Index, "RawData"] := ""
}
}
{ ;REG_EXPAND_SZ Process1 @
SearchString = @=hex(2):
IfInString, aaa, @=hex(2):
{
OriginalData[A_Index, "ValueName"] := ""
StringTrimLeft, Var1, aaa, 9
Length := StrLen(Var1)
Var1 := StrReplace(Var1, "`,", "`,", OutputVarCount, -1)
If (OutputVarCount = (Length - 2) / 3)
{
Var1 := StrReplace(Var1, "`,",, OutputVarCount, -1)
OriginalData[A_Index, "Data"] := Var1
OriginalData[A_Index, "Type"] := "REG_EXPAND_SZ"
}
OriginalData[A_Index, "RawData"] := ""
}
}
{ ;REG_EXPAND_SZ Process2
SearchString = "=hex(2):
IfInString, aaa, "=hex(2):
{
FoundPos := InStr(aaa, SearchString,,,1)
StringTrimRight, Var1, aaa, StrLen(aaa) - FoundPos
StringTrimRight, FirstLetter, Var1, StrLen(Var1) - 1
If (FirstLetter = Chr(34))
StringTrimLeft, Var1, Var1, 1
StringTrimLeft, LasttLetter, Var1, StrLen(Var1) - 1
If (LasttLetter = Chr(34))
StringTrimRight, Var1, Var1, 1
OriginalData[A_Index, "Type"] := "REG_EXPAND_SZ"
OriginalData[A_Index, "ValueName"] := Var1
StringTrimLeft, Var1, aaa, FoundPos + 8
Length := StrLen(Var1)
Var1 := StrReplace(Var1, "`,", "`,", OutputVarCount, -1)
If (OutputVarCount = (Length - 2) / 3)
{
Var1 := StrReplace(Var1, "`,",, OutputVarCount, -1)
OriginalData[A_Index, "Data"] := Var1
}
OriginalData[A_Index, "RawData"] := ""
}
}
{ ;REG_MULTI_SZ Process
SearchString = "=hex(7):
IfInString, aaa, "=hex(7):
{
FoundPos := InStr(aaa, SearchString,,,1)
StringTrimRight, Var1, aaa, StrLen(aaa) - FoundPos
StringTrimRight, FirstLetter, Var1, StrLen(Var1) - 1
If (FirstLetter = Chr(34))
StringTrimLeft, Var1, Var1, 1
StringTrimLeft, LasttLetter, Var1, StrLen(Var1) - 1
If (LasttLetter = Chr(34))
StringTrimRight, Var1, Var1, 1
OriginalData[A_Index, "Type"] := "REG_MULTI_SZ"
OriginalData[A_Index, "ValueName"] := Var1
StringTrimLeft, Var1, aaa, FoundPos + 8
Length := StrLen(Var1)
Var1 := StrReplace(Var1, "`,", "`,", OutputVarCount, -1)
If (OutputVarCount = (Length - 2) / 3)
{
Var1 := StrReplace(Var1, "`,",, OutputVarCount, -1)
OriginalData[A_Index, "Data"] := Var1
}
OriginalData[A_Index, "RawData"] := ""
}
}
{ ;REG_QWORD Process
SearchString = "=hex(b):
IfInString, aaa, "=hex(b):
{
FoundPos := InStr(aaa, SearchString,,,1)
StringTrimRight, Var1, aaa, StrLen(aaa) - FoundPos
StringTrimRight, FirstLetter, Var1, StrLen(Var1) - 1
If (FirstLetter = Chr(34))
StringTrimLeft, Var1, Var1, 1
StringTrimLeft, LasttLetter, Var1, StrLen(Var1) - 1
If (LasttLetter = Chr(34))
StringTrimRight, Var1, Var1, 1
OriginalData[A_Index, "Type"] := "REG_QWORD"
OriginalData[A_Index, "ValueName"] := Var1
StringTrimLeft, Var1, aaa, FoundPos + 8
Length := StrLen(Var1)
Var1 := StrReplace(Var1, "`,", "`,", OutputVarCount, -1)
If (OutputVarCount = (Length - 2) / 3)
{
Var1 := StrReplace(Var1, "`,",, OutputVarCount, -1)
OriginalData[A_Index, "Data"] := Var1
}
OriginalData[A_Index, "RawData"] := ""
}
}
{ ;REG_RESOURCE_LIST Process "=hex(8):
SearchString = "=hex(8):
IfInString, aaa, "=hex(8):
{
FoundPos := InStr(aaa, SearchString,,,1)
StringTrimRight, Var1, aaa, StrLen(aaa) - FoundPos
StringTrimRight, FirstLetter, Var1, StrLen(Var1) - 1
If (FirstLetter = Chr(34))
StringTrimLeft, Var1, Var1, 1
StringTrimLeft, LasttLetter, Var1, StrLen(Var1) - 1
If (LasttLetter = Chr(34))
StringTrimRight, Var1, Var1, 1
OriginalData[A_Index, "Type"] := "REG_RESOURCE_LIST"
OriginalData[A_Index, "ValueName"] := Var1
StringTrimLeft, Var1, aaa, FoundPos + 8
Length := StrLen(Var1)
Var1 := StrReplace(Var1, "`,", "`,", OutputVarCount, -1)
If (OutputVarCount = (Length - 2) / 3)
{
Var1 := StrReplace(Var1, "`,",, OutputVarCount, -1)
OriginalData[A_Index, "Data"] := Var1
}
OriginalData[A_Index, "RawData"] := ""
}
}
{ ;REG_RESOURCE_REQUIREMENTS_LIST Process2 "=hex(a):
SearchString = "=hex(a):
IfInString, aaa, "=hex(a):
{
FoundPos := InStr(aaa, SearchString,,,1)
StringTrimRight, Var1, aaa, StrLen(aaa) - FoundPos
StringTrimRight, FirstLetter, Var1, StrLen(Var1) - 1
If (FirstLetter = Chr(34))
StringTrimLeft, Var1, Var1, 1
StringTrimLeft, LasttLetter, Var1, StrLen(Var1) - 1
If (LasttLetter = Chr(34))
StringTrimRight, Var1, Var1, 1
OriginalData[A_Index, "Type"] := "REG_RESOURCE_REQUIREMENTS_LIST"
OriginalData[A_Index, "ValueName"] := Var1
StringTrimLeft, Var1, aaa, FoundPos + 8
Length := StrLen(Var1)
Var1 := StrReplace(Var1, "`,", "`,", OutputVarCount, -1)
If (OutputVarCount = (Length - 2) / 3)
{
Var1 := StrReplace(Var1, "`,",, OutputVarCount, -1)
OriginalData[A_Index, "Data"] := Var1
}
OriginalData[A_Index, "RawData"] := ""
}
}
{ ;REG_FULL_RESOURCE_DESCRIPTOR Process "=hex(9):
SearchString = "=hex(9):
IfInString, aaa, "=hex(9):
{
FoundPos := InStr(aaa, SearchString,,,1)
StringTrimRight, Var1, aaa, StrLen(aaa) - FoundPos
StringTrimRight, FirstLetter, Var1, StrLen(Var1) - 1
If (FirstLetter = Chr(34))
StringTrimLeft, Var1, Var1, 1
StringTrimLeft, LasttLetter, Var1, StrLen(Var1) - 1
If (LasttLetter = Chr(34))
StringTrimRight, Var1, Var1, 1
OriginalData[A_Index, "Type"] := "REG_FULL_RESOURCE_DESCRIPTOR"
OriginalData[A_Index, "ValueName"] := Var1
StringTrimLeft, Var1, aaa, FoundPos + 8
Length := StrLen(Var1)
Var1 := StrReplace(Var1, "`,", "`,", OutputVarCount, -1)
If (OutputVarCount = (Length - 2) / 3)
{
Var1 := StrReplace(Var1, "`,",, OutputVarCount, -1)
OriginalData[A_Index, "Data"] := Var1
}
OriginalData[A_Index, "RawData"] := ""
}
}
{ ;REG_DWORD Process3
SearchString = "=hex(4):
IfInString, aaa, "=hex(4):
{
FoundPos := InStr(aaa, SearchString,,,1)
StringTrimRight, Var1, aaa, StrLen(aaa) - FoundPos
StringTrimRight, FirstLetter, Var1, StrLen(Var1) - 1
If (FirstLetter = Chr(34))
StringTrimLeft, Var1, Var1, 1
StringTrimLeft, LasttLetter, Var1, StrLen(Var1) - 1
If (LasttLetter = Chr(34))
StringTrimRight, Var1, Var1, 1
OriginalData[A_Index, "Type"] := "REG_DWORD"
OriginalData[A_Index, "ValueName"] := Var1
StringTrimLeft, Var1, aaa, FoundPos + 8
Length := StrLen(Var1)
If Length > 2
{
Var1 := StrReplace(Var1, "`,", "`,", OutputVarCount, -1)
If (OutputVarCount = (Length - 2) / 3)
{
Var1 := StrReplace(Var1, "`,",, OutputVarCount, -1)
OriginalData[A_Index, "Data"] := Var1
}
}
Else
OriginalData[A_Index, "Data"] := Var1
OriginalData[A_Index, "RawData"] := ""
}
}
{ ;REG_SZ Process2 @
SearchString = @="
IfInString, aaa, @="
{
OriginalData[A_Index, "Type"] := "REG_SZ"
OriginalData[A_Index, "ValueName"] := ""
StringTrimLeft, Var1, aaa, 3
StringTrimRight, Var1, Var1, 1
OriginalData[A_Index, "Data"] := Var1
OriginalData[A_Index, "RawData"] := ""
}
}
{ ;REG_BINARY Process2 @=hex:
SearchString = @=hex:
IfInString, aaa, @=hex:
{
OriginalData[A_Index, "Type"] := "Yet2Identify5"
OriginalData[A_Index, "ValueName"] := ""
StringTrimLeft, Var1, aaa, FoundPos + 6
Length := StrLen(Var1)
If Length > 2
{
Var1 := StrReplace(Var1, "`,", "`,", OutputVarCount, -1)
If (OutputVarCount = (Length - 2) / 3)
{
Var1 := StrReplace(Var1, "`,",, OutputVarCount, -1)
OriginalData[A_Index, "Data"] := Var1
}
}
Else
OriginalData[A_Index, "Data"] := Var1
OriginalData[A_Index, "Type"] := "REG_BINARY"
OriginalData[A_Index, "RawData"] := ""
}
}
{ ;Hidden Data Types Process
HiddenDataTypes := ["1f4","1f5",201,220,221,222,223,227,228,"22b","22c","22e","22f",232,238,239,"23d","3e8","e"]
vRef := A_Index
Loop, 19
{
xxx := HiddenDataTypes[A_Index]
SearchString = @=hex(%xxx%):
IfInString, aaa, %SearchString%
{
OriginalData[vRef, "ValueName"] := ""
bbb := % "0x" HiddenDataTypes[A_Index]
OriginalData[vRef, "Type"] := bbb
Length := StrLen(SearchString)
StringTrimLeft, Var1, aaa, Length
OriginalData[vRef, "Data"] := Var1
OriginalData[vRef, "RawData"] := ""
Break
}
}
}
{ ;Fix Escape Character Process1: In Value Names
bbb := OriginalData[A_Index, "ValueName"]
ModStr1 := StrReplace(bbb, Chr(47) Chr(47), Chr(47))
ModStr2 := StrReplace(ModStr1, Chr(47) Chr(34), Chr(34))
OriginalData[A_Index, "ValueName"] := ModStr2
}
{ ;Fix Escape Character Process2: In Data
ccc := OriginalData[A_Index, "Data"]
ModStr1 := StrReplace(ccc, Chr(47) Chr(47), Chr(47))
ModStr2 := StrReplace(ModStr1, Chr(47) Chr(34), Chr(34))
OriginalData[A_Index, "Data"] := ModStr2
}
GuiControl,, MyProgress, +1
}
}
{ ;Check if any unaddressed RawData is Left
UnAddressedCount = 0
Loop, % OriginalData.MaxIndex()
If OriginalData[A_Index, "RawData"]
{
UnAddressedCount++
FileAppend, % OriginalData[A_Index, "RawData"] "`n", WhyDidILeaveThese.reg
}
If UnAddressedCount > 0
{
MsgBox, % UnAddressedCount " of " KeyPos.MaxIndex() " are not recognized"
ErrorProcedure(Error3)
}
}
{ ;Check Number of Keys in multipe ways
Count1 = 0
Count2 = 0
Loop, % OriginalData.MaxIndex()
{
If OriginalData[A_Index, "KeyName"]
Count1++
If OriginalData[A_Index, "Type"] = "Key"
Count2++
}
IfNotEqual, Count1, %Count2%
ErrorProcedure(Error4)
}
{ ;Relating Keys to Values
Loop, % KeyPos.MaxIndex()
{
aaa := KeyPos[A_Index]
bbb := KeyPos[A_Index + 1]
If (A_Index = KeyPos.MaxIndex())
bbb := OriginalData.MaxIndex() + 1
ccc := bbb - aaa - 1
If ccc > 0
Loop, % ccc
OriginalData[aaa + A_Index, "RefKey"] := aaa
}
}
{ ;Check if any Key-Value References are missing
RefErrCnt = 0
Loop, % OriginalData.MaxIndex()
{
aaa := OriginalData[A_Index, "Type"]
If (aaa <> "Key")
If OriginalData[A_Index, "RefKey"] <>
{
RefErrCnt++
FileAppend, % OriginalData[A_Index, "KeyName"] ", " OriginalData[A_Index, "ValueName"] ", " OriginalData[A_Index, "Type"] ", " OriginalData[A_Index, "Data"] ", " OriginalData[A_Index, "RefKey"]"`n", MissingKeyReferences.reg
}
}
If RefErrCnt > 0
MsgBox, % "Errors Found: " RefErrCnt
}
{ ;Check if any data types are not addressed
UnIdentifiedCount = 0
Loop, % OriginalData.MaxIndex()
If OriginalData[A_Index, "Type"] <>
{
UnIdentifiedCount++
UnIdentified := UnIdentified "`n" OriginalData[A_Index, "RawData"]
}
If UnIdentifiedCount > 0
{
MsgBox, % OriginalData.MaxIndex() "`n" UnIdentifiedCount
FileAppend, % UnIdentified, UnIdentified.reg
}
}
{ ;Check if any Values are yet to be identified
Yet2IdentifyCount = 0
Loop, % OriginalData.MaxIndex()
If OriginalData[A_Index, "RawData"]
{
If (SubStr(OriginalData[A_Index, "RawData"], 1, 5) = "HKEY_") <>
{
Yet2IdentifyCount++
Yet2Identify := Yet2Identify "`n" OriginalData[A_Index, "RawData"]
}
}
If Yet2IdentifyCount > 0
{
MsgBox, % "Yet to identify:" Yet2IdentifyCount
FileAppend, % Yet2Identify, Yet2Identify.reg
}
GuiControl,, MyProgress, +10
}
{ ;Generate Script
DetailsReport = %DetailsReport%`nConverting Data.....
GuiControl,, OpDetails, %DetailsReport%
ControlSend Edit2, ^{End}, A
Loop, 4
{
File%A_Index% = %A_Temp%\Reg2Ahk%A_Index%.db
FileDelete, % File%A_Index%
}
FileAppend, `;Registry Keys to be Added`n, %File1%
FileAppend, `;Registry Values to be written`n, %File2%
FileAppend, `;Values to be written NonCompatibleBatch`n, %File3%
FileAppend, Windows Registry Editor Version 5.00`n, %File4%
KeyCount = 1
ValueCount = 1
NonCompatible1 = 1
NonCompatible2 = 1
Loop, % OriginalData.MaxIndex()
{
RType := OriginalData[A_Index, "Type"]
Ref := OriginalData[A_Index, "RefKey"]
If !Ref
RKey := OriginalData[A_Index, "KeyName"]
Else
RKey := OriginalData[Ref, "KeyName"]
RVal := OriginalData[A_Index, "ValueName"]
RData := OriginalData[A_Index, "Data"]
If (RType = "Key")
{
WriteKeysScript := % "RegKey" KeyCount " = " RKey
FileAppend, % "`n" WriteKeysScript, %File1%
KeyCount++
}
If RType in REG_SZ,REG_EXPAND_SZ,REG_MULTI_SZ,REG_DWORD,REG_BINARY
{
ValuesScript := "RegWrite, " RType ", " RKey ", " RVal ", " RData
FileAppend, % ValuesScript "`n", %File2%
ValueCount++
}
If RType in REG_NONE,REG_QWORD
{
NonCompatible1 := "Run, %ComSpec% /c " """" "Reg.exe Add " RKey " /v " RVal " /t " RType " /d " RData """" ",, Hide"
FileAppend, % NonCompatible1 "`n", %File3%
NonCompatible1++
}
if RType in 0x1f4,0x1f5,0x201,0x220,0x221,0x222,0x223,0x227,0x228,0x22b,0x22c,0x22e,0x22f,0x232,0x238,0x239,0x23d,0x3e8,0xe
{
FileAppend, % "`n[" RKey "]`n", %File4%
If !RVal
ddd = @
Else
ddd := % """" RVal """"
StringTrimLeft, eee, RType, 2
eee := % "=hex(" eee "):"
FileAppend, % ddd eee RData "`n", %File4%
NonCompatible2++
}
GuiControl,, MyProgress, +1
}
Bar2 := Bar1 /2
KeyCount := KeyCount - 1
ValueCount := ValueCount - 1
NonCompatible1 := NonCompatible1 - 1
NonCompatible2 := NonCompatible2 - 1
LoopScriptforKeys = `nLoop, %KeyCount%`n{`n`tKey2Write := KeyCount`%A_Index`%`n`tRegRead, OutputVar, `%Key2Write`%`n`tIf ErrorLevel`n`t`tRegWrite, REG_SZ, `%Key2Write`%`n}
FileAppend, `n%LoopScriptforKeys%`n, %File1%
FileAppend, `n, %File2%
FileAppend, `n, %File3%
FileAppend, `n, %File4%
OriginalData := ""
EmptyMem()
GuiControl,, MyProgress, +%Bar2%
}
{ ;Preparing Output
Loop, 4
{
FileRead, Output%A_Index%, % File%A_Index%
FileDelete, % File%A_Index%
}
FinalReg2Ahk := Output1 "`n" Output2 "`n" Output3 "`n" "/*`nSkipped Data`n" Output4 "`n*/"
Loop, 4
Output%A_Index% := ""
EmptyMem()
}
ElapsedTime := A_TickCount - StartTime
ElapsedTime := ElapsedTime / 1000 / 60
DetailsReport = %DetailsReport%`nConversion Completed at %A_Hour%:%A_Min%:%A_Sec%`nTime taken for Conversion %ElapsedTime% Minutes`nPlease Wait... While the Results are being displayed.`nDepending on the file size, it may take some time
GuiControl,, OpDetails, %DetailsReport%
ControlSend Edit2, ^{End}, A
GuiControl,, ShowContents, %FinalReg2Ahk%
GuiControl,, MyProgress, +%Bar2%
DetailsReport = %DetailsReport%`nProcess Completed
GuiControl,, OpDetails, %DetailsReport%
ControlSend Edit2, ^{End}, A
GuiControl, Enable, SaveBtn
EmptyMem()
return
}
Ahk2RegConverion:
{ ;Autohotkey to Registry Conversion
MsgBox, This feature will be implemented in the next version
return
}
SelectOutFile:
{ ;Output File Selection
If (MainOperation = "Convert to AHK")
GoSub, SaveAhk
else If (MainOperation = "Convert to REG")
GoSub, SaveReg
return
}
SaveAhk:
{
FileSelectFile, SelOutFile, 16, , Save Ahk Script, *.ahk
if ErrorLevel
return
FileAppend, %FinalReg2Ahk%, %SelOutFile%.ahk
return
}
SaveReg:
return
{ ;Help Section
Help:
MsgBox, This feature will be implemented in the next version
return
}
{ ;Functions
VarLineBlanksFix(InString) { ;Function1: Delete Blank Lines in a variable
InString := RegExReplace(InString, "\R+\R", "`r`n") ; Remove all Blank Lines
If (Asc(SubStr(InString, 1, 1) ) = 13 && Asc(SubStr(InString, 2, 1) ) = 10) ; Check First Line for Blank
StringTrimLeft, Instring, Instring, 2 ; Remove First Blank Line
varlength := StrLen(InString)
If (Asc(SubStr(InString, varlength-1, 1) ) = 13 && Asc(SubStr(InString, varlength, 1) ) = 10) ; Check Last Line for Blank
StringTrimRight, InString, InString, 2 ; Remove Last Blank Line
Return Instring
}
ErrorProcedure(ErrorNumber) { ;Function2: Display Error Messages
MsgBox, %ErrorNumber%
ExitApp
}
EmptyMem(PID="AHK Rocks"){
pid:=(pid="AHK Rocks") ? DllCall("GetCurrentProcessId") : pid
h:=DllCall("OpenProcess", "UInt", 0x001F0FFF, "Int", 0, "Int", pid)
DllCall("SetProcessWorkingSetSize", "UInt", h, "Int", -1, "Int", -1)
DllCall("CloseHandle", "Int", h)
}
}
The converted script is divided into 4 sections
1. The First Section only write the keys. All the "keys to be written" are assigned to "numbered variables" in the converted script. And at the end a Loop is given, so that it won’t overwrite the existing keys
2. The Second is Ahk Support Registry data type values (REG_SZ,REG_EXPAND_SZ,REG_MULTI_SZ,REG_DWORD,REG_BINARY) using RegWrite Function
3. Third, Data types that are not supported by RegWrite but with Windows Reg Command, using Commandshell
4. Fourth: There are 20+ hidden data types in Windows Registry. These lines are skipped and extracted as separate Reg file included in the same Script, but marked as comments. You can assign it to a variable and then write it to a temporary file and import, or you can copy the text and create a reg file. Although I doubt the usage of these data types. But this tool helps. Saves a lot of time if you are working with big files
Bugs Expected
1. I have seen in the standard registry file there are special characters in the data section. Especially, comment ";" symbol. I expect, there would be little problem with that symbol. I haven't tested yet. If any let me know.
2. I tested with a complete registry back up of 350MB Size file. So far so good. It took 13 minutes to complete the process
I appreciate your suggestions and any valid pointers.
Meanwhile you guys can test and let me know if there are any other bugs.
Thank you all. This forum is very helpful and you guys are all wonderful.