Previous | Contents | Next

## D.5 How to Read REG_MULTI_SZ Values

I wrote this script to help rpetges in this forum thread. It reads a registry value of the type REG_MULTI_SZ and prints it out. Don't forget to edit where it says "Edit this!" when you test this script. The values must point to a REG_MULTI_SZ value or the example will spit out an error.

    OutFile "REG_MULTI_SZ Reader.exe"

    Name "REG_MULTI_SZ Reader"

    ShowInstDetails show

    !define HKEY_CLASSES_ROOT        0x80000000

    !define HKEY_CURRENT_USER        0x80000001

    !define HKEY_LOCAL_MACHINE       0x80000002

    !define HKEY_USERS               0x80000003

    !define HKEY_PERFORMANCE_DATA    0x80000004

    !define HKEY_PERFORMANCE_TEXT    0x80000050

    !define HKEY_PERFORMANCE_NLSTEXT 0x80000060

    !define HKEY_CURRENT_CONFIG      0x80000005

    !define HKEY_DYN_DATA            0x80000006

    !define KEY_QUERY_VALUE          0x0001

    !define KEY_ENUMERATE_SUB_KEYS   0x0008

    !define REG_NONE                 0

    !define REG_SZ                   1

    !define REG_EXPAND_SZ            2

    !define REG_BINARY               3

    !define REG_DWORD                4

    !define REG_DWORD_LITTLE_ENDIAN  4

    !define REG_DWORD_BIG_ENDIAN     5

    !define REG_LINK                 6

    !define REG_MULTI_SZ             7

    !define RegOpenKeyEx     "Advapi32::RegOpenKeyExA(i, t, i, i, *i) i"

    !define RegQueryValueEx  "Advapi32::RegQueryValueExA(i, t, i, *i, i, *i) i"

    !define RegCloseKey      "Advapi32::RegCloseKeyA(i) i"

    ####### Edit this!

    !define ROOT_KEY         ${HKEY_CURRENT_USER}

    !define SUB_KEY          "Software\Joe Software"

    !define VALUE            "Strings"

    ####### Stop editing

    Section "Read"

      StrCpy $0 ""

      StrCpy $1 ""

      StrCpy $2 ""

      StrCpy $3 ""

      SetPluginUnload alwaysoff

      System::Call "${RegOpenKeyEx}(${ROOT_KEY}, '${SUB_KEY}', \

        0, ${KEY_QUERY_VALUE}|${KEY_ENUMERATE_SUB_KEYS}, .r0) .r3"

      StrCmp $3 0 goon

        MessageBox MB_OK|MB_ICONSTOP "Can't open registry key! ($3)"

        Goto done

    goon:

      System::Call "${RegQueryValueEx}(r0, '${VALUE}', 0, .r1, 0, .r2) .r3"

      StrCmp $3 0 read

        MessageBox MB_OK|MB_ICONSTOP "Can't query registry value size! ($3)"

        Goto done

    read:

      StrCmp $1 ${REG_MULTI_SZ} multisz

        MessageBox MB_OK|MB_ICONSTOP "Registry value no REG_MULTI_SZ! ($3)"

        Goto done

    multisz:

      StrCmp $2 0 0 multiszalloc

        MessageBox MB_OK|MB_ICONSTOP "Registry value empty! ($3)"

        Goto done

    multiszalloc:

      System::Alloc $2

      Pop $1

      StrCmp $1 0 0 multiszget

        MessageBox MB_OK|MB_ICONSTOP "Can't allocate enough memory! ($3)"

        Goto done

    multiszget:

      System::Call "${RegQueryValueEx}(r0, '${VALUE}', 0, n, r1, r2) .r3"

      StrCmp $3 0 multiszprocess

        MessageBox MB_OK|MB_ICONSTOP "Can't query registry value data! ($3)"

        Goto done

    multiszprocess:

      StrCpy $4 $1

      loop:

        System::Call "*$4(&t${NSIS_MAX_STRLEN} .r3)"

        StrCmp $3 "" done

        DetailPrint $3

        StrLen $5 $3

        IntOp $4 $4 + $5

        IntOp $4 $4 + 1

        Goto loop

    done:

      System::Free $1

      StrCmp $0 0 noClose

        System::Call "${RegCloseKey}(r0)"

    noClose:

      SetPluginUnload manual

    SectionEnd

written by KiCHiK

Previous | Contents | Next