Jump to content
Sign in to follow this  
DXRW4E

_RegEnumKeyValEx (_RegEnumKeyEx & _RegEnumValEx)

Recommended Posts

DXRW4E

Hi All, Sorry for my English

I 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

 

#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
EndFunc

example

#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 by DXRW4E

apps-odrive.pngdrive_app_badge.png box-logo.png new_logo.png MEGA_Logo.png

Share this post


Link to post
Share on other sites
supersonic

DXRW4W,

really nice - thanks for sharing! :)

Share this post


Link to post
Share on other sites
DXRW4E

Updated, Added $sFilter Case-sensitivity flag & Disable the return the count in the first element, for more see the first post

Ciao.


apps-odrive.pngdrive_app_badge.png box-logo.png new_logo.png MEGA_Logo.png

Share this post


Link to post
Share on other sites
jazzyjeff

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!

Share this post


Link to post
Share on other sites
DXRW4E

@jazzyjeff

Thank You, You are welcome

@All

Updated, add $iFlag = 64 now you can use the $sFilter in RegExp Mod (See Pattern Parameters in StringRegExp )

Ciao.

Edited by DXRW4E

apps-odrive.pngdrive_app_badge.png box-logo.png new_logo.png MEGA_Logo.png

Share this post


Link to post
Share on other sites
NDog

DXRW4E

Is 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!

Share this post


Link to post
Share on other sites
DXRW4E

already done

Ciao.


apps-odrive.pngdrive_app_badge.png box-logo.png new_logo.png MEGA_Logo.png

Share this post


Link to post
Share on other sites
DXRW4E

Updated, add flags $iValueTypes

Ciao.


apps-odrive.pngdrive_app_badge.png box-logo.png new_logo.png MEGA_Logo.png

Share this post


Link to post
Share on other sites
Docfxit

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 by Docfxit

Share this post


Link to post
Share on other sites
DXRW4E

Hi Docfxit, Thank you for reporting, already editupdated the example script

Ciao.


apps-odrive.pngdrive_app_badge.png box-logo.png new_logo.png MEGA_Logo.png

Share this post


Link to post
Share on other sites
Chimaera

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 by Chimaera

Share this post


Link to post
Share on other sites
DXRW4E

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

#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 by DXRW4E

apps-odrive.pngdrive_app_badge.png box-logo.png new_logo.png MEGA_Logo.png

Share this post


Link to post
Share on other sites
DXRW4E

@OffTopic

Thats amazing i didnt even know they could be deciphered like that

Windows Installer GUID Compressed GUID

look also Darwin Descriptors

#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 Base85
Ciao. Edited by DXRW4E

apps-odrive.pngdrive_app_badge.png box-logo.png new_logo.png MEGA_Logo.png

Share this post


Link to post
Share on other sites
Proph

@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 by Proph

Share this post


Link to post
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

  • Similar Content

    • Skeletor
      By Skeletor
      Hi Virtual People,
      My array works perfectly fine. However, what is the best practice if the line in the array doesn't have the correct amount of columns and if I can add a placeholder?

       
      For $count = 1 To _FileCountLines($FileRead1) Step 1 $string = FileReadLine($FileRead1, $count) $input = StringSplit($string, ",", 1) $value1 = $input[1] $value2 = $input[2] $value3 = $input[3] _Excel_RangeWrite($oWorkbook, $oWorkbook.Activesheet, $value2, "A1") _Excel_RangeWrite($oWorkbook, $oWorkbook.Activesheet, $value1, "B1") _Excel_RangeWrite($oWorkbook, $oWorkbook.Activesheet, $value3, "C1") Next  
    • MrCheese
      By MrCheese
      hi all,
      reviewing the forum, this thread is applicable: 
       
       
      I wanted to know if there is now a better way to do this?
      In essence, I load a tab delimited txt file into an array (works well). I used tab, as some fields in the original csv contains commas.
      However, I needed autoit to manipulate this array, and output it as a csv.
      IF my array contains items with a comma, without double quotes around the field, then how best do I get a csv out of this?
      My current workaround is to filewritefromarray tab delimited, then open it in excel and save as a csv. I will need to check this to see how the address fields behave that contain a comma.
       
      Any thoughts would be appreciated.
       
    • caramen
      By caramen
      I watched _OL_ItemSend&_OL_ItemFind&_OL_ItemCreate in OutlookEx UDF but hmmm
       
      Since it use the test environnement i cant get the orders of the mail creation
       
      Can someone make me win some time of reading all exemples script and lead me how to do one ?
      That whould be lovely.
      Gnight
    • Skeletor
      By Skeletor
      Hi All,

      I would like to know how you would take a FileLineRead and insert it into an array which then inserts it into Excel?
      One thing to know is the files content is broken up, so I only use half of the content within $FileRead1.
      So its imperative that the $value1, $value2, etc variables be used. 
      Code below:
      $FileRead1 = FileReadLine("C:\temp\sample.txt",1) For $count = 1 To _FileCountLines($FileRead1) Step 1 $string = FileReadLine($FileRead1, $count) $input = StringSplit($string, ",", 1) $value1 = $input[1] $value2 = $input[2] $value3 = $input[3] $value4 = $input[4] _Excel_RangeWrite($oWorkbook, $oWorkbook.Activesheet, $value1, "A1") _Excel_RangeWrite($oWorkbook, $oWorkbook.Activesheet, $value2, "B1") _Excel_RangeWrite($oWorkbook, $oWorkbook.Activesheet, $value3, "C1") _Excel_RangeWrite($oWorkbook, $oWorkbook.Activesheet, $value4, "D1") Next  
    • AnonymousX
      By AnonymousX
      Hello,
      I'm trying to write a script that moves copies excel cells into an array. I'll than manipulate the values and send array into another program. 
      I don't want range to be specific to a workbook, or sheet, or set of cells.
      I want user to be able to highlight desired cells and to copy either normally ("Ctrl+C") or by a hotkey ("Alt+C"). 
      Could someone help me with this?
      Thank you,
      I've tried to write the framework: (edited)
      #include <MsgBoxConstants.au3> #include <Array.au3> #include <Excel.au3> HotKeySet("!v", "Pastedata") While True Sleep(1000) WEnd func Makearray() local $bArray ;User has cells already copied ;Convert clipboard into an array ;I don;t know how excel stores data to clipboard so don;t know how to bring it into array _Arraydisplay($bArray) MsgBox(0,0,$bArray) return $bArray endfunc func Pastedata() Local $aArray MsgBox(0,0,"wait",1) ;make array based on assumption user has already copied a range to clipboard $aArray = Makearray() ;paste code ;don;t worry about this I got the rest endfunc  
×