3 !include "${NSISDIR}\Examples\System\system.nsh"
5 !define HKEY_CLASSES_ROOT_ENUM 0x80000000
6 !define HKEY_CURRENT_USER_ENUM 0x80000001
7 !define HKEY_LOCAL_MACHINE_ENUM 0x80000002
8 !define HKEY_USERS_ENUM 0x80000003
9 !define HKEY_PERFORMANCE_DATA_ENUM 0x80000004
10 !define HKEY_CURRENT_CONFIG_ENUM 0x80000005
11 !define HKEY_DYN_DATA_ENUM 0x80000006
13 !define KEY_ALL_ACCESS 0x0002003F
15 !define RegCreateKeyEx 'advapi32::RegCreateKeyEx(i, t, i, t, i, i, i, *i, *i) i'
16 !define RegOpenKeyEx 'advapi32::RegOpenKeyEx(i, t, i, i, *i) i'
17 !define RegCloseKey 'advapi32::RegCloseKey(i) i'
18 !define SHCopyKey 'shlwapi::SHCopyKey(i, t, i, i) i'
20 ####################################################################################################
21 !macro SET_HKEY_ENUM HKEY_NAME HKEY_ENUM LABEL
22 StrCmp ${HKEY_NAME} HKCR 0 +3
23 StrCpy ${HKEY_ENUM} ${HKEY_CLASSES_ROOT_ENUM}
25 StrCmp ${HKEY_NAME} HKEY_CLASSES_ROOT 0 +3
26 StrCpy ${HKEY_ENUM} ${HKEY_CLASSES_ROOT_ENUM}
28 StrCmp ${HKEY_NAME} HKCU 0 +3
29 StrCpy ${HKEY_ENUM} ${HKEY_CURRENT_USER_ENUM}
31 StrCmp ${HKEY_NAME} HKEY_CURRENT_USER 0 +3
32 StrCpy ${HKEY_ENUM} ${HKEY_CURRENT_USER_ENUM}
34 StrCmp ${HKEY_NAME} HKLM 0 +3
35 StrCpy ${HKEY_ENUM} ${HKEY_LOCAL_MACHINE_ENUM}
37 StrCmp ${HKEY_NAME} HKEY_LOCAL_MACHINE 0 +3
38 StrCpy ${HKEY_ENUM} ${HKEY_LOCAL_MACHINE_ENUM}
40 StrCmp ${HKEY_NAME} HKU 0 +3
41 StrCpy ${HKEY_ENUM} ${HKEY_USERS_ENUM}
43 StrCmp ${HKEY_NAME} HKEY_USERS 0 +3
44 StrCpy ${HKEY_ENUM} ${HKEY_USERS_ENUM}
46 StrCmp ${HKEY_NAME} HKPD 0 +3
47 StrCpy ${HKEY_ENUM} ${HKEY_PERFORMANCE_DATA_ENUM}
49 StrCmp ${HKEY_NAME} HKEY_PERFORMANCE_DATA 0 +3
50 StrCpy ${HKEY_ENUM} ${HKEY_PERFORMANCE_DATA_ENUM}
52 StrCmp ${HKEY_NAME} HKCC 0 +3
53 StrCpy ${HKEY_ENUM} ${HKEY_CURRENT_CONFIG_ENUM}
55 StrCmp ${HKEY_NAME} HKEY_CURRENT_CONFIG 0 +3
56 StrCpy ${HKEY_ENUM} ${HKEY_CURRENT_CONFIG_ENUM}
58 StrCmp ${HKEY_NAME} HKDD 0 +3
59 StrCpy ${HKEY_ENUM} ${HKEY_DYN_DATA_ENUM}
61 StrCmp ${HKEY_NAME} HKEY_DYN_DATA 0 +3
62 StrCpy ${HKEY_ENUM} ${HKEY_DYN_DATA_ENUM}
65 ####################################################################################################
66 !macro COPY_REGISTRY_KEY_BASE TYPE
67 !ifndef ${TYPE}COPY_REGISTRY_KEY_DEFINE
68 !define ${TYPE}COPY_REGISTRY_KEY_DEFINE
69 Function ${TYPE}CopyRegistryKey
70 Exch $1 ;Target subkey
72 Exch $2 ;Target key name
75 Exch $3 ;Source subkey
79 Exch $4 ;Source key name
80 Push $5 ;Source key handle
81 Push $6 ;Target key handle
83 Push $8 ;HKEY enum for target key
84 Push $9 ;HKEY enum for source key
86 !insertmacro SET_HKEY_ENUM $2 $8 next
87 !insertmacro SET_HKEY_ENUM $4 $9 next2
89 SetPluginUnload alwaysoff
92 System::Call '${RegOpenKeyEx}(i r9, t r3, 0, ${KEY_ALL_ACCESS}, .r5) .r7'
94 DetailPrint "Registry key $4\$3 not found."
100 System::Call '${RegCreateKeyEx}(i r8, t r1, 0, 0, 0, ${KEY_ALL_ACCESS}, 0, .r6, 0) .r7'
102 MessageBox MB_OK|MB_ICONSTOP "Error $7 opening registry key $2\$1."
107 System::Call '${SHCopyKey}(i r5, "", i r6, 0) .r7'
109 MessageBox MB_OK|MB_ICONSTOP "Error $7 copying registry key."
113 System::Call '${RegCloseKey}(i r5) .r7'
114 System::Call '${RegCloseKey}(i r6) .r7'
115 SetPluginUnload manual
130 ####################################################################################################
131 !macro COPY_REGISTRY_KEY
132 !insertmacro COPY_REGISTRY_KEY_BASE ""
134 ####################################################################################################
135 !macro UN.COPY_REGISTRY_KEY
136 !insertmacro COPY_REGISTRY_KEY_BASE "Un."
138 ####################################################################################################
139 !macro CALL_COPY_REGISTRY_KEY_BASE TYPE SOURCEROOTKEY SOURCESUBKEY TARGETROOTKEY TARGETSUBKEY
140 !ifdef ${TYPE}COPY_REGISTRY_KEY_DEFINE
142 ReadRegStr $R1 "${TARGETROOTKEY}" "${TARGETSUBKEY}" ""
144 WriteRegStr "${TARGETROOTKEY}" "${TARGETSUBKEY}" "" ""
146 Push "${SOURCEROOTKEY}"
147 Push "${SOURCESUBKEY}"
148 Push "${TARGETROOTKEY}"
149 Push "${TARGETSUBKEY}"
150 Call ${TYPE}CopyRegistryKey
152 !error "Macro ${TYPE}COPY_REGISTRY_KEY not inserted"
155 ####################################################################################################
156 !macro CALL_COPY_REGISTRY_KEY SOURCEROOTKEY SOURCESUBKEY TARGETROOTKEY TARGETSUBKEY
157 !insertmacro CALL_COPY_REGISTRY_KEY_BASE "" "${SOURCEROOTKEY}" "${SOURCESUBKEY}" "${TARGETROOTKEY}" "${TARGETSUBKEY}"
159 ####################################################################################################
160 !macro CALL_UN.COPY_REGISTRY_KEY SOURCEROOTKEY SOURCESUBKEY TARGETROOTKEY TARGETSUBKEY
161 !insertmacro CALL_COPY_REGISTRY_KEY_BASE "Un." "${SOURCEROOTKEY}" "${SOURCESUBKEY}" "${TARGETROOTKEY}" "${TARGETSUBKEY}"
163 ####################################################################################################
164 !define COPY_REGISTRY_KEY "!insertmacro CALL_COPY_REGISTRY_KEY"
165 !define UN.COPY_REGISTRY_KEY "!insertmacro UN.CALL_COPY_REGISTRY_KEY"