]> git.lyx.org Git - lyx.git/blob - development/Win32/packaging/AltInstaller/registry.nsh
Make sure that undo is recorded when magic tricks are played with InsetBibitem.
[lyx.git] / development / Win32 / packaging / AltInstaller / registry.nsh
1 !ifndef REGISTRY_NSH
2 !define REGISTRY_NSH
3 !include "${NSISDIR}\Examples\System\system.nsh"
4
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
12
13 !define KEY_ALL_ACCESS          0x0002003F
14
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'
19
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}
24     GoTo ${LABEL}
25     StrCmp ${HKEY_NAME} HKEY_CLASSES_ROOT 0 +3
26     StrCpy ${HKEY_ENUM} ${HKEY_CLASSES_ROOT_ENUM}
27     GoTo ${LABEL}
28     StrCmp ${HKEY_NAME} HKCU 0 +3
29     StrCpy ${HKEY_ENUM} ${HKEY_CURRENT_USER_ENUM}
30     GoTo ${LABEL}
31     StrCmp ${HKEY_NAME} HKEY_CURRENT_USER 0 +3
32     StrCpy ${HKEY_ENUM} ${HKEY_CURRENT_USER_ENUM}
33     GoTo ${LABEL}
34     StrCmp ${HKEY_NAME} HKLM 0 +3
35     StrCpy ${HKEY_ENUM} ${HKEY_LOCAL_MACHINE_ENUM}
36     GoTo ${LABEL}
37     StrCmp ${HKEY_NAME} HKEY_LOCAL_MACHINE 0 +3
38     StrCpy ${HKEY_ENUM} ${HKEY_LOCAL_MACHINE_ENUM}
39     GoTo ${LABEL}
40     StrCmp ${HKEY_NAME} HKU 0 +3
41     StrCpy ${HKEY_ENUM} ${HKEY_USERS_ENUM}
42     GoTo ${LABEL}
43     StrCmp ${HKEY_NAME} HKEY_USERS 0 +3
44     StrCpy ${HKEY_ENUM} ${HKEY_USERS_ENUM}
45     GoTo ${LABEL}
46     StrCmp ${HKEY_NAME} HKPD 0 +3
47     StrCpy ${HKEY_ENUM} ${HKEY_PERFORMANCE_DATA_ENUM}
48     GoTo ${LABEL}
49     StrCmp ${HKEY_NAME} HKEY_PERFORMANCE_DATA 0 +3
50     StrCpy ${HKEY_ENUM} ${HKEY_PERFORMANCE_DATA_ENUM}
51     GoTo ${LABEL}
52     StrCmp ${HKEY_NAME} HKCC 0 +3
53     StrCpy ${HKEY_ENUM} ${HKEY_CURRENT_CONFIG_ENUM}
54     GoTo ${LABEL}
55     StrCmp ${HKEY_NAME} HKEY_CURRENT_CONFIG 0 +3
56     StrCpy ${HKEY_ENUM} ${HKEY_CURRENT_CONFIG_ENUM}
57     GoTo ${LABEL}
58     StrCmp ${HKEY_NAME} HKDD 0 +3
59     StrCpy ${HKEY_ENUM} ${HKEY_DYN_DATA_ENUM}
60     GoTo ${LABEL}
61     StrCmp ${HKEY_NAME} HKEY_DYN_DATA 0 +3
62     StrCpy ${HKEY_ENUM} ${HKEY_DYN_DATA_ENUM}
63 ${LABEL}:
64 !macroend
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
71     Exch
72     Exch $2 ;Target key name
73     Exch
74     Exch 2
75     Exch $3 ;Source subkey
76     Exch
77     Exch 2
78     Exch 3
79     Exch $4 ;Source key name
80     Push $5 ;Source key handle
81     Push $6 ;Target key handle
82     Push $7 ;return value
83     Push $8 ;HKEY enum for target key
84     Push $9 ;HKEY enum for source key
85
86 !insertmacro SET_HKEY_ENUM $2 $8 next
87 !insertmacro SET_HKEY_ENUM $4 $9 next2
88
89      SetPluginUnload alwaysoff
90
91      StrCpy $5 0
92      System::Call '${RegOpenKeyEx}(i r9, t r3, 0, ${KEY_ALL_ACCESS}, .r5) .r7'
93      StrCmp $7 0 continue
94      DetailPrint "Registry key $4\$3 not found."
95      StrCpy $1 $7
96      GoTo done
97
98 continue:
99      StrCpy $6 0
100      System::Call '${RegCreateKeyEx}(i r8, t r1, 0, 0, 0, ${KEY_ALL_ACCESS}, 0, .r6, 0) .r7'
101      StrCmp $7 0 copy
102      MessageBox MB_OK|MB_ICONSTOP "Error $7 opening registry key $2\$1."
103      StrCpy $1 $7
104      GoTo done
105
106 copy:
107      System::Call '${SHCopyKey}(i r5, "", i r6, 0) .r7'
108      StrCmp $7 0 +2
109      MessageBox MB_OK|MB_ICONSTOP "Error $7 copying registry key."
110      StrCpy $1 $7
111
112 done:
113      System::Call '${RegCloseKey}(i r5) .r7'
114      System::Call '${RegCloseKey}(i r6) .r7'
115      SetPluginUnload manual
116      System::Free 0
117
118      Pop $9
119      Pop $8
120      Pop $7
121      Pop $6
122      Pop $5
123      Pop $4
124      Pop $3
125      Pop $2
126      Exch $1
127 FunctionEnd
128 !endif
129 !macroend
130 ####################################################################################################
131 !macro COPY_REGISTRY_KEY
132 !insertmacro COPY_REGISTRY_KEY_BASE ""
133 !macroend
134 ####################################################################################################
135 !macro UN.COPY_REGISTRY_KEY
136 !insertmacro COPY_REGISTRY_KEY_BASE "Un."
137 !macroend
138 ####################################################################################################
139 !macro CALL_COPY_REGISTRY_KEY_BASE TYPE SOURCEROOTKEY SOURCESUBKEY TARGETROOTKEY TARGETSUBKEY
140 !ifdef ${TYPE}COPY_REGISTRY_KEY_DEFINE
141     Push $R1
142     ReadRegStr $R1 "${TARGETROOTKEY}" "${TARGETSUBKEY}" ""
143     IfErrors 0 +2
144     WriteRegStr "${TARGETROOTKEY}" "${TARGETSUBKEY}" "" ""
145     Pop $R1
146     Push "${SOURCEROOTKEY}"
147     Push "${SOURCESUBKEY}"
148     Push "${TARGETROOTKEY}"
149     Push "${TARGETSUBKEY}"
150     Call ${TYPE}CopyRegistryKey
151 !else
152 !error "Macro ${TYPE}COPY_REGISTRY_KEY not inserted"
153 !endif
154 !macroend
155 ####################################################################################################
156 !macro CALL_COPY_REGISTRY_KEY SOURCEROOTKEY SOURCESUBKEY TARGETROOTKEY TARGETSUBKEY
157 !insertmacro CALL_COPY_REGISTRY_KEY_BASE "" "${SOURCEROOTKEY}" "${SOURCESUBKEY}" "${TARGETROOTKEY}" "${TARGETSUBKEY}"
158 !macroend
159 ####################################################################################################
160 !macro CALL_UN.COPY_REGISTRY_KEY SOURCEROOTKEY SOURCESUBKEY TARGETROOTKEY TARGETSUBKEY
161 !insertmacro CALL_COPY_REGISTRY_KEY_BASE "Un." "${SOURCEROOTKEY}" "${SOURCESUBKEY}" "${TARGETROOTKEY}" "${TARGETSUBKEY}"
162 !macroend
163 ####################################################################################################
164 !define COPY_REGISTRY_KEY "!insertmacro CALL_COPY_REGISTRY_KEY"
165 !define UN.COPY_REGISTRY_KEY "!insertmacro UN.CALL_COPY_REGISTRY_KEY"
166 !endif