DXRW4E Posted September 16, 2012 Posted September 16, 2012 (edited) Hi All, Sorry for my EnglishI searched the forum a function like that, and not found, indeed, there are many topics request regarding all this function, and I have done this, I did not know what name to put them RegEnumKeyToArray or RegListToArray or ect ect in the end I chose _RegEnumKeyValEx (_RegEnumKeyEx & _RegEnumValEx), the function does almost everything (also includes $sFilter as the >_FileListToArrayEx), and works really fast too expandcollapse popup#include-once ; #UDF# ======================================================================================================================= ; Title .........: Reads\Search the name of a Key\Subkey\Value ; AutoIt Version : 3.3.8.1 ; Language ......: English ; Description ...: Lists all Keys\Subkeys\Values in a specified registry key ; Author(s) .....: DXRW4E ; Notes .........: ; =============================================================================================================================== ; #CURRENT# ===================================================================================================================== ;~ _RegEnumKeyEx ;~ _RegEnumValEx ; =============================================================================================================================== #Region ;**** Global constants and vars **** Global Const $sValueTypes[12] = ["REG_NONE","REG_SZ","REG_EXPAND_SZ","REG_BINARY","REG_DWORD","REG_DWORD_BIG_ENDIAN","REG_LINK","REG_MULTI_SZ","REG_RESOURCE_LIST","REG_FULL_RESOURCE_DESCRIPTOR","REG_RESOURCE_REQUIREMENTS_LIST","REG_QWORD"] #EndRegion ;**** Global constants and vars **** ; #FUNCTION# ======================================================================================================================== ; Name...........: _RegEnumKeyEx ; Description ...: Lists all subkeys in a specified registry key ; Syntax.........: _RegEnumKeyEx($KeyName[, $iFlag = 0[, $sFilter = "*"]]) ; Parameters ....: $KeyName - The registry key to read. ; $iFlag - Optional specifies Recursion (add the flags together for multiple operations): ; |$iFlag = 0 (Default) All Key-SubKeys Recursive Mod ; |$iFlag = 1 All SubKeys Not Recursive Mod ; |$iFlag = 2 Include in ArrayList in the first element $KeyName ; |$iFlag = 16 $sFilter do Case-Sensitive matching (By Default $sFilter do Case-Insensitive matching) ; |$iFlag = 32 Disable the return the count in the first element - effectively makes the array 0-based (must use UBound() to get the size in this case). ; By Default the first element ($array[0]) contains the number of strings returned, the remaining elements ($array[1], $array[2], etc.) ; |$iFlag = 64 $sFilter is REGEXP Mod, See Pattern Parameters in StringRegExp ; |$iFlag = 128 Enum value's name (_RegEnumKeyEx Return a 2D array, maximum Array Size limit is 3999744 Key\Value) ; |$iFlag = 256 Reads a value data, this flag will be ignored if the $iFlag = 128 is not set ; $sFilter - Optional the filter to use, default is *. (Multiple filter groups such as "All "*.XXx|*.YYY|*.ZZZ") ; Search the Autoit3 helpfile for the word "WildCards" For details. ; $vFilter - Optional the filter to use for ValueName, $vFilter will be ignored if the $iFlag = 128 is not set ; default is *. (Multiple filter groups such as "All "*.XXx|*.YYY|*.ZZZ") Search the Autoit3 helpfile for the word "WildCards" For details. ; $iValueTypes - Optional, set Value Types to search (Default $iValueTypes = 0 Read All), $iValueTypes will be ignored if the $iFlag = 128 is not set ; (add the flags together for multiple operations): ; 1 = REG_SZ ; 2 = REG_EXPAND_SZ ; 3 = REG_BINARY ; 4 = REG_DWORD ; 5 = REG_DWORD_BIG_ENDIAN ; 6 = REG_LINK ; 7 = REG_MULTI_SZ ; 8 = REG_RESOURCE_LIST ; 9 = REG_FULL_RESOURCE_DESCRIPTOR ; 10 = REG_RESOURCE_REQUIREMENTS_LIST ; 11 = REG_QWORD ; Return values .: Success - Return Array List (See Remarks) ; Failure - @Error ; |1 = Invalid $sFilter ; |2 = No Key-SubKey(s) Found ; |3 = Invalid $vFilter ; |4 = No Value-Name(s) Found ; Author ........: DXRW4E ; Modified.......: ; Remarks .......: The array returned is one-dimensional and is made up as follows: ; $array[0] = Number of Key-SubKeys returned ; $array[1] = 1st Key\SubKeys ; $array[2] = 2nd Key\SubKeys ; $array[3] = 3rd Key\SubKeys ; $array[n] = nth Key\SubKeys ; ; If is set the $iFlag = 128 The array returned is 2D array and is made up as follows: ; $array[0][0] = Number of Key-SubKeys returned ; $array[1][0] = 1st Key\SubKeys ; $array[1][1] = 1st Value name ; $array[1][2] = 1st Value Type (REG_NONE or REG_SZ or REG_EXPAND_SZ ect ect) ; $array[1][3] = 1st Value Data (If is set $iFlag = 256 Else Value Data = "") ; $array[2][0] = 2nd Key\SubKeys ; $array[2][1] = 2nd Value name ; $array[2][2] = 2nd Value Type (REG_NONE or REG_SZ or REG_EXPAND_SZ ect ect) ; $array[2][3] = 2nd Value Data (If is set $iFlag = 256 Else Value Data = "") ; $array[n][0] = nth Key\SubKeys ; Related .......: _RegEnumValEx() ; Link ..........: ; Example .......: _RegEnumKeyEx("HKEY_CURRENT_USER\Software\AutoIt v3") ; Note ..........: ; =================================================================================================================================== Func _RegEnumKeyEx($KeyName, $iFlag = 0, $sFilter = "*", $vFilter = "*", $iValueTypes = 0) If StringRegExp($sFilter, StringReplace("^\s*$|\v|\\|^\||\|\||\|$", Chr(BitAND($iFlag, 64) + 28) & "\|^\||\|\||\|$", "\\\\")) Then Return SetError(1, 0, "") Local $IndexSubKey[101] = [100], $SubKeyName, $BS = "\", $sKeyList, $I = 1, $sKeyFlag = BitAND($iFlag, 1), $sKeyFilter = StringReplace($sFilter, "*", "") If BitAND($iFlag, 2) Then $sKeyList = @LF & $KeyName If Not BitAND($iFlag, 64) Then $sFilter = StringRegExpReplace(BitAND($iFlag, 16) & "(?i)(", "16\(\?\i\)|\d+", "") & StringRegExpReplace(StringRegExpReplace(StringRegExpReplace(StringRegExpReplace($sFilter, "[^*?|]+", "\\Q$0\\E"), "\\E(?=\||$)", "$0\$"), "(?<=^|\|)\\Q", "^$0"), "\*+", ".*") & ")" While $I $IndexSubKey[$I] += 1 $SubKeyName = RegEnumKey($KeyName, $IndexSubKey[$I]) If @error Then $IndexSubKey[$I] = 0 $I -= 1 $KeyName = StringLeft($KeyName, StringInStr($KeyName, "\", 1, -1) - 1) ContinueLoop EndIf If $sKeyFilter Then If StringRegExp($SubKeyName, $sFilter) Then $sKeyList &= @LF & $KeyName & $BS & $SubKeyName Else $sKeyList &= @LF & $KeyName & $BS & $SubKeyName EndIf If $sKeyFlag Then ContinueLoop $I += 1 If $I > $IndexSubKey[0] Then $IndexSubKey[0] += 100 ReDim $IndexSubKey[$IndexSubKey[0] + 1] EndIf $KeyName &= $BS & $SubKeyName WEnd If Not $sKeyList Then Return SetError(2, 0, "") If BitAND($iFlag, 128) <> 128 Then Return StringSplit(StringTrimLeft($sKeyList, 1), @LF, StringReplace(BitAND($iFlag, 32), "32", 2)) $sKeyList = _RegEnumValEx(StringSplit(StringTrimLeft($sKeyList, 1), @LF), $iFlag, $vFilter, $iValueTypes) Return SetError(@Error, 0, $sKeyList) EndFunc ; #FUNCTION# ======================================================================================================================== ; Name...........: _RegEnumValEx ; Description ...: Lists all values in a specified registry key ; Syntax.........: _RegEnumValEx($KeyName[, $iFlag = 0[, $sFilter = "*"]]) ; Parameters ....: $KeyName - The registry key to read Or one-dimensional array RegKeyList ; use _RegEnumKeyEx() to get $RegKeyList (example $RegKeyList = [3, 1st Key\SubKeys, 2st Key\SubKeys, nth Key\SubKeys]) ; |$iFlag = 16 $sFilter do Case-Sensitive matching (By Default $sFilter do Case-Insensitive matching) ; |$iFlag = 32 Disable the return the count in the first element - effectively makes the array 0-based (must use UBound() to get the size in this case). ; By Default the first element ($array[0]) contains the number of strings returned, the remaining elements ($array[1], $array[2], etc.) ; |$iFlag = 64 $sFilter is REGEXP Mod, See Pattern Parameters in StringRegExp ; |$iFlag = 256 Reads a value data ; $sFilter - Optional the filter to use, default is *. (Multiple filter groups such as "All "*.XXx|*.YYY|*.ZZZ") ; Search the Autoit3 helpfile for the word "WildCards" For details. ; $iValueTypes - Optional, set Value Types to search (Default $iValueTypes = 0 Read All) ; (add the flags together for multiple operations): ; 1 = REG_SZ ; 2 = REG_EXPAND_SZ ; 3 = REG_BINARY ; 4 = REG_DWORD ; 5 = REG_DWORD_BIG_ENDIAN ; 6 = REG_LINK ; 7 = REG_MULTI_SZ ; 8 = REG_RESOURCE_LIST ; 9 = REG_FULL_RESOURCE_DESCRIPTOR ; 10 = REG_RESOURCE_REQUIREMENTS_LIST ; 11 = REG_QWORD ; Return values .: Success - Return Array List (See Remarks) ; Failure - @Error ; |3 = Invalid $sFilter ; |4 = No Value-Name(s) Found ; Author ........: DXRW4E ; Modified.......: ; Remarks .......: The array returned is 2D array and is made up as follows: ; $array[0][0] = Number of Key-SubKeys returned ; $array[1][0] = 1st Key\SubKeys ; $array[1][1] = 1st Value name ; $array[1][2] = 1st Value Type (REG_NONE or REG_SZ or REG_EXPAND_SZ ect ect) ; $array[1][3] = 1st Value Data (If is set $iFlag = 256 Else Value Data = "") ; $array[2][0] = 2nd Key\SubKeys ; $array[2][1] = 2nd Value name ; $array[2][2] = 2nd Value Type (REG_NONE or REG_SZ or REG_EXPAND_SZ ect ect) ; $array[2][3] = 2nd Value Data (If is set $iFlag = 256 Else Value Data = "") ; $array[n][0] = nth Key\SubKeys ; Related .......: _RegEnumKeyEx() ; Link ..........: ; Example .......: _RegEnumValEx("HKEY_CURRENT_USER\Software\AutoIt v3") ; Note ..........: ; =================================================================================================================================== Func _RegEnumValEx($aKeyList, $iFlag = 0, $sFilter = "*", $iValueTypes = 0) If StringRegExp($sFilter, "\v") Then Return SetError(3, 0, "") If Not IsArray($aKeyList) Then $aKeyList = StringSplit($aKeyList, @LF) Local $aKeyValList[1954][4], $iKeyVal = Int(BitAND($iFlag, 32) = 0), $sKeyVal = 1953, $sRegEnumVal, $iRegEnumVal, $RegRead = BitAND($iFlag, 256), $vFilter = StringReplace($sFilter, "*", "") If Not BitAND($iFlag, 64) Then $sFilter = StringRegExpReplace(BitAND($iFlag, 16) & "(?i)(", "16\(\?\i\)|\d+", "") & StringRegExpReplace(StringRegExpReplace(StringRegExpReplace(StringRegExpReplace($sFilter, "[^*?|]+", "\\Q$0\\E"), "\\E(?=\||$)", "$0\$"), "(?<=^|\|)\\Q", "^$0"), "\*+", ".*") & ")" For $i = 1 To $aKeyList[0] $iRegEnumVal = 0 While 1 If $iKeyVal = $sKeyVal Then If $sKeyVal = 3999744 Then ExitLoop $sKeyVal *= 2 ReDim $aKeyValList[$sKeyVal + 1][4] EndIf $aKeyValList[$iKeyVal][0] = $aKeyList[$i] $iRegEnumVal += 1 $sRegEnumVal = RegEnumVal($aKeyList[$i], $iRegEnumVal) If @Error <> 0 Then If $iRegEnumVal = 1 And $vFilter = "" Then $iKeyVal += 1 ExitLoop EndIf $aKeyValList[$iKeyVal][2] = $sValueTypes[@Extended] If BitAND(@Extended, $iValueTypes) <> $iValueTypes Then ContinueLoop If $vFilter And Not StringRegExp($sRegEnumVal, $sFilter) Then ContinueLoop $aKeyValList[$iKeyVal][1] = $sRegEnumVal If $RegRead Then $aKeyValList[$iKeyVal][3] = RegRead($aKeyList[$i], $sRegEnumVal) $iKeyVal += 1 WEnd Next $sRegEnumVal = $iKeyVal - Int(BitAND($iFlag, 32) = 0) If Not $sRegEnumVal Or ($sRegEnumVal = 1 And $vFilter = "" And $aKeyValList[$iKeyVal - $sRegEnumVal][2] = "") Then Return SetError(4, 0, "") ReDim $aKeyValList[$iKeyVal][4] If Not BitAND($iFlag, 32) Then $aKeyValList[0][0] = $iKeyVal - 1 Return $aKeyValList EndFuncexampleexpandcollapse popup#RequireAdmin #include <_RegEnumKeyValEx.au3> #include <Array.au3> Global $a, $t, $Error, $Extended, $KeyName ;$KeyName = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft" ;$KeyName = "HKEY_CLASSES_ROOT" ;104718 ;$KeyName = "HKEY_LOCAL_MACHINE\SOFTWARE\Classes" $KeyName = "HKEY_LOCAL_MACHINE\SOFTWARE\AutoIt v3" $t = TimerInit() ;$a = _RegEnumKeyEx($KeyName, 0, "Opti*Components") ; to find HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Setup\OptionalComponents ;$a = _RegEnumKeyEx($KeyName, 0, "*") $a = _RegEnumKeyEx($KeyName, 128 + 256 + 32 + 16, "*", "*vers*") $Error = @Error $Extended = @Extended $t = TimerDiff($t) ConsoleWrite("Timer = " & $t & @LF) ConsoleWrite("Return = " & $a & " - $Error = " & $Error & " - $Extended = " & $Extended & @LF) _ArrayDisplay($a) ;or $a = _RegEnumKeyEx("HKEY_LOCAL_MACHINE\SOFTWARE\AutoIt v3", 128 + 256) ;Return 2D array all Keys\Subkes\Values ect ect _ArrayDisplay($a) $a = _RegEnumKeyEx("HKEY_LOCAL_MACHINE\SOFTWARE\AutoIt v3", 128 + 256, "*","*Ver*on*") ;Return $a[2][4] = [[1],["HKEY_LOCAL_MACHINE\SOFTWARE\AutoIt v3\AutoIt","Version","REG_SZ","v3.3.8.1"]] _ArrayDisplay($a) $a = _RegEnumKeyEx("HKEY_LOCAL_MACHINE\SOFTWARE\AutoIt v3", 128 + 256 + 32, "*","*ver*on*") ;Return $a[1][4] = [["HKEY_LOCAL_MACHINE\SOFTWARE\AutoIt v3\AutoIt","Version","REG_SZ","v3.3.8.1"]] _ArrayDisplay($a) $a = _RegEnumKeyEx("HKEY_LOCAL_MACHINE\SOFTWARE\AutoIt v3", 128 + 256 + 16, "*","*ver*on*") ;Return @Error = 4 ($iFlag = 16 $sFilter do Case-Sensitive matching, Version <> version) ;_ArrayDisplay($a) $a = _RegEnumValEx("HKEY_LOCAL_MACHINE\SOFTWARE\AutoIt v3\AutoIt", 256,"*Ver*on*") ;Return $a[2][4] = [[1],["HKEY_LOCAL_MACHINE\SOFTWARE\AutoIt v3\AutoIt","Version","REG_SZ","v3.3.8.1"]] _ArrayDisplay($a)_RegEnumKeyValEx.au3 Edited October 30, 2014 by DXRW4E
supersonic Posted September 17, 2012 Posted September 17, 2012 DXRW4W, really nice - thanks for sharing!
DXRW4E Posted October 9, 2012 Author Posted October 9, 2012 Updated, Added $sFilter Case-sensitivity flag & Disable the return the count in the first element, for more see the first post Ciao.
jazzyjeff Posted October 10, 2012 Posted October 10, 2012 This is so awesome! What are the chances, because I have been trying to figure this out all day yesterday and now you've come along and made my life a million times easier! Thank you!
DXRW4E Posted October 20, 2012 Author Posted October 20, 2012 (edited) @jazzyjeff Thank You, You are welcome@AllUpdated, add $iFlag = 64 now you can use the $sFilter in RegExp Mod (See Pattern Parameters in StringRegExp )Ciao. Edited October 20, 2012 by DXRW4E
Chimaera Posted October 20, 2012 Posted October 20, 2012 Looks good Thanks for sharing If Ive just helped you ... miracles do happen. Chimaera CopyRobo() * Hidden Admin Account Enabler * Software Location From Registry * Find Display Resolution * _ChangeServices()
NDog Posted November 26, 2012 Posted November 26, 2012 DXRW4EIs there any chance you could add an option to return all sub values as well into a 2d array?This would make this function perfect!
DXRW4E Posted December 14, 2012 Author Posted December 14, 2012 Updated, add flags $iValueTypes Ciao.
Docfxit Posted October 30, 2014 Posted October 30, 2014 (edited) Thank you for the great script. I have added to your example: #include <_RegEnumKeyValEx.au3> I have changed in your example line 19: From: _ArrayDisplay($a, $a1) To _ArrayDisplay($a) Thank you, Docfxit Edited October 30, 2014 by Docfxit
DXRW4E Posted October 30, 2014 Author Posted October 30, 2014 Hi Docfxit, Thank you for reporting, already editupdated the example scriptCiao.
Chimaera Posted November 5, 2014 Posted November 5, 2014 (edited) Ive been working with this for uninstall keys and i wondered is there any way to have it show the ProgramName & InstallLocation keys in the array with the search? because often they are msi uninstallers so i cant tell what they are for? Code Im using #RequireAdmin #include <_RegEnumKeyValEx.au3> #include <Array.au3> Opt("TrayAutoPause",0) Global $UninstallList $sRegPath = 'HKCU\Software\Microsoft\Windows\CurrentVersion\Uninstall\|' & _ 'HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\|' & _ 'HKLM64\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\|' & _ 'HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\|' & _ 'HKCU64\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\' ;~ ================================================= Global $aRegPath = StringSplit($sRegPath, "|") ;~ _ArrayDisplay( $aRegPath) ;~ ================================================= Global $UninstallCheck, $UninstallKeys[0][4] For $regloop = 1 To $aRegPath[0] If IsArray($aRegPath) Then $UninstallCheck = _RegEnumKeyEx($aRegPath[$regloop], 128 + 256, "*","*UninstallS*") ;*UninstallS* ConsoleWrite('UninstallCheck Is Array & @error = ' & @error & @CRLF) ;~ _ArrayDisplay($UninstallCheck, "To concatenate", Default, 8) _ArrayConcatenate($UninstallKeys, $UninstallCheck, 1) ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ConsoleWrite('UninstallArray & @error = ' & @error & @CRLF) ;~ _ArrayDisplay($UninstallKeys, "Concatenated", Default, 8) Else ConsoleWrite('UninstallCheck Not Array ' & @CRLF) ContinueLoop EndIf Next _ArrayDisplay($UninstallKeys, "Concatenated", Default, 8) This shows me all the uninstallers but not what they belong to Suggestions? Edited November 5, 2014 by Chimaera If Ive just helped you ... miracles do happen. Chimaera CopyRobo() * Hidden Admin Account Enabler * Software Location From Registry * Find Display Resolution * _ChangeServices()
DXRW4E Posted November 5, 2014 Author Posted November 5, 2014 (edited) Hi Chimaera, we are offtopic because this is not about the RegEnumKeyEx, but the msi setup http://technet.microsoft.com/en-us/library/bb892810.aspx however here expandcollapse popup#RequireAdmin #include <_RegEnumKeyValEx.au3> #include <Array.au3> Global Const $sPatternGUID = "\{?(.)(.)(.)(.)(.)(.)(.)(.)-?(.)(.)(.)(.)-?(.)(.)(.)(.)-?(.)(.)(.)(.)-?(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)\}?" Global Const $sComponentIdPattern = "$8$7$6$5$4$3$2$1$12$11$10$9$16$15$14$13$18$17$20$19$22$21$24$23$26$25$28$27$30$29$32$31" ;;Global Const $scGUIDPattern = "(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)" Global Const $sGUIDPattern = "{$8$7$6$5$4$3$2$1-$12$11$10$9-$16$15$14$13-$18$17$20$19-$22$21$24$23$26$25$28$27$30$29$32$31}" ; #FUNCTION# ======================================================================================================================================================= ; Name...........: _GetCompressedGUID ; Description ...: Connvert String GUID to String Compressed GUID ; Syntax.........: _GetCompressedGUID($sGUID[, $iFlags]) ; Parameters ....: $sGUID - String GUID ; $iFlags - Optional, (Default = 0), if $iFlags $sGUID must be contain String Compressed GUID ; Return values .: String Product Properties, and set error ; Author ........: DXRW4E ; Modified.......: ; Remarks .......: ; Link ..........: ; Example .......: ; Note ..........: ; ================================================================================================================================================================== Func _GetCompressedGUID($sGUID, $iFlags = 0) Return StringRegExpReplace($sGUID, $sPatternGUID, ($iFlags ? $sGUIDPattern : $sComponentIdPattern)) EndFunc Global $aUninstallCheck, $aKeyList[1] = [0], $aMsiPath, $sMsiPath = "HKLM\SOFTWARE\Classes\Installer\Products\" Global $aRegPath = 'HKCU\Software\Microsoft\Windows\CurrentVersion\Uninstall\|' & _ 'HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\|' & _ 'HKLM64\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\|' & _ 'HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\|' & _ 'HKCU64\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\' $aRegPath = StringSplit($aRegPath, "|") For $i = 1 To $aRegPath[0] $aRegEnumKeyEx = _RegEnumKeyEx($aRegPath[$i], 256, "*","*") ;*UninstallS* If Not @Error Then ReDim $aKeyList[$aKeyList[0] + $aRegEnumKeyEx[0] + 1] For $y = 1 To $aRegEnumKeyEx[0] $aKeyList[$y + $aKeyList[0]] = $aRegEnumKeyEx[$y] Next $aKeyList[0] += $aRegEnumKeyEx[0] EndIf Next If $aKeyList[0] Then ;;_RegEnumValEx("HKEY_LOCAL_MACHINE\SOFTWARE\AutoIt v3\AutoIt", 256,"*Ver*on*") or _RegEnumValEx($aKey, 256,"*Ver*on*") $aUninstallCheck = _RegEnumValEx($aKeyList, 256, "*UninstallS*") If Not @Error Then For $i = 1 To $aUninstallCheck[0][0] $aMsiPath = StringRegExp($aUninstallCheck[$i][3], "^(?i)\h*MsiExec.exe\h+/\w\h*(\{[^\}]+\})", 1) If @Error then ContinueLoop ; Example ;; Example $DotNet4 = "HKLM\SOFTWARE\Classes\Installer\Products\%NetFX_Client_InstallerCode%" ;;RegRead($DotNet4, "AdvertiseFlags") - > %REG_DWORD%,"388" ;;RegRead($DotNet4, "Assignment") - > %REG_DWORD%,"1" ;;RegRead($DotNet4, "AuthorizedLUAApp") - > %REG_DWORD%,"0" ;;RegRead($DotNet4, "Clients") - > %REG_MULTI_SZ%,":" ;;RegRead($DotNet4, "InstanceType") - > %REG_DWORD%,"0" ;;RegRead($DotNet4, "Language") - > %REG_DWORD%,"0" ;;RegRead($DotNet4, "PackageCode") - > %REG_SZ%,"%NetFX_Client_PackageCode%" ;;RegRead($DotNet4, "ProductName", ,"%CoreProductName%" ;;RegRead($DotNet4, "Version") - > %REG_DWORD%,"67139183" ;;RegRead($DotNet4 & "\SourceList", "LastUsedSource") - > %REG_EXPAND_SZ%,"n;1;%SystemRoot%\Windows\Installer\" ;;RegRead($DotNet4 & "\SourceList", "PackageName") - > "netfx_Core_x86.msi" ;;RegRead($DotNet4 & "\SourceList\Media" ,"1") -> REG_SZ%";1" ;;RegRead($DotNet4 & "\SourceList\Net" ,"1") - > %REG_EXPAND_SZ%,"%SystemRoot%\Windows\Installer\" ; $aUninstallCheck[$i][3] &= @LF & RegRead($sMsiPath & _GetCompressedGUID($aMsiPath[0]) & "\SourceList", "PackageName") $aUninstallCheck[$i][3] &= @LF & StringRegExpReplace(RegRead($sMsiPath & _GetCompressedGUID($aMsiPath[0]) & "\SourceList", "LastUsedSource"), "^.*;(?=\w)", "") ; ;;$aTemp = _RegEnumKeyEx($sMsiPath & _GetCompressedGUID($aMsiPath[0]), 128 + 256, "*","*") ;;If Not @Error Then ;; $aTemp[0][1] = $aUninstallCheck[$i][3] ;; $aUninstallCheck[$i][3] = $aTemp ;;EndIf ;;;; _ArrayDisplay($aUninstallCheck[$i][3]) Next EndIf EndIf _ArrayDisplay($aUninstallCheck) ;~ For $i = 1 To $aUninstallCheck[0][0] ;~ If IsArray($aUninstallCheck[$i][3]) Then ;~ ;;msi mod ;~ $sUinstallComand = ($aUninstallCheck[$i][3])[0][1] ;~ Else ;~ ;; ;~ EndIf ;~ Next Ciao. Edited November 5, 2014 by DXRW4E
Chimaera Posted November 5, 2014 Posted November 5, 2014 Thats amazing i didnt even know they could be deciphered like that Ill have to sit and read up Many thanks If Ive just helped you ... miracles do happen. Chimaera CopyRobo() * Hidden Admin Account Enabler * Software Location From Registry * Find Display Resolution * _ChangeServices()
DXRW4E Posted November 5, 2014 Author Posted November 5, 2014 (edited) @OffTopicThats amazing i didnt even know they could be deciphered like thatWindows Installer GUID Compressed GUIDlook also Darwin Descriptorsexpandcollapse popup#Region ;Encoding-Decoding Base85 ;; tables for encoding and decoding base85 Global Const $aTable_Dec85[0x80] = [ _ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, _ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, _ 0xff,0x00,0xff,0xff,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0xff, _ 0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,0x14,0x15,0xff,0xff,0xff,0x16,0xff,0x17, _ 0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27, _ 0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,0x30,0x31,0x32,0x33,0xff,0x34,0x35,0x36, _ 0x37,0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,0x40,0x41,0x42,0x43,0x44,0x45,0x46, _ 0x47,0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f,0x50,0x51,0x52,0xff,0x53,0x54,0xff] Global Const $aTable_Enc85[85] = [ _ "!","$","%","&","'","(",")","*","+",",","-",".","0","1","2","3","4","5","6","7","8", _ "9","=","?","@","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q", _ "R","S","T","U","V","W","X","Y","Z","[","]","^","_","`","a","b","c","d","e","f","g", _ "h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","{","}","~"] ; #FUNCTION# ======================================================================================================================================================= ; Name...........: _Decode_Base85_GUID ; Description ...: Converts a (base85 encoded GUID) Darwin Descriptor into a StringGUID, String Base85 encoded GUIDs should be 20 characters long. ; Syntax.........: _Decode_Base85_GUID($sDarwinDes) ; Parameters ....: $sDarwinDes - String (base85 encoded) Darwin Descriptor ; Return values .: If the function succeeds, return StringGUID. If the function fails, return False ; Author ........: DXRW4E ; Modified.......: ; Remarks .......: ; Link ..........: ; Example .......: ; Note ..........: This function was inspired by ReactOS Project ; http://www.reactos.org/ ; * Copyright 2002-2005 Mike McCormack for CodeWeavers ; * Copyright 2005 Aric Stewart for CodeWeavers ; ================================================================================================================================================================== Func _Decode_Base85_GUID($sDarwinDes) Local $dData = 0, $dBase = 1, $tGUID = DllStructCreate("struct; ulong Data1;ulong Data2;ulong Data3;ulong Data4;endstruct") If StringLen($sDarwinDes) < 20 Then Return SetError(1, 0, False) $sDarwinDes = StringToASCIIArray($sDarwinDes) For $i = 0 to 19 Step 5 $dData = 0 $dBase = 1 For $y = $i To $i + 4 $dData += $aTable_Dec85[$sDarwinDes[$y]] * $dBase If $sDarwinDes[$y] >= 0x80 Then Return SetError(2, 0, False) If $sDarwinDes[$y] = 0xff Then Return SetError(3, 0, False) $dBase *= 85 Next DllStructSetData($tGUID, Round($i/5) + 1, $dData) Next Local $aResult = DllCall("ole32.dll", "int", "StringFromGUID2", "struct*", $tGUID, "wstr", "", "int", 40) If @Error Or Not $aResult[0] Then Return SetError(@error, @extended, False) Return $aResult[2] EndFunc ; #FUNCTION# ======================================================================================================================================================= ; Name...........: _Decode_Base85_GUIDEx ; Description ...: Converts a (base85 encoded GUID) Darwin Descriptor into a StringGUID, String Base85 encoded GUIDs should be 20 characters long. ; Syntax.........: _Decode_Base85_GUID($sDarwinDes) ; Parameters ....: $sDarwinDes - String (base85 encoded) Darwin Descriptor ; Return values .: If the function succeeds, return StringGUID. If the function fails, return False ; Author ........: DXRW4E ; Modified.......: ; Remarks .......: ; Link ..........: ; Example .......: ; Note ..........: This function was inspired by ReactOS Project ; http://www.reactos.org/ ; * Copyright 2002-2005 Mike McCormack for CodeWeavers ; * Copyright 2005 Aric Stewart for CodeWeavers ; ================================================================================================================================================================== Func _Decode_Base85_GUIDEx($sDarwinDes) Local $dData = 0, $dBase = 1, $aGUID[5] If StringLen($sDarwinDes) < 20 Then Return SetError(1, 0, False) $sDarwinDes = StringToASCIIArray($sDarwinDes) For $i = 0 to 19 Step 5 $dData = 0 $dBase = 1 For $y = $i To $i + 4 $dData += $aTable_Dec85[$sDarwinDes[$y]] * $dBase If $sDarwinDes[$y] >= 0x80 Then Return SetError(2, 0, False) If $sDarwinDes[$y] = 0xff Then Return SetError(3, 0, False) $dBase *= 85 Next $aGUID[$i/5] = $dData $aGUID[4] &= Hex($dData, 8) Next Return StringRegExpReplace($aGUID[4], "(.{8})(.{4})(.{4})(.{2})(.{2})(.{2})(.{2})(.{2})(.{2})(.{2})(.{2})", "{$1-$3-$2-$7$6-$5$4$11$10$9$8}") EndFunc ; #FUNCTION# ======================================================================================================================================================= ; Name...........: _Encode_Base85_GUID ; Description ...: Converts a StringGUID into a String (base85 encoded) Darwin Descriptor ; Syntax.........: _Encode_Base85_GUID($sGUID) ; Parameters ....: $sGUID - String GUID ; Return values .: If the function succeeds, return String (base85 encoded) Darwin Descriptor. If the function fails, return False ; Author ........: DXRW4E ; Modified.......: ; Remarks .......: ; Link ..........: ; Example .......: ; Note ..........: This function was inspired by ReactOS Project ; http://www.reactos.org/ ; * Copyright 2002-2005 Mike McCormack for CodeWeavers ; * Copyright 2005 Aric Stewart for CodeWeavers ; ================================================================================================================================================================== Func _Encode_Base85_GUID($sGUID) Local $sDD_GUID, $dData, $tGUID = DllStructCreate("struct; ulong Data1;ulong Data2;ulong Data3;ulong Data4;endstruct") Local $aResult = DllCall("ole32.dll", "long", "CLSIDFromString", "wstr", $sGUID, "struct*", $tGUID) If @Error Then Return SetError(@error, @extended, False) ;;Local $sDD_GUID, $dData, $tGUID = DllStructCreate("struct; ulong Data1;ushort Data2;ushort Data3;byte Data4[8]; endstruct") ;;Local $aResult = DllCall("ole32.dll", "long", "CLSIDFromString", "wstr", $sGUID, "struct*", $tGUID) ;;If @Error Then Return SetError(@error, @extended, False) ;;$tGUID = DllStructCreate("ulong Data1;ulong Data2;ulong Data3;ulong Data4", DllStructGetPtr($tGUID)) For $i = 1 to 4 $dData = DllStructGetData($tGUID, $i) $sDD_GUID &= $aTable_Enc85[Mod($dData, 85)] $dData = Int($dData / 85) $sDD_GUID &= $aTable_Enc85[Mod($dData, 85)] $dData = Int($dData / 85) $sDD_GUID &= $aTable_Enc85[Mod($dData, 85)] $dData = Int($dData / 85) $sDD_GUID &= $aTable_Enc85[Mod($dData, 85)] $dData = Int($dData / 85) $sDD_GUID &= $aTable_Enc85[Mod($dData, 85)] Next Return $sDD_GUID EndFunc ; #FUNCTION# ======================================================================================================================================================= ; Name...........: _Encode_Base85_GUIDEx ; Description ...: Converts a StringGUID into a String (base85 encoded) Darwin Descriptor ; Syntax.........: _Encode_Base85_GUIDEx($sGUID) ; Parameters ....: $sGUID - String GUID ; Return values .: If the function succeeds, return String (base85 encoded) Darwin Descriptor. If the function fails, return False ; Author ........: DXRW4E ; Modified.......: ; Remarks .......: ; Link ..........: ; Example .......: ; Note ..........: This function was inspired by ReactOS Project ; http://www.reactos.org/ ; * Copyright 2002-2005 Mike McCormack for CodeWeavers ; * Copyright 2005 Aric Stewart for CodeWeavers ; ================================================================================================================================================================== Func _Encode_Base85_GUIDEx($sGUID) Local $sDD_GUID, $dData, $aGUID = StringRegExp($sGUID, "\{?([0-9A-Fa-f]{8})-?([0-9A-Fa-f]{4})-?([0-9A-Fa-f]{4})-?([0-9A-Fa-f]{2})([0-9A-Fa-f]{2})-?([0-9A-Fa-f]{2})([0-9A-Fa-f]{2})([0-9A-Fa-f]{2})([0-9A-Fa-f]{2})([0-9A-Fa-f]{2})([0-9A-Fa-f]{2})", 1) If @Error Then Return SetError(@error, @extended, False) $aGUID[0] = Number("0x" & $aGUID[0], 3) $aGUID[1] = Number("0x" & $aGUID[2] & $aGUID[1], 3) $aGUID[2] = Number("0x" & $aGUID[6] & $aGUID[5] & $aGUID[4] & $aGUID[3], 3) $aGUID[3] = Number("0x" & $aGUID[10] & $aGUID[9] & $aGUID[8] & $aGUID[7], 3) For $i = 0 to 3 $dData = $aGUID[$i] $sDD_GUID &= $aTable_Enc85[Mod($dData, 85)] $dData = Int($dData / 85) $sDD_GUID &= $aTable_Enc85[Mod($dData, 85)] $dData = Int($dData / 85) $sDD_GUID &= $aTable_Enc85[Mod($dData, 85)] $dData = Int($dData / 85) $sDD_GUID &= $aTable_Enc85[Mod($dData, 85)] $dData = Int($dData / 85) $sDD_GUID &= $aTable_Enc85[Mod($dData, 85)] Next Return $sDD_GUID EndFunc #EndRegion ;Encoding-Decoding Base85Ciao. Edited November 5, 2014 by DXRW4E
Proph Posted November 5, 2016 Posted November 5, 2016 (edited) @DXRW4E Is it possible to return only if the Default valuename contains ValueData? I tried with setting the $sFilter to "" and using "*" but both return all Values in the path. I also tried "(Default)" which doesn't return anything. I know if I use RegRead([Path], "") get the default value. But it doesn't seem to work as intended with this function. To access the (Default) value use "" (an empty string) for the valuename. Update: I think I figured out what to edit. Here is my modified function: Func _RegEnumValEx($aKeyList, $iFlag = 0, $sFilter = "*", $iValueTypes = 0) If StringRegExp($sFilter, "\v") Then Return SetError(3, 0, "") If Not IsArray($aKeyList) Then $aKeyList = StringSplit($aKeyList, @LF) Local $aKeyValList[1954][4], $iKeyVal = Int(BitAND($iFlag, 32) = 0), $sKeyVal = 1953, $sRegEnumVal, $iRegEnumVal, $RegRead = BitAND($iFlag, 256), $vFilter = StringReplace($sFilter, "*", "") If Not BitAND($iFlag, 64) Then $sFilter = StringRegExpReplace(BitAND($iFlag, 16) & "(?i)(", "16\(\?\i\)|\d+", "") & StringRegExpReplace(StringRegExpReplace(StringRegExpReplace(StringRegExpReplace($sFilter, "[^*?|]+", "\\Q$0\\E"), "\\E(?=\||$)", "$0\$"), "(?<=^|\|)\\Q", "^$0"), "\*+", ".*") & ")" For $i = 1 To $aKeyList[0] $iRegEnumVal = 0 While 1 If $sFilter = "(?i)()" And $iRegEnumVal > 0 Then ExitLoop If $iKeyVal = $sKeyVal Then If $sKeyVal = 3999744 Then ExitLoop $sKeyVal *= 2 ReDim $aKeyValList[$sKeyVal + 1][4] EndIf $aKeyValList[$iKeyVal][0] = $aKeyList[$i] $iRegEnumVal += 1 $sRegEnumVal = RegEnumVal($aKeyList[$i], $iRegEnumVal) If @Error <> 0 Then If $iRegEnumVal = 1 And $vFilter = "" Then $iKeyVal += 1 ExitLoop EndIf If $sFilter = "(?i)()" And $sRegEnumVal <> "" Then ExitLoop If BitAND(@Extended, $iValueTypes) <> $iValueTypes Then ContinueLoop If $vFilter And Not StringRegExp($sRegEnumVal, $sFilter) Then ContinueLoop $aKeyValList[$iKeyVal][1] = $sRegEnumVal If $RegRead Then $aKeyValList[$iKeyVal][2] = RegRead($aKeyList[$i], $sRegEnumVal) $iKeyVal += 1 WEnd Next $sRegEnumVal = $iKeyVal - Int(BitAND($iFlag, 32) = 0) If Not $sRegEnumVal Or ($sRegEnumVal = 1 And $vFilter = "" And $aKeyValList[$iKeyVal - $sRegEnumVal][2] = "") Then Return SetError(4, 0, "") ReDim $aKeyValList[$iKeyVal][4] If Not BitAND($iFlag, 32) Then $aKeyValList[0][0] = $iKeyVal - 1 Return $aKeyValList EndFunc Just use "" as the $sFilter and it should now only return the (Default) Values. Edited November 5, 2016 by Proph
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now