macho: Improve macho_calculate_sizes
[nasm.git] / nsis / MultiUser.nsh
bloba04048ab877bd6fb2580b76c819ef1ee543eed58
1 /*\r
2 \r
3 MultiUser.nsh\r
4 \r
5 Installer configuration for multi-user Windows environments\r
6 \r
7 Copyright 2008-2009 Joost Verburg\r
8 Updated 2016 by H. Peter Anvin to handle 64-bit Windows\r
9 \r
10 */\r
12 !ifndef MULTIUSER_INCLUDED\r
13 !define MULTIUSER_INCLUDED\r
14 !verbose push\r
15 !verbose 3\r
17 ;Standard NSIS header files\r
19 !ifdef MULTIUSER_MUI\r
20   !include MUI2.nsh\r
21 !endif\r
22 !include nsDialogs.nsh\r
23 !include LogicLib.nsh\r
24 !include WinVer.nsh\r
25 !include FileFunc.nsh\r
27 ;Variables\r
29 Var MultiUser.Privileges\r
30 Var MultiUser.InstallMode\r
32 ;Command line installation mode setting\r
34 !ifdef MULTIUSER_INSTALLMODE_COMMANDLINE\r
35   !include StrFunc.nsh\r
36   !ifndef StrStr_INCLUDED\r
37     ${StrStr}\r
38   !endif\r
39   !ifndef MULTIUSER_NOUNINSTALL\r
40     !ifndef UnStrStr_INCLUDED\r
41       ${UnStrStr}\r
42     !endif\r
43   !endif\r
44   \r
45   Var MultiUser.Parameters\r
46   Var MultiUser.Result\r
47 !endif\r
49 ;Installation folder stored in registry\r
51 !ifdef MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_KEY & MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_VALUENAME\r
52   Var MultiUser.InstDir\r
53 !endif\r
55 !ifdef MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_KEY & MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_VALUENAME\r
56   Var MultiUser.DefaultKeyValue\r
57 !endif\r
59 ;Windows Vista UAC setting\r
61 !if "${MULTIUSER_EXECUTIONLEVEL}" == Admin\r
62   RequestExecutionLevel admin\r
63   !define MULTIUSER_EXECUTIONLEVEL_ALLUSERS\r
64 !else if "${MULTIUSER_EXECUTIONLEVEL}" == Power\r
65   RequestExecutionLevel admin\r
66   !define MULTIUSER_EXECUTIONLEVEL_ALLUSERS\r
67 !else if "${MULTIUSER_EXECUTIONLEVEL}" == Highest\r
68   RequestExecutionLevel highest\r
69   !define MULTIUSER_EXECUTIONLEVEL_ALLUSERS\r
70 !else\r
71   RequestExecutionLevel user\r
72 !endif\r
74 /*\r
76 Install modes\r
78 */\r
80 !macro MULTIUSER_INSTALLMODE_ALLUSERS UNINSTALLER_PREFIX UNINSTALLER_FUNCPREFIX\r
82   ;Install mode initialization - per-machine\r
84   ${ifnot} ${IsNT}\r
85     ${orif} $MultiUser.Privileges == "Admin"\r
86     ${orif} $MultiUser.Privileges == "Power"\r
87   \r
88     StrCpy $MultiUser.InstallMode AllUsers\r
89   \r
90     SetShellVarContext all\r
91   \r
92     !if "${UNINSTALLER_PREFIX}" != UN\r
93       ;Set default installation location for installer\r
94       !ifdef MULTIUSER_INSTALLMODE_INSTDIR\r
95         StrCpy $INSTDIR "${GLOBALINSTDIR}\${MULTIUSER_INSTALLMODE_INSTDIR}"\r
96       !endif\r
97     !endif\r
98   \r
99     !ifdef MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_KEY & MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_VALUENAME\r
100   \r
101       ReadRegStr $MultiUser.InstDir HKLM "${MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_KEY}" "${MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_VALUENAME}"\r
102   \r
103       ${if} $MultiUser.InstDir != ""\r
104         StrCpy $INSTDIR $MultiUser.InstDir\r
105       ${endif}\r
106   \r
107     !endif\r
108   \r
109     !ifdef MULTIUSER_INSTALLMODE_${UNINSTALLER_PREFIX}FUNCTION\r
110       Call "${MULTIUSER_INSTALLMODE_${UNINSTALLER_PREFIX}FUNCTION}"\r
111     !endif\r
112     \r
113   ${endif}\r
115 !macroend\r
117 !macro MULTIUSER_INSTALLMODE_CURRENTUSER UNINSTALLER_PREFIX UNINSTALLER_FUNCPREFIX\r
119   ;Install mode initialization - per-user\r
120   \r
121   ${if} ${IsNT}  \r
122   \r
123     StrCpy $MultiUser.InstallMode CurrentUser\r
124     \r
125     SetShellVarContext current\r
126   \r
127     !if "${UNINSTALLER_PREFIX}" != UN\r
128       ;Set default installation location for installer  \r
129       !ifdef MULTIUSER_INSTALLMODE_INSTDIR\r
130         ${if} ${AtLeastWin2000}\r
131           StrCpy $INSTDIR "$LOCALAPPDATA\bin\${MULTIUSER_INSTALLMODE_INSTDIR}"\r
132         ${else}\r
133           StrCpy $INSTDIR "${GLOBALINSTDIR}\${MULTIUSER_INSTALLMODE_INSTDIR}"\r
134         ${endif}\r
135       !endif\r
136     !endif\r
137   \r
138     !ifdef MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_KEY & MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_VALUENAME\r
139   \r
140       ReadRegStr $MultiUser.InstDir HKCU "${MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_KEY}" "${MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_VALUENAME}"\r
141   \r
142       ${if} $MultiUser.InstDir != ""\r
143         StrCpy $INSTDIR $MultiUser.InstDir\r
144       ${endif}\r
145   \r
146     !endif\r
147   \r
148     !ifdef MULTIUSER_INSTALLMODE_${UNINSTALLER_PREFIX}FUNCTION\r
149       Call "${MULTIUSER_INSTALLMODE_${UNINSTALLER_PREFIX}FUNCTION}"\r
150     !endif\r
151   \r
152   ${endif}\r
154 !macroend\r
156 Function MultiUser.InstallMode.AllUsers\r
157   !insertmacro MULTIUSER_INSTALLMODE_ALLUSERS "" ""\r
158 FunctionEnd\r
160 Function MultiUser.InstallMode.CurrentUser\r
161   !insertmacro MULTIUSER_INSTALLMODE_CURRENTUSER "" ""\r
162 FunctionEnd\r
164 !ifndef MULTIUSER_NOUNINSTALL\r
166 Function un.MultiUser.InstallMode.AllUsers\r
167   !insertmacro MULTIUSER_INSTALLMODE_ALLUSERS UN .un\r
168 FunctionEnd\r
170 Function un.MultiUser.InstallMode.CurrentUser\r
171   !insertmacro MULTIUSER_INSTALLMODE_CURRENTUSER UN .un\r
172 FunctionEnd\r
174 !endif\r
176 /*\r
178 Installer/uninstaller initialization\r
180 */\r
182 !macro MULTIUSER_INIT_QUIT UNINSTALLER_FUNCPREFIX\r
184   !ifdef MULTIUSER_INIT_${UNINSTALLER_FUNCPREFIX}FUNCTIONQUIT\r
185     Call "${MULTIUSER_INIT_${UNINSTALLER_FUNCPREFIX}FUCTIONQUIT}\r
186   !else\r
187     Quit\r
188   !endif\r
190 !macroend\r
192 !macro MULTIUSER_INIT_TEXTS\r
194   !ifndef MULTIUSER_INIT_TEXT_ADMINREQUIRED\r
195     !define MULTIUSER_INIT_TEXT_ADMINREQUIRED "$(^Caption) requires Administrator priviledges."\r
196   !endif\r
198   !ifndef MULTIUSER_INIT_TEXT_POWERREQUIRED\r
199     !define MULTIUSER_INIT_TEXT_POWERREQUIRED "$(^Caption) requires at least Power User priviledges."\r
200   !endif\r
202   !ifndef MULTIUSER_INIT_TEXT_ALLUSERSNOTPOSSIBLE\r
203     !define MULTIUSER_INIT_TEXT_ALLUSERSNOTPOSSIBLE "Your user account does not have sufficient privileges to install $(^Name) for all users of this compuetr."\r
204   !endif\r
206 !macroend\r
208 !macro MULTIUSER_INIT_CHECKS UNINSTALLER_PREFIX UNINSTALLER_FUNCPREFIX\r
210   ;Installer initialization - check privileges and set install mode\r
212   !insertmacro MULTIUSER_INIT_TEXTS\r
214   UserInfo::GetAccountType\r
215   Pop $MultiUser.Privileges\r
216   \r
217   ${if} ${IsNT}\r
218   \r
219     ;Check privileges\r
220   \r
221     !if "${MULTIUSER_EXECUTIONLEVEL}" == Admin\r
222   \r
223       ${if} $MultiUser.Privileges != "Admin"\r
224         MessageBox MB_OK|MB_ICONSTOP "${MULTIUSER_INIT_TEXT_ADMINREQUIRED}"\r
225         !insertmacro MULTIUSER_INIT_QUIT "${UNINSTALLER_FUNCPREFIX}"\r
226       ${endif}\r
227   \r
228     !else if "${MULTIUSER_EXECUTIONLEVEL}" == Power\r
229   \r
230       ${if} $MultiUser.Privileges != "Power"\r
231         ${andif} $MultiUser.Privileges != "Admin"\r
232         ${if} ${AtMostWinXP}\r
233            MessageBox MB_OK|MB_ICONSTOP "${MULTIUSER_INIT_TEXT_POWERREQUIRED}"\r
234         ${else}\r
235            MessageBox MB_OK|MB_ICONSTOP "${MULTIUSER_INIT_TEXT_ADMINREQUIRED}"\r
236         ${endif}        \r
237         !insertmacro MULTIUSER_INIT_QUIT "${UNINSTALLER_FUNCPREFIX}"\r
238       ${endif}\r
239   \r
240     !endif\r
241     \r
242     !ifdef MULTIUSER_EXECUTIONLEVEL_ALLUSERS\r
243     \r
244       ;Default to per-machine installation if possible\r
245     \r
246       ${if} $MultiUser.Privileges == "Admin"\r
247         ${orif} $MultiUser.Privileges == "Power"\r
248         !ifndef MULTIUSER_INSTALLMODE_DEFAULT_CURRENTUSER\r
249           Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.AllUsers\r
250         !else\r
251           Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.CurrentUser\r
252         !endif\r
254         !ifdef MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_KEY & MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_VALUENAME\r
256           ;Set installation mode to setting from a previous installation\r
258           !ifndef MULTIUSER_INSTALLMODE_DEFAULT_CURRENTUSER\r
259             ReadRegStr $MultiUser.DefaultKeyValue HKLM "${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_KEY}" "${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_VALUENAME}"\r
260             ${if} $MultiUser.DefaultKeyValue == ""\r
261               ReadRegStr $MultiUser.DefaultKeyValue HKCU "${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_KEY}" "${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_VALUENAME}"\r
262               ${if} $MultiUser.DefaultKeyValue != ""\r
263                 Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.CurrentUser\r
264               ${endif}\r
265             ${endif}\r
266           !else\r
267             ReadRegStr $MultiUser.DefaultKeyValue HKCU "${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_KEY}" "${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_VALUENAME}"\r
268             ${if} $MultiUser.DefaultKeyValue == ""\r
269               ReadRegStr $MultiUser.DefaultKeyValue HKLM "${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_KEY}" "${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_VALUENAME}"\r
270               ${if} $MultiUser.DefaultKeyValue != ""\r
271                 Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.AllUsers\r
272               ${endif}\r
273             ${endif}\r
274           !endif\r
276         !endif\r
278       ${else}\r
279         Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.CurrentUser\r
280       ${endif}\r
281     \r
282     !else\r
284       Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.CurrentUser\r
286     !endif  \r
287   \r
288     !ifdef MULTIUSER_INSTALLMODE_COMMANDLINE\r
289     \r
290       ;Check for install mode setting on command line\r
292       ${${UNINSTALLER_FUNCPREFIX}GetParameters} $MultiUser.Parameters\r
293   \r
294       ${${UNINSTALLER_PREFIX}StrStr} $MultiUser.Result $MultiUser.Parameters "/CurrentUser"    \r
295     \r
296       ${if} $MultiUser.Result != ""\r
297         Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.CurrentUser\r
298       ${endif}    \r
299   \r
300       ${${UNINSTALLER_PREFIX}StrStr} $MultiUser.Result $MultiUser.Parameters "/AllUsers"    \r
301     \r
302       ${if} $MultiUser.Result != ""\r
303         ${if} $MultiUser.Privileges == "Admin"\r
304           ${orif} $MultiUser.Privileges == "Power"\r
305           Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.AllUsers\r
306         ${else}\r
307           MessageBox MB_OK|MB_ICONSTOP "${MULTIUSER_INIT_TEXT_ALLUSERSNOTPOSSIBLE}"\r
308         ${endif}\r
309       ${endif}\r
310   \r
311     !endif\r
312     \r
313   ${else}\r
314   \r
315     ;Not running Windows NT, per-user installation not supported\r
316     \r
317     Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.AllUsers\r
318   \r
319   ${endif}\r
321 !macroend\r
323 !macro MULTIUSER_INIT\r
324   !verbose push\r
325   !verbose 3\r
326   \r
327   !insertmacro MULTIUSER_INIT_CHECKS "" ""\r
328   \r
329   !verbose pop \r
330 !macroend\r
332 !ifndef MULTIUSER_NOUNINSTALL\r
334 !macro MULTIUSER_UNINIT\r
335   !verbose push\r
336   !verbose 3\r
337   \r
338   !insertmacro MULTIUSER_INIT_CHECKS Un un.\r
339   \r
340   !verbose pop \r
341 !macroend\r
343 !endif\r
345 /*\r
347 Modern UI 2 page\r
349 */\r
351 !ifdef MULTIUSER_MUI\r
353 !macro MULTIUSER_INSTALLMODEPAGE_INTERFACE\r
355   !ifndef MULTIUSER_INSTALLMODEPAGE_INTERFACE\r
356     !define MULTIUSER_INSTALLMODEPAGE_INTERFACE\r
357     Var MultiUser.InstallModePage\r
358     \r
359     Var MultiUser.InstallModePage.Text\r
360     \r
361     Var MultiUser.InstallModePage.AllUsers\r
362     Var MultiUser.InstallModePage.CurrentUser\r
363     \r
364     Var MultiUser.InstallModePage.ReturnValue\r
365   !endif\r
367 !macroend\r
369 !macro MULTIUSER_PAGEDECLARATION_INSTALLMODE\r
371   !insertmacro MUI_SET MULTIUSER_${MUI_PAGE_UNINSTALLER_PREFIX}INSTALLMODEPAGE ""\r
372   !insertmacro MULTIUSER_INSTALLMODEPAGE_INTERFACE\r
374   !insertmacro MUI_DEFAULT MULTIUSER_INSTALLMODEPAGE_TEXT_TOP "$(MULTIUSER_INNERTEXT_INSTALLMODE_TOP)"\r
375   !insertmacro MUI_DEFAULT MULTIUSER_INSTALLMODEPAGE_TEXT_ALLUSERS "$(MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS)"\r
376   !insertmacro MUI_DEFAULT MULTIUSER_INSTALLMODEPAGE_TEXT_CURRENTUSER "$(MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER)"  \r
378   PageEx custom\r
380     PageCallbacks MultiUser.InstallModePre_${MUI_UNIQUEID} MultiUser.InstallModeLeave_${MUI_UNIQUEID}\r
382     Caption " "\r
384   PageExEnd\r
386   !insertmacro MULTIUSER_FUNCTION_INSTALLMODEPAGE MultiUser.InstallModePre_${MUI_UNIQUEID} MultiUser.InstallModeLeave_${MUI_UNIQUEID}\r
388   !undef MULTIUSER_INSTALLMODEPAGE_TEXT_TOP\r
389   !undef MULTIUSER_INSTALLMODEPAGE_TEXT_ALLUSERS\r
390   !undef MULTIUSER_INSTALLMODEPAGE_TEXT_CURRENTUSER\r
392 !macroend\r
394 !macro MULTIUSER_PAGE_INSTALLMODE\r
396   ;Modern UI page for install mode\r
398   !verbose push\r
399   !verbose 3\r
400   \r
401   !ifndef MULTIUSER_EXECUTIONLEVEL_ALLUSERS\r
402     !error "A mixed-mode installation requires MULTIUSER_EXECUTIONLEVEL to be set to Admin, Power or Highest."\r
403   !endif\r
404   \r
405   !insertmacro MUI_PAGE_INIT\r
406   !insertmacro MULTIUSER_PAGEDECLARATION_INSTALLMODE\r
407   \r
408   !verbose pop\r
410 !macroend\r
412 !macro MULTIUSER_FUNCTION_INSTALLMODEPAGE PRE LEAVE\r
414   ;Page functions of Modern UI page\r
416   Function "${PRE}"\r
417   \r
418     ${ifnot} ${IsNT}\r
419       Abort\r
420     ${endif}\r
421   \r
422     ${if} $MultiUser.Privileges != "Power"\r
423       ${andif} $MultiUser.Privileges != "Admin"\r
424       Abort\r
425     ${endif}\r
426     \r
427     !insertmacro MUI_PAGE_FUNCTION_CUSTOM PRE\r
428     !insertmacro MUI_HEADER_TEXT_PAGE $(MULTIUSER_TEXT_INSTALLMODE_TITLE) $(MULTIUSER_TEXT_INSTALLMODE_SUBTITLE)\r
429     \r
430     nsDialogs::Create 1018\r
431     Pop $MultiUser.InstallModePage\r
433     ${NSD_CreateLabel} 0u 0u 300u 20u "${MULTIUSER_INSTALLMODEPAGE_TEXT_TOP}"\r
434     Pop $MultiUser.InstallModePage.Text\r
436     ${NSD_CreateRadioButton} 20u 50u 280u 10u "${MULTIUSER_INSTALLMODEPAGE_TEXT_ALLUSERS}"\r
437     Pop $MultiUser.InstallModePage.AllUsers\r
438     \r
439     ${NSD_CreateRadioButton} 20u 70u 280u 10u "${MULTIUSER_INSTALLMODEPAGE_TEXT_CURRENTUSER}"\r
440     Pop $MultiUser.InstallModePage.CurrentUser\r
441     \r
442     ${if} $MultiUser.InstallMode == "AllUsers"\r
443       SendMessage $MultiUser.InstallModePage.AllUsers ${BM_SETCHECK} ${BST_CHECKED} 0\r
444     ${else}\r
445       SendMessage $MultiUser.InstallModePage.CurrentUser ${BM_SETCHECK} ${BST_CHECKED} 0\r
446     ${endif}\r
447     \r
448     !insertmacro MUI_PAGE_FUNCTION_CUSTOM SHOW\r
449     nsDialogs::Show\r
450     \r
451   FunctionEnd\r
453   Function "${LEAVE}"\r
454      SendMessage $MultiUser.InstallModePage.AllUsers ${BM_GETCHECK} 0 0 $MultiUser.InstallModePage.ReturnValue\r
455      \r
456      ${if} $MultiUser.InstallModePage.ReturnValue = ${BST_CHECKED}\r
457         Call MultiUser.InstallMode.AllUsers\r
458      ${else}\r
459         Call MultiUser.InstallMode.CurrentUser\r
460      ${endif}\r
461   \r
462     !insertmacro MUI_PAGE_FUNCTION_CUSTOM LEAVE\r
463   FunctionEnd\r
465 !macroend\r
467 !endif\r
469 !verbose pop\r
470 !endif\r