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