1; EDIT by ann0see: See the README.txt file in this folder
2!ifndef REGISTRY_NSH
3!define REGISTRY_NSH
4!include "${NSISDIR}\Examples\System\system.nsh"
5
6!define HKEY_CLASSES_ROOT_ENUM           0x80000000
7!define HKEY_CURRENT_USER_ENUM           0x80000001
8!define HKEY_LOCAL_MACHINE_ENUM          0x80000002
9!define HKEY_USERS_ENUM                  0x80000003
10!define HKEY_PERFORMANCE_DATA_ENUM       0x80000004
11!define HKEY_CURRENT_CONFIG_ENUM         0x80000005
12!define HKEY_DYN_DATA_ENUM               0x80000006
13
14!define KEY_ALL_ACCESS          0x0002003F
15
16!define RegCreateKeyEx 'advapi32::RegCreateKeyEx(i, t, i, t, i, i, i, *i, *i) i'
17!define RegOpenKeyEx 'advapi32::RegOpenKeyEx(i, t, i, i, *i) i'
18!define RegCloseKey  'advapi32::RegCloseKey(i) i'
19!define SHCopyKey 'shlwapi::SHCopyKey(i, t, i, i) i'
20
21####################################################################################################
22!macro SET_HKEY_ENUM HKEY_NAME HKEY_ENUM LABEL
23    StrCmp ${HKEY_NAME} HKCR 0 +3
24    StrCpy ${HKEY_ENUM} ${HKEY_CLASSES_ROOT_ENUM}
25    GoTo ${LABEL}
26    StrCmp ${HKEY_NAME} HKEY_CLASSES_ROOT 0 +3
27    StrCpy ${HKEY_ENUM} ${HKEY_CLASSES_ROOT_ENUM}
28    GoTo ${LABEL}
29    StrCmp ${HKEY_NAME} HKCU 0 +3
30    StrCpy ${HKEY_ENUM} ${HKEY_CURRENT_USER_ENUM}
31    GoTo ${LABEL}
32    StrCmp ${HKEY_NAME} HKEY_CURRENT_USER 0 +3
33    StrCpy ${HKEY_ENUM} ${HKEY_CURRENT_USER_ENUM}
34    GoTo ${LABEL}
35    StrCmp ${HKEY_NAME} HKLM 0 +3
36    StrCpy ${HKEY_ENUM} ${HKEY_LOCAL_MACHINE_ENUM}
37    GoTo ${LABEL}
38    StrCmp ${HKEY_NAME} HKEY_LOCAL_MACHINE 0 +3
39    StrCpy ${HKEY_ENUM} ${HKEY_LOCAL_MACHINE_ENUM}
40    GoTo ${LABEL}
41    StrCmp ${HKEY_NAME} HKU 0 +3
42    StrCpy ${HKEY_ENUM} ${HKEY_USERS_ENUM}
43    GoTo ${LABEL}
44    StrCmp ${HKEY_NAME} HKEY_USERS 0 +3
45    StrCpy ${HKEY_ENUM} ${HKEY_USERS_ENUM}
46    GoTo ${LABEL}
47    StrCmp ${HKEY_NAME} HKPD 0 +3
48    StrCpy ${HKEY_ENUM} ${HKEY_PERFORMANCE_DATA_ENUM}
49    GoTo ${LABEL}
50    StrCmp ${HKEY_NAME} HKEY_PERFORMANCE_DATA 0 +3
51    StrCpy ${HKEY_ENUM} ${HKEY_PERFORMANCE_DATA_ENUM}
52    GoTo ${LABEL}
53    StrCmp ${HKEY_NAME} HKCC 0 +3
54    StrCpy ${HKEY_ENUM} ${HKEY_CURRENT_CONFIG_ENUM}
55    GoTo ${LABEL}
56    StrCmp ${HKEY_NAME} HKEY_CURRENT_CONFIG 0 +3
57    StrCpy ${HKEY_ENUM} ${HKEY_CURRENT_CONFIG_ENUM}
58    GoTo ${LABEL}
59    StrCmp ${HKEY_NAME} HKDD 0 +3
60    StrCpy ${HKEY_ENUM} ${HKEY_DYN_DATA_ENUM}
61    GoTo ${LABEL}
62    StrCmp ${HKEY_NAME} HKEY_DYN_DATA 0 +3
63    StrCpy ${HKEY_ENUM} ${HKEY_DYN_DATA_ENUM}
64${LABEL}:
65!macroend
66####################################################################################################
67!macro COPY_REGISTRY_KEY_BASE TYPE
68!ifndef ${TYPE}COPY_REGISTRY_KEY_DEFINE
69!define ${TYPE}COPY_REGISTRY_KEY_DEFINE
70Function ${TYPE}CopyRegistryKey
71    Exch $1 ;Target subkey
72    Exch
73    Exch $2 ;Target key name
74    Exch
75    Exch 2
76    Exch $3 ;Source subkey
77    Exch
78    Exch 2
79    Exch 3
80    Exch $4 ;Source key name
81    Push $5 ;Source key handle
82    Push $6 ;Target key handle
83    Push $7 ;return value
84    Push $8 ;HKEY enum for target key
85    Push $9 ;HKEY enum for source key
86
87!insertmacro SET_HKEY_ENUM $2 $8 next
88!insertmacro SET_HKEY_ENUM $4 $9 next2
89
90     SetPluginUnload alwaysoff
91
92     StrCpy $5 0
93     System::Call '${RegOpenKeyEx}(i r9, t r3, 0, ${KEY_ALL_ACCESS}, .r5) .r7'
94     StrCmp $7 0 continue
95     DetailPrint "Registry key $4\$3 not found."
96     StrCpy $1 $7
97     GoTo done
98
99continue:
100     StrCpy $6 0
101     System::Call '${RegCreateKeyEx}(i r8, t r1, 0, 0, 0, ${KEY_ALL_ACCESS}, 0, .r6, 0) .r7'
102     StrCmp $7 0 copy
103     MessageBox MB_OK|MB_ICONSTOP "Error $7 opening registry key $2\$1."
104     StrCpy $1 $7
105     GoTo done
106
107copy:
108     System::Call '${SHCopyKey}(i r5, "", i r6, 0) .r7'
109     StrCmp $7 0 +2
110     MessageBox MB_OK|MB_ICONSTOP "Error $7 copying registry key."
111     StrCpy $1 $7
112
113done:
114     System::Call '${RegCloseKey}(i r5) .r7'
115     System::Call '${RegCloseKey}(i r6) .r7'
116     SetPluginUnload manual
117     System::Free 0
118
119     Pop $9
120     Pop $8
121     Pop $7
122     Pop $6
123     Pop $5
124     Pop $4
125     Pop $3
126     Pop $2
127     Exch $1
128FunctionEnd
129!endif
130!macroend
131####################################################################################################
132!macro COPY_REGISTRY_KEY
133!insertmacro COPY_REGISTRY_KEY_BASE ""
134!macroend
135####################################################################################################
136!macro UN.COPY_REGISTRY_KEY
137!insertmacro COPY_REGISTRY_KEY_BASE "Un."
138!macroend
139####################################################################################################
140!macro CALL_COPY_REGISTRY_KEY_BASE TYPE SOURCEROOTKEY SOURCESUBKEY TARGETROOTKEY TARGETSUBKEY
141!ifdef ${TYPE}COPY_REGISTRY_KEY_DEFINE
142    Push $R1
143    ReadRegStr $R1 "${TARGETROOTKEY}" "${TARGETSUBKEY}" ""
144    IfErrors 0 +2
145    WriteRegStr "${TARGETROOTKEY}" "${TARGETSUBKEY}" "" ""
146    Pop $R1
147    Push "${SOURCEROOTKEY}"
148    Push "${SOURCESUBKEY}"
149    Push "${TARGETROOTKEY}"
150    Push "${TARGETSUBKEY}"
151    Call ${TYPE}CopyRegistryKey
152!else
153!error "Macro ${TYPE}COPY_REGISTRY_KEY not inserted"
154!endif
155!macroend
156####################################################################################################
157!macro CALL_COPY_REGISTRY_KEY SOURCEROOTKEY SOURCESUBKEY TARGETROOTKEY TARGETSUBKEY
158!insertmacro CALL_COPY_REGISTRY_KEY_BASE "" "${SOURCEROOTKEY}" "${SOURCESUBKEY}" "${TARGETROOTKEY}" "${TARGETSUBKEY}"
159!macroend
160####################################################################################################
161!macro CALL_UN.COPY_REGISTRY_KEY SOURCEROOTKEY SOURCESUBKEY TARGETROOTKEY TARGETSUBKEY
162!insertmacro CALL_COPY_REGISTRY_KEY_BASE "Un." "${SOURCEROOTKEY}" "${SOURCESUBKEY}" "${TARGETROOTKEY}" "${TARGETSUBKEY}"
163!macroend
164####################################################################################################
165!define COPY_REGISTRY_KEY "!insertmacro CALL_COPY_REGISTRY_KEY"
166!define UN.COPY_REGISTRY_KEY "!insertmacro UN.CALL_COPY_REGISTRY_KEY"
167!endif
168