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 ""

  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:



SectionEnd

written by KiCHiK

Previous | Contents | Next