To Share: Registry File Reg to Ahk Converter

Post your working scripts, libraries and tools for AHK v1.1 and older
Nagendra
Posts: 14
Joined: 25 May 2017, 02:23

To Share: Registry File Reg to Ahk Converter

10 Nov 2017, 06:27

Hi All.

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.
Image

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)
}
}
Couple of Pointers about the Tool
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.
Last edited by Nagendra on 15 Jul 2018, 11:45, edited 2 times in total.
bradford
Posts: 1
Joined: 16 Feb 2022, 11:58

Re: To Share: Registry File Reg to Ahk Converter

16 Feb 2022, 12:01

I literally just created an account to say THANK YOU VERY MUCH!!! This was super helpful and worked perfectly!

Return to “Scripts and Functions (v1)”

Who is online

Users browsing this forum: No registered users and 134 guests