Registry plug-in

From NSIS Wiki
Jump to navigationJump to search
Author: Instructor (talk, contrib)


Links

Download v4.2:
Registry.zip (154 KB)

Discussion:
Forum thread

Run with conda execute or install with conda install (see Conda).

Description

This is NSIS plug-in for registry with unicode support on NSIS Unicode. Archive also contains 64-bit and Pocket PC dlls.


Features:

  • Powerful registry search:
    • fast algorithm
    • principle of turn in stack (first in -> last out)
    • i.e. search from first registry key to last
    • search for key, value and/or string in any root
    • search with name and/or type
    • search with banner support
    • search with subkeys or not
  • Check if registry key exists
  • Read value of any type and size
  • Write value of any type and size
  • Create key
  • Delete value (same as DeleteRegValue)
  • Delete key (same as DeleteRegKey)
  • Delete empty key (if no values and subkeys in it)
  • Copy value
  • Move value
  • Copy key
  • Move key
  • Export key contents to the file in ansi REGEDIT4 or unicode REGEDIT5 format
  • Import key contents from the file to the registry (Note: this does not work on Windows Vista)
  • Converts string to hex values
  • Converts hex values to string


Usage

Open for search

${registry::Open} "[fullpath]" "[Options]" $var

Find first and next (call one or more times)

${registry::Find} "[handle]" $var1 $var2 $var3 $var4
 
From ReadMe file
 
"[handle]"   handle returned by registry::Open

$var1        "[path]"
$var2        "[value]" or "[key]"
$var3        "[string]"
$var4        "[TYPE]"
	TYPE:
	""                                -Search is finished
	"BANNER"                          -Banner is used, return only path
	"REG_KEY"                         -Registry key is found
	"REG_BINARY"                      -Raw binary data
	"REG_DWORD"                       -Double word in machine format (low-endian on Intel)
	"REG_DWORD_BIG_ENDIAN"            -Double word in big-endian format
	"REG_EXPAND_SZ"                   -String with unexpanded environment variables
	"REG_MULTI_SZ"                    -Multiple strings, next string separated by new line '$\n'
	"REG_NONE"                        -Undefined type
	"REG_SZ"                          -Null-terminated string
	"REG_LINK"                        -Unicode symbolic link
	"REG_RESOURCE_LIST"               -Device-driver resource list
	"REG_FULL_RESOURCE_DESCRIPTOR"    -Resource list in the hardware description
	"REG_RESOURCE_REQUIREMENTS_LIST"  -
	"REG_QWORD"                       -64-bit number
	"INVALID"                         -Invalid type code

Close search (free memory)

${registry::Close} "[handle]"

KeyExists (check if registry key exists)

${registry::KeyExists} "[fullpath]" $var
 
$var == 0   # key exists
$var == -1  # key doesn't exist

Registry Read

${registry::Read} "[fullpath]" "[value]" $var1 $var2

Where:

  • $var1 is the value read.
  • $var2 is the type read:
    • "" - no value
    • "REG_BINARY"
    • "REG_DWORD"
    • "REG_DWORD_BIG_ENDIAN"
    • "REG_EXPAND_SZ"
    • "REG_MULTI_SZ"
    • "REG_NONE"
    • "REG_SZ"
    • "REG_LINK"
    • "REG_RESOURCE_LIST"
    • "REG_FULL_RESOURCE_DESCRIPTOR"
    • "REG_RESOURCE_REQUIREMENTS_LIST"
    • "REG_QWORD"
    • "INVALID"

Registry Write

${registry::Write} "[fullpath]" "[value]" "[string]" "[TYPE]" $var
 
$var == 0   # success
$var == -1  # error


Registry Extra Read

${registry::ReadExtra} "[fullpath]" "[value]" "[number]" $var1 $var2

Registry Extra Write

${registry::WriteExtra} "[fullpath]" "[value]" "[string]" $var
 
$var == 0   # success
$var == -1  # error

Create Registry Key

${registry::CreateKey} "[fullpath]" $var
$var == 1   # [fullpath] already exists
$var == 0   # [fullpath] successfully created
$var == -1  # error


Delete Registry Value (same as DeleteRegValue)

${registry::DeleteValue} "[fullpath]" "[value]" $var
 
$var == 0   # success
$var == -1  # error


Delete Registry Key (same as DeleteRegKey)

${registry::DeleteKey} "[fullpath]" $var
 
$var == 0   # success
$var == -1  # error


Delete Empty Registry Key (if no values and subkeys in it)

${registry::DeleteKeyEmpty} "[fullpath]" $var
 
$var == 0   # success
$var == -1  # error


Copy Registry Value

${registry::CopyValue} "[fullpath_source]" "[value_source]" "[fullpath_target]" "[value_target]" $var
 
$var == 0   # success
$var == -1  # error


Move Registry Value

${registry::MoveValue} "[fullpath_source]" "[value_source]" "[fullpath_target]" "[value_target]" $var
 
$var == 0   # success
$var == -1  # error


Copy Registry Key

${registry::CopyKey} "[fullpath_source]" "[fullpath_target]\[new_key_name]" $var
 
$var == 0   # success
$var == -1  # error


Move Registry Key

${registry::MoveKey} "[fullpath_source]" "[fullpath_target]\[new_key_name]" $var
 
$var == 0   # success
$var == -1  # error

Registry Export (save to the file in REGEDIT4 format)

${registry::SaveKey} "[fullpath]" "[file]" "[Options]" $var
 
 
$var == 0   # success
$var == -1  # error


Registry Import (restore from the file)

${registry::RestoreKey} "[file]" $var
 
$var == 0   # success
$var == -1  # error

Note: ${registry::RestoreKey} simply exec regedit: regedit /s "[file]"


StrToHex (converts string to hex values)

${registry::StrToHex} "[string]" $var

"[string]" - String to convert

$var - Hex string


HexToStr (converts hex values to string)

${registry::HexToStr} "[hex_string]" $var

"[string]" - Hex string to convert

$var - String


Unload plugin

${registry::Unload}

Tips

REG_QWORD "Gotcha"

When writing values they must be in a quoted hex string exactly 16 characters long.

Example

 ## Set the QWord value to 0
 ${registry::Write} "HKLM\${PathToKey}" "ExecTime" "0000000000000000" "REG_QWORD" $R0