diff options
author | H. Peter Anvin <hpa@linux.intel.com> | 2017-04-06 22:33:04 -0700 |
---|---|---|
committer | H. Peter Anvin <hpa@linux.intel.com> | 2017-04-06 22:33:04 -0700 |
commit | 69c10c96925b268470b960737bc8e8c9cb2d7da6 (patch) | |
tree | 025067c66e9415c15536731f6094079aba0311de /nsis/NASMMultiUser.nsh | |
parent | 3d823faeead22e03d38930dcf59e64c183412268 (diff) | |
download | nasm-69c10c96925b268470b960737bc8e8c9cb2d7da6.tar.gz |
nsis: show a warning message if we are not privileged
Apparently with newer versions of Windows, a program cannot
be forced-run as administrator without being signed. Instead,
if we aren't administrator, show a message box rather than confusing
the user.
Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
Diffstat (limited to 'nsis/NASMMultiUser.nsh')
-rwxr-xr-x | nsis/NASMMultiUser.nsh | 948 |
1 files changed, 478 insertions, 470 deletions
diff --git a/nsis/NASMMultiUser.nsh b/nsis/NASMMultiUser.nsh index a04048ab..a5dc3a4a 100755 --- a/nsis/NASMMultiUser.nsh +++ b/nsis/NASMMultiUser.nsh @@ -1,470 +1,478 @@ -/*
-
-MultiUser.nsh
-
-Installer configuration for multi-user Windows environments
-
-Copyright 2008-2009 Joost Verburg
-Updated 2016 by H. Peter Anvin to handle 64-bit Windows
-
-*/
-
-!ifndef MULTIUSER_INCLUDED
-!define MULTIUSER_INCLUDED
-!verbose push
-!verbose 3
-
-;Standard NSIS header files
-
-!ifdef MULTIUSER_MUI
- !include MUI2.nsh
-!endif
-!include nsDialogs.nsh
-!include LogicLib.nsh
-!include WinVer.nsh
-!include FileFunc.nsh
-
-;Variables
-
-Var MultiUser.Privileges
-Var MultiUser.InstallMode
-
-;Command line installation mode setting
-
-!ifdef MULTIUSER_INSTALLMODE_COMMANDLINE
- !include StrFunc.nsh
- !ifndef StrStr_INCLUDED
- ${StrStr}
- !endif
- !ifndef MULTIUSER_NOUNINSTALL
- !ifndef UnStrStr_INCLUDED
- ${UnStrStr}
- !endif
- !endif
-
- Var MultiUser.Parameters
- Var MultiUser.Result
-!endif
-
-;Installation folder stored in registry
-
-!ifdef MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_KEY & MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_VALUENAME
- Var MultiUser.InstDir
-!endif
-
-!ifdef MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_KEY & MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_VALUENAME
- Var MultiUser.DefaultKeyValue
-!endif
-
-;Windows Vista UAC setting
-
-!if "${MULTIUSER_EXECUTIONLEVEL}" == Admin
- RequestExecutionLevel admin
- !define MULTIUSER_EXECUTIONLEVEL_ALLUSERS
-!else if "${MULTIUSER_EXECUTIONLEVEL}" == Power
- RequestExecutionLevel admin
- !define MULTIUSER_EXECUTIONLEVEL_ALLUSERS
-!else if "${MULTIUSER_EXECUTIONLEVEL}" == Highest
- RequestExecutionLevel highest
- !define MULTIUSER_EXECUTIONLEVEL_ALLUSERS
-!else
- RequestExecutionLevel user
-!endif
-
-/*
-
-Install modes
-
-*/
-
-!macro MULTIUSER_INSTALLMODE_ALLUSERS UNINSTALLER_PREFIX UNINSTALLER_FUNCPREFIX
-
- ;Install mode initialization - per-machine
-
- ${ifnot} ${IsNT}
- ${orif} $MultiUser.Privileges == "Admin"
- ${orif} $MultiUser.Privileges == "Power"
-
- StrCpy $MultiUser.InstallMode AllUsers
-
- SetShellVarContext all
-
- !if "${UNINSTALLER_PREFIX}" != UN
- ;Set default installation location for installer
- !ifdef MULTIUSER_INSTALLMODE_INSTDIR
- StrCpy $INSTDIR "${GLOBALINSTDIR}\${MULTIUSER_INSTALLMODE_INSTDIR}"
- !endif
- !endif
-
- !ifdef MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_KEY & MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_VALUENAME
-
- ReadRegStr $MultiUser.InstDir HKLM "${MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_KEY}" "${MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_VALUENAME}"
-
- ${if} $MultiUser.InstDir != ""
- StrCpy $INSTDIR $MultiUser.InstDir
- ${endif}
-
- !endif
-
- !ifdef MULTIUSER_INSTALLMODE_${UNINSTALLER_PREFIX}FUNCTION
- Call "${MULTIUSER_INSTALLMODE_${UNINSTALLER_PREFIX}FUNCTION}"
- !endif
-
- ${endif}
-
-!macroend
-
-!macro MULTIUSER_INSTALLMODE_CURRENTUSER UNINSTALLER_PREFIX UNINSTALLER_FUNCPREFIX
-
- ;Install mode initialization - per-user
-
- ${if} ${IsNT}
-
- StrCpy $MultiUser.InstallMode CurrentUser
-
- SetShellVarContext current
-
- !if "${UNINSTALLER_PREFIX}" != UN
- ;Set default installation location for installer
- !ifdef MULTIUSER_INSTALLMODE_INSTDIR
- ${if} ${AtLeastWin2000}
- StrCpy $INSTDIR "$LOCALAPPDATA\bin\${MULTIUSER_INSTALLMODE_INSTDIR}"
- ${else}
- StrCpy $INSTDIR "${GLOBALINSTDIR}\${MULTIUSER_INSTALLMODE_INSTDIR}"
- ${endif}
- !endif
- !endif
-
- !ifdef MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_KEY & MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_VALUENAME
-
- ReadRegStr $MultiUser.InstDir HKCU "${MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_KEY}" "${MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_VALUENAME}"
-
- ${if} $MultiUser.InstDir != ""
- StrCpy $INSTDIR $MultiUser.InstDir
- ${endif}
-
- !endif
-
- !ifdef MULTIUSER_INSTALLMODE_${UNINSTALLER_PREFIX}FUNCTION
- Call "${MULTIUSER_INSTALLMODE_${UNINSTALLER_PREFIX}FUNCTION}"
- !endif
-
- ${endif}
-
-!macroend
-
-Function MultiUser.InstallMode.AllUsers
- !insertmacro MULTIUSER_INSTALLMODE_ALLUSERS "" ""
-FunctionEnd
-
-Function MultiUser.InstallMode.CurrentUser
- !insertmacro MULTIUSER_INSTALLMODE_CURRENTUSER "" ""
-FunctionEnd
-
-!ifndef MULTIUSER_NOUNINSTALL
-
-Function un.MultiUser.InstallMode.AllUsers
- !insertmacro MULTIUSER_INSTALLMODE_ALLUSERS UN .un
-FunctionEnd
-
-Function un.MultiUser.InstallMode.CurrentUser
- !insertmacro MULTIUSER_INSTALLMODE_CURRENTUSER UN .un
-FunctionEnd
-
-!endif
-
-/*
-
-Installer/uninstaller initialization
-
-*/
-
-!macro MULTIUSER_INIT_QUIT UNINSTALLER_FUNCPREFIX
-
- !ifdef MULTIUSER_INIT_${UNINSTALLER_FUNCPREFIX}FUNCTIONQUIT
- Call "${MULTIUSER_INIT_${UNINSTALLER_FUNCPREFIX}FUCTIONQUIT}
- !else
- Quit
- !endif
-
-!macroend
-
-!macro MULTIUSER_INIT_TEXTS
-
- !ifndef MULTIUSER_INIT_TEXT_ADMINREQUIRED
- !define MULTIUSER_INIT_TEXT_ADMINREQUIRED "$(^Caption) requires Administrator priviledges."
- !endif
-
- !ifndef MULTIUSER_INIT_TEXT_POWERREQUIRED
- !define MULTIUSER_INIT_TEXT_POWERREQUIRED "$(^Caption) requires at least Power User priviledges."
- !endif
-
- !ifndef MULTIUSER_INIT_TEXT_ALLUSERSNOTPOSSIBLE
- !define MULTIUSER_INIT_TEXT_ALLUSERSNOTPOSSIBLE "Your user account does not have sufficient privileges to install $(^Name) for all users of this compuetr."
- !endif
-
-!macroend
-
-!macro MULTIUSER_INIT_CHECKS UNINSTALLER_PREFIX UNINSTALLER_FUNCPREFIX
-
- ;Installer initialization - check privileges and set install mode
-
- !insertmacro MULTIUSER_INIT_TEXTS
-
- UserInfo::GetAccountType
- Pop $MultiUser.Privileges
-
- ${if} ${IsNT}
-
- ;Check privileges
-
- !if "${MULTIUSER_EXECUTIONLEVEL}" == Admin
-
- ${if} $MultiUser.Privileges != "Admin"
- MessageBox MB_OK|MB_ICONSTOP "${MULTIUSER_INIT_TEXT_ADMINREQUIRED}"
- !insertmacro MULTIUSER_INIT_QUIT "${UNINSTALLER_FUNCPREFIX}"
- ${endif}
-
- !else if "${MULTIUSER_EXECUTIONLEVEL}" == Power
-
- ${if} $MultiUser.Privileges != "Power"
- ${andif} $MultiUser.Privileges != "Admin"
- ${if} ${AtMostWinXP}
- MessageBox MB_OK|MB_ICONSTOP "${MULTIUSER_INIT_TEXT_POWERREQUIRED}"
- ${else}
- MessageBox MB_OK|MB_ICONSTOP "${MULTIUSER_INIT_TEXT_ADMINREQUIRED}"
- ${endif}
- !insertmacro MULTIUSER_INIT_QUIT "${UNINSTALLER_FUNCPREFIX}"
- ${endif}
-
- !endif
-
- !ifdef MULTIUSER_EXECUTIONLEVEL_ALLUSERS
-
- ;Default to per-machine installation if possible
-
- ${if} $MultiUser.Privileges == "Admin"
- ${orif} $MultiUser.Privileges == "Power"
- !ifndef MULTIUSER_INSTALLMODE_DEFAULT_CURRENTUSER
- Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.AllUsers
- !else
- Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.CurrentUser
- !endif
-
- !ifdef MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_KEY & MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_VALUENAME
-
- ;Set installation mode to setting from a previous installation
-
- !ifndef MULTIUSER_INSTALLMODE_DEFAULT_CURRENTUSER
- ReadRegStr $MultiUser.DefaultKeyValue HKLM "${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_KEY}" "${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_VALUENAME}"
- ${if} $MultiUser.DefaultKeyValue == ""
- ReadRegStr $MultiUser.DefaultKeyValue HKCU "${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_KEY}" "${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_VALUENAME}"
- ${if} $MultiUser.DefaultKeyValue != ""
- Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.CurrentUser
- ${endif}
- ${endif}
- !else
- ReadRegStr $MultiUser.DefaultKeyValue HKCU "${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_KEY}" "${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_VALUENAME}"
- ${if} $MultiUser.DefaultKeyValue == ""
- ReadRegStr $MultiUser.DefaultKeyValue HKLM "${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_KEY}" "${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_VALUENAME}"
- ${if} $MultiUser.DefaultKeyValue != ""
- Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.AllUsers
- ${endif}
- ${endif}
- !endif
-
- !endif
-
- ${else}
- Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.CurrentUser
- ${endif}
-
- !else
-
- Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.CurrentUser
-
- !endif
-
- !ifdef MULTIUSER_INSTALLMODE_COMMANDLINE
-
- ;Check for install mode setting on command line
-
- ${${UNINSTALLER_FUNCPREFIX}GetParameters} $MultiUser.Parameters
-
- ${${UNINSTALLER_PREFIX}StrStr} $MultiUser.Result $MultiUser.Parameters "/CurrentUser"
-
- ${if} $MultiUser.Result != ""
- Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.CurrentUser
- ${endif}
-
- ${${UNINSTALLER_PREFIX}StrStr} $MultiUser.Result $MultiUser.Parameters "/AllUsers"
-
- ${if} $MultiUser.Result != ""
- ${if} $MultiUser.Privileges == "Admin"
- ${orif} $MultiUser.Privileges == "Power"
- Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.AllUsers
- ${else}
- MessageBox MB_OK|MB_ICONSTOP "${MULTIUSER_INIT_TEXT_ALLUSERSNOTPOSSIBLE}"
- ${endif}
- ${endif}
-
- !endif
-
- ${else}
-
- ;Not running Windows NT, per-user installation not supported
-
- Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.AllUsers
-
- ${endif}
-
-!macroend
-
-!macro MULTIUSER_INIT
- !verbose push
- !verbose 3
-
- !insertmacro MULTIUSER_INIT_CHECKS "" ""
-
- !verbose pop
-!macroend
-
-!ifndef MULTIUSER_NOUNINSTALL
-
-!macro MULTIUSER_UNINIT
- !verbose push
- !verbose 3
-
- !insertmacro MULTIUSER_INIT_CHECKS Un un.
-
- !verbose pop
-!macroend
-
-!endif
-
-/*
-
-Modern UI 2 page
-
-*/
-
-!ifdef MULTIUSER_MUI
-
-!macro MULTIUSER_INSTALLMODEPAGE_INTERFACE
-
- !ifndef MULTIUSER_INSTALLMODEPAGE_INTERFACE
- !define MULTIUSER_INSTALLMODEPAGE_INTERFACE
- Var MultiUser.InstallModePage
-
- Var MultiUser.InstallModePage.Text
-
- Var MultiUser.InstallModePage.AllUsers
- Var MultiUser.InstallModePage.CurrentUser
-
- Var MultiUser.InstallModePage.ReturnValue
- !endif
-
-!macroend
-
-!macro MULTIUSER_PAGEDECLARATION_INSTALLMODE
-
- !insertmacro MUI_SET MULTIUSER_${MUI_PAGE_UNINSTALLER_PREFIX}INSTALLMODEPAGE ""
- !insertmacro MULTIUSER_INSTALLMODEPAGE_INTERFACE
-
- !insertmacro MUI_DEFAULT MULTIUSER_INSTALLMODEPAGE_TEXT_TOP "$(MULTIUSER_INNERTEXT_INSTALLMODE_TOP)"
- !insertmacro MUI_DEFAULT MULTIUSER_INSTALLMODEPAGE_TEXT_ALLUSERS "$(MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS)"
- !insertmacro MUI_DEFAULT MULTIUSER_INSTALLMODEPAGE_TEXT_CURRENTUSER "$(MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER)"
-
- PageEx custom
-
- PageCallbacks MultiUser.InstallModePre_${MUI_UNIQUEID} MultiUser.InstallModeLeave_${MUI_UNIQUEID}
-
- Caption " "
-
- PageExEnd
-
- !insertmacro MULTIUSER_FUNCTION_INSTALLMODEPAGE MultiUser.InstallModePre_${MUI_UNIQUEID} MultiUser.InstallModeLeave_${MUI_UNIQUEID}
-
- !undef MULTIUSER_INSTALLMODEPAGE_TEXT_TOP
- !undef MULTIUSER_INSTALLMODEPAGE_TEXT_ALLUSERS
- !undef MULTIUSER_INSTALLMODEPAGE_TEXT_CURRENTUSER
-
-!macroend
-
-!macro MULTIUSER_PAGE_INSTALLMODE
-
- ;Modern UI page for install mode
-
- !verbose push
- !verbose 3
-
- !ifndef MULTIUSER_EXECUTIONLEVEL_ALLUSERS
- !error "A mixed-mode installation requires MULTIUSER_EXECUTIONLEVEL to be set to Admin, Power or Highest."
- !endif
-
- !insertmacro MUI_PAGE_INIT
- !insertmacro MULTIUSER_PAGEDECLARATION_INSTALLMODE
-
- !verbose pop
-
-!macroend
-
-!macro MULTIUSER_FUNCTION_INSTALLMODEPAGE PRE LEAVE
-
- ;Page functions of Modern UI page
-
- Function "${PRE}"
-
- ${ifnot} ${IsNT}
- Abort
- ${endif}
-
- ${if} $MultiUser.Privileges != "Power"
- ${andif} $MultiUser.Privileges != "Admin"
- Abort
- ${endif}
-
- !insertmacro MUI_PAGE_FUNCTION_CUSTOM PRE
- !insertmacro MUI_HEADER_TEXT_PAGE $(MULTIUSER_TEXT_INSTALLMODE_TITLE) $(MULTIUSER_TEXT_INSTALLMODE_SUBTITLE)
-
- nsDialogs::Create 1018
- Pop $MultiUser.InstallModePage
-
- ${NSD_CreateLabel} 0u 0u 300u 20u "${MULTIUSER_INSTALLMODEPAGE_TEXT_TOP}"
- Pop $MultiUser.InstallModePage.Text
-
- ${NSD_CreateRadioButton} 20u 50u 280u 10u "${MULTIUSER_INSTALLMODEPAGE_TEXT_ALLUSERS}"
- Pop $MultiUser.InstallModePage.AllUsers
-
- ${NSD_CreateRadioButton} 20u 70u 280u 10u "${MULTIUSER_INSTALLMODEPAGE_TEXT_CURRENTUSER}"
- Pop $MultiUser.InstallModePage.CurrentUser
-
- ${if} $MultiUser.InstallMode == "AllUsers"
- SendMessage $MultiUser.InstallModePage.AllUsers ${BM_SETCHECK} ${BST_CHECKED} 0
- ${else}
- SendMessage $MultiUser.InstallModePage.CurrentUser ${BM_SETCHECK} ${BST_CHECKED} 0
- ${endif}
-
- !insertmacro MUI_PAGE_FUNCTION_CUSTOM SHOW
- nsDialogs::Show
-
- FunctionEnd
-
- Function "${LEAVE}"
- SendMessage $MultiUser.InstallModePage.AllUsers ${BM_GETCHECK} 0 0 $MultiUser.InstallModePage.ReturnValue
-
- ${if} $MultiUser.InstallModePage.ReturnValue = ${BST_CHECKED}
- Call MultiUser.InstallMode.AllUsers
- ${else}
- Call MultiUser.InstallMode.CurrentUser
- ${endif}
-
- !insertmacro MUI_PAGE_FUNCTION_CUSTOM LEAVE
- FunctionEnd
-
-!macroend
-
-!endif
-
-!verbose pop
-!endif
+/* + +MultiUser.nsh + +Installer configuration for multi-user Windows environments + +Copyright 2008-2009 Joost Verburg +Updated 2016 by H. Peter Anvin to handle 64-bit Windows + +*/ + +!ifndef MULTIUSER_INCLUDED +!define MULTIUSER_INCLUDED +!verbose push +!verbose 3 + +;Standard NSIS header files + +!ifdef MULTIUSER_MUI + !include MUI2.nsh +!endif +!include nsDialogs.nsh +!include LogicLib.nsh +!include WinVer.nsh +!include FileFunc.nsh + +;Variables + +Var MultiUser.Privileges +Var MultiUser.InstallMode + +;Command line installation mode setting + +!ifdef MULTIUSER_INSTALLMODE_COMMANDLINE + !include StrFunc.nsh + !ifndef StrStr_INCLUDED + ${StrStr} + !endif + !ifndef MULTIUSER_NOUNINSTALL + !ifndef UnStrStr_INCLUDED + ${UnStrStr} + !endif + !endif + + Var MultiUser.Parameters + Var MultiUser.Result +!endif + +;Installation folder stored in registry + +!ifdef MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_KEY & MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_VALUENAME + Var MultiUser.InstDir +!endif + +!ifdef MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_KEY & MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_VALUENAME + Var MultiUser.DefaultKeyValue +!endif + +;Windows Vista UAC setting + +!if "${MULTIUSER_EXECUTIONLEVEL}" == Admin + RequestExecutionLevel admin + !define MULTIUSER_EXECUTIONLEVEL_ALLUSERS +!else if "${MULTIUSER_EXECUTIONLEVEL}" == Power + RequestExecutionLevel admin + !define MULTIUSER_EXECUTIONLEVEL_ALLUSERS +!else if "${MULTIUSER_EXECUTIONLEVEL}" == Highest + RequestExecutionLevel highest + !define MULTIUSER_EXECUTIONLEVEL_ALLUSERS +!else + RequestExecutionLevel user +!endif + +/* + +Install modes + +*/ + +!macro MULTIUSER_INSTALLMODE_ALLUSERS UNINSTALLER_PREFIX UNINSTALLER_FUNCPREFIX + + ;Install mode initialization - per-machine + + ${ifnot} ${IsNT} + ${orif} $MultiUser.Privileges == "Admin" + ${orif} $MultiUser.Privileges == "Power" + + StrCpy $MultiUser.InstallMode AllUsers + + SetShellVarContext all + + !if "${UNINSTALLER_PREFIX}" != UN + ;Set default installation location for installer + !ifdef MULTIUSER_INSTALLMODE_INSTDIR + StrCpy $INSTDIR "${GLOBALINSTDIR}\${MULTIUSER_INSTALLMODE_INSTDIR}" + !endif + !endif + + !ifdef MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_KEY & MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_VALUENAME + + ReadRegStr $MultiUser.InstDir HKLM "${MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_KEY}" "${MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_VALUENAME}" + + ${if} $MultiUser.InstDir != "" + StrCpy $INSTDIR $MultiUser.InstDir + ${endif} + + !endif + + !ifdef MULTIUSER_INSTALLMODE_${UNINSTALLER_PREFIX}FUNCTION + Call "${MULTIUSER_INSTALLMODE_${UNINSTALLER_PREFIX}FUNCTION}" + !endif + + ${endif} + +!macroend + +!macro MULTIUSER_INSTALLMODE_CURRENTUSER UNINSTALLER_PREFIX UNINSTALLER_FUNCPREFIX + + ;Install mode initialization - per-user + + ${if} ${IsNT} + + StrCpy $MultiUser.InstallMode CurrentUser + + SetShellVarContext current + + !if "${UNINSTALLER_PREFIX}" != UN + ;Set default installation location for installer + !ifdef MULTIUSER_INSTALLMODE_INSTDIR + ${if} ${AtLeastWin2000} + StrCpy $INSTDIR "$LOCALAPPDATA\bin\${MULTIUSER_INSTALLMODE_INSTDIR}" + ${else} + StrCpy $INSTDIR "${GLOBALINSTDIR}\${MULTIUSER_INSTALLMODE_INSTDIR}" + ${endif} + !endif + !endif + + !ifdef MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_KEY & MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_VALUENAME + + ReadRegStr $MultiUser.InstDir HKCU "${MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_KEY}" "${MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_VALUENAME}" + + ${if} $MultiUser.InstDir != "" + StrCpy $INSTDIR $MultiUser.InstDir + ${endif} + + !endif + + !ifdef MULTIUSER_INSTALLMODE_${UNINSTALLER_PREFIX}FUNCTION + Call "${MULTIUSER_INSTALLMODE_${UNINSTALLER_PREFIX}FUNCTION}" + !endif + + ${endif} + +!macroend + +Function MultiUser.InstallMode.AllUsers + !insertmacro MULTIUSER_INSTALLMODE_ALLUSERS "" "" +FunctionEnd + +Function MultiUser.InstallMode.CurrentUser + !insertmacro MULTIUSER_INSTALLMODE_CURRENTUSER "" "" +FunctionEnd + +!ifndef MULTIUSER_NOUNINSTALL + +Function un.MultiUser.InstallMode.AllUsers + !insertmacro MULTIUSER_INSTALLMODE_ALLUSERS UN .un +FunctionEnd + +Function un.MultiUser.InstallMode.CurrentUser + !insertmacro MULTIUSER_INSTALLMODE_CURRENTUSER UN .un +FunctionEnd + +!endif + +/* + +Installer/uninstaller initialization + +*/ + +!macro MULTIUSER_INIT_QUIT UNINSTALLER_FUNCPREFIX + + !ifdef MULTIUSER_INIT_${UNINSTALLER_FUNCPREFIX}FUNCTIONQUIT + Call "${MULTIUSER_INIT_${UNINSTALLER_FUNCPREFIX}FUCTIONQUIT} + !else + Quit + !endif + +!macroend + +!macro MULTIUSER_INIT_TEXTS + + !ifndef MULTIUSER_INIT_TEXT_ADMINREQUIRED + !define MULTIUSER_INIT_TEXT_ADMINREQUIRED "$(^Caption) requires Administrator priviledges." + !endif + + !ifndef MULTIUSER_INIT_TEXT_POWERREQUIRED + !define MULTIUSER_INIT_TEXT_POWERREQUIRED "$(^Caption) requires at least Power User priviledges." + !endif + + !ifndef MULTIUSER_INIT_TEXT_ALLUSERSNOTPOSSIBLE + !define MULTIUSER_INIT_TEXT_ALLUSERSNOTPOSSIBLE "Your user account does not have sufficient privileges to install $(^Name) for all users of this compuetr." + !endif + +!macroend + +!macro MULTIUSER_INIT_CHECKS UNINSTALLER_PREFIX UNINSTALLER_FUNCPREFIX + + ;Installer initialization - check privileges and set install mode + + !insertmacro MULTIUSER_INIT_TEXTS + + UserInfo::GetAccountType + Pop $MultiUser.Privileges + + ${if} ${IsNT} + + ;Check privileges + + !if "${MULTIUSER_EXECUTIONLEVEL}" == Admin + + ${if} $MultiUser.Privileges != "Admin" + MessageBox MB_OK|MB_ICONSTOP "${MULTIUSER_INIT_TEXT_ADMINREQUIRED}" + !insertmacro MULTIUSER_INIT_QUIT "${UNINSTALLER_FUNCPREFIX}" + ${endif} + + !else if "${MULTIUSER_EXECUTIONLEVEL}" == Power + + ${if} $MultiUser.Privileges != "Power" + ${andif} $MultiUser.Privileges != "Admin" + ${if} ${AtMostWinXP} + MessageBox MB_OK|MB_ICONSTOP "${MULTIUSER_INIT_TEXT_POWERREQUIRED}" + ${else} + MessageBox MB_OK|MB_ICONSTOP "${MULTIUSER_INIT_TEXT_ADMINREQUIRED}" + ${endif} + !insertmacro MULTIUSER_INIT_QUIT "${UNINSTALLER_FUNCPREFIX}" + ${endif} + + !endif + + !ifdef MULTIUSER_EXECUTIONLEVEL_ALLUSERS + + ;Default to per-machine installation if possible + + ${if} $MultiUser.Privileges == "Admin" + ${orif} $MultiUser.Privileges == "Power" + !ifndef MULTIUSER_INSTALLMODE_DEFAULT_CURRENTUSER + Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.AllUsers + !else + Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.CurrentUser + !endif + + !ifdef MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_KEY & MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_VALUENAME + + ;Set installation mode to setting from a previous installation + + !ifndef MULTIUSER_INSTALLMODE_DEFAULT_CURRENTUSER + ReadRegStr $MultiUser.DefaultKeyValue HKLM "${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_KEY}" "${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_VALUENAME}" + ${if} $MultiUser.DefaultKeyValue == "" + ReadRegStr $MultiUser.DefaultKeyValue HKCU "${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_KEY}" "${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_VALUENAME}" + ${if} $MultiUser.DefaultKeyValue != "" + Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.CurrentUser + ${endif} + ${endif} + !else + ReadRegStr $MultiUser.DefaultKeyValue HKCU "${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_KEY}" "${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_VALUENAME}" + ${if} $MultiUser.DefaultKeyValue == "" + ReadRegStr $MultiUser.DefaultKeyValue HKLM "${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_KEY}" "${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_VALUENAME}" + ${if} $MultiUser.DefaultKeyValue != "" + Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.AllUsers + ${endif} + ${endif} + !endif + + !endif + + ${else} + Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.CurrentUser + ${endif} + + !else + + Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.CurrentUser + + !endif + + !ifdef MULTIUSER_INSTALLMODE_COMMANDLINE + + ;Check for install mode setting on command line + + ${${UNINSTALLER_FUNCPREFIX}GetParameters} $MultiUser.Parameters + + ${${UNINSTALLER_PREFIX}StrStr} $MultiUser.Result $MultiUser.Parameters "/CurrentUser" + + ${if} $MultiUser.Result != "" + Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.CurrentUser + ${endif} + + ${${UNINSTALLER_PREFIX}StrStr} $MultiUser.Result $MultiUser.Parameters "/AllUsers" + + ${if} $MultiUser.Result != "" + ${if} $MultiUser.Privileges == "Admin" + ${orif} $MultiUser.Privileges == "Power" + Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.AllUsers + ${else} + MessageBox MB_OK|MB_ICONSTOP "${MULTIUSER_INIT_TEXT_ALLUSERSNOTPOSSIBLE}" + ${endif} + ${endif} + + !endif + + ${else} + + ;Not running Windows NT, per-user installation not supported + + Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.AllUsers + + ${endif} + +!macroend + +!macro MULTIUSER_INIT + !verbose push + !verbose 3 + + !insertmacro MULTIUSER_INIT_CHECKS "" "" + + !verbose pop +!macroend + +!ifndef MULTIUSER_NOUNINSTALL + +!macro MULTIUSER_UNINIT + !verbose push + !verbose 3 + + !insertmacro MULTIUSER_INIT_CHECKS Un un. + + !verbose pop +!macroend + +!endif + +/* + +Modern UI 2 page + +*/ + +!ifdef MULTIUSER_MUI + +!macro MULTIUSER_INSTALLMODEPAGE_INTERFACE + + !ifndef MULTIUSER_INSTALLMODEPAGE_INTERFACE + !define MULTIUSER_INSTALLMODEPAGE_INTERFACE + Var MultiUser.InstallModePage + + Var MultiUser.InstallModePage.Text + + Var MultiUser.InstallModePage.AllUsers + Var MultiUser.InstallModePage.CurrentUser + + Var MultiUser.InstallModePage.ReturnValue + !endif + +!macroend + +!macro MULTIUSER_PAGEDECLARATION_INSTALLMODE + + !insertmacro MUI_SET MULTIUSER_${MUI_PAGE_UNINSTALLER_PREFIX}INSTALLMODEPAGE "" + !insertmacro MULTIUSER_INSTALLMODEPAGE_INTERFACE + + !insertmacro MUI_DEFAULT MULTIUSER_INSTALLMODEPAGE_TEXT_TOP "$(MULTIUSER_INNERTEXT_INSTALLMODE_TOP)" + !insertmacro MUI_DEFAULT MULTIUSER_INSTALLMODEPAGE_TEXT_ALLUSERS "$(MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS)" + !insertmacro MUI_DEFAULT MULTIUSER_INSTALLMODEPAGE_TEXT_CURRENTUSER "$(MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER)" + + PageEx custom + + PageCallbacks MultiUser.InstallModePre_${MUI_UNIQUEID} MultiUser.InstallModeLeave_${MUI_UNIQUEID} + + Caption " " + + PageExEnd + + !insertmacro MULTIUSER_FUNCTION_INSTALLMODEPAGE MultiUser.InstallModePre_${MUI_UNIQUEID} MultiUser.InstallModeLeave_${MUI_UNIQUEID} + + !undef MULTIUSER_INSTALLMODEPAGE_TEXT_TOP + !undef MULTIUSER_INSTALLMODEPAGE_TEXT_ALLUSERS + !undef MULTIUSER_INSTALLMODEPAGE_TEXT_CURRENTUSER + +!macroend + +!macro MULTIUSER_PAGE_INSTALLMODE + + ;Modern UI page for install mode + + !verbose push + !verbose 3 + + !ifndef MULTIUSER_EXECUTIONLEVEL_ALLUSERS + !error "A mixed-mode installation requires MULTIUSER_EXECUTIONLEVEL to be set to Admin, Power or Highest." + !endif + + !insertmacro MUI_PAGE_INIT + !insertmacro MULTIUSER_PAGEDECLARATION_INSTALLMODE + + !verbose pop + +!macroend + +!macro MULTIUSER_FUNCTION_INSTALLMODEPAGE PRE LEAVE + + !ifndef MULTIUSER_TEXT_NOTADMIN + !define MULTIUSER_TEXT_NOTADMIN "The installer is currently running as an unprivileged user. It will not be possible to install this software for all users on the system. Cancel and re-run the installer as Administrator to install system-wide." + !endif + + ;Page functions of Modern UI page + + Function "${PRE}" + + ${ifnot} ${IsNT} + Abort + ${endif} + + ${if} $MultiUser.Privileges != "Power" + ${andif} $MultiUser.Privileges != "Admin" + MessageBox MB_OKCANCEL "${MULTIUSER_TEXT_NOTADMIN}" /SD IDOK IDABORT nofun + Abort + + nofun: + Quit + ${endif} + + !insertmacro MUI_PAGE_FUNCTION_CUSTOM PRE + !insertmacro MUI_HEADER_TEXT_PAGE $(MULTIUSER_TEXT_INSTALLMODE_TITLE) $(MULTIUSER_TEXT_INSTALLMODE_SUBTITLE) + + nsDialogs::Create 1018 + Pop $MultiUser.InstallModePage + + ${NSD_CreateLabel} 0u 0u 300u 20u "${MULTIUSER_INSTALLMODEPAGE_TEXT_TOP}" + Pop $MultiUser.InstallModePage.Text + + ${NSD_CreateRadioButton} 20u 50u 280u 10u "${MULTIUSER_INSTALLMODEPAGE_TEXT_ALLUSERS}" + Pop $MultiUser.InstallModePage.AllUsers + + ${NSD_CreateRadioButton} 20u 70u 280u 10u "${MULTIUSER_INSTALLMODEPAGE_TEXT_CURRENTUSER}" + Pop $MultiUser.InstallModePage.CurrentUser + + ${if} $MultiUser.InstallMode == "AllUsers" + SendMessage $MultiUser.InstallModePage.AllUsers ${BM_SETCHECK} ${BST_CHECKED} 0 + ${else} + SendMessage $MultiUser.InstallModePage.CurrentUser ${BM_SETCHECK} ${BST_CHECKED} 0 + ${endif} + + !insertmacro MUI_PAGE_FUNCTION_CUSTOM SHOW + nsDialogs::Show + + FunctionEnd + + Function "${LEAVE}" + SendMessage $MultiUser.InstallModePage.AllUsers ${BM_GETCHECK} 0 0 $MultiUser.InstallModePage.ReturnValue + + ${if} $MultiUser.InstallModePage.ReturnValue = ${BST_CHECKED} + Call MultiUser.InstallMode.AllUsers + ${else} + Call MultiUser.InstallMode.CurrentUser + ${endif} + + !insertmacro MUI_PAGE_FUNCTION_CUSTOM LEAVE + FunctionEnd + +!macroend + +!endif + +!verbose pop +!endif |