123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299 |
- /*** UAC Plug-in ***
- Interactive User (MediumIL) Admin user (HighIL)
- ***[Setup.exe]************* ***[Setup.exe]**************
- * * * *
- * +++[.OnInit]+++++++++++ * * +++[.OnInit]++++++++++++ *
- * + UAC_RunElevated >---+-+----> * + + *
- * + NSIS.Quit + * * + + *
- * +++++++++++++++++++++++ * * ++++++++++++++++++++++++ *
- * * * *
- * * * *
- * +++[Section]+++++++++++ * * +++[Section]++++++++++++ *
- * + + * /--+-+-<UAC_AsUser_ExecShell+ *
- * +++++++++++++++++++++++ * | * ++++++++++++++++++++++++ *
- * * | * *
- * Win32.ShellExecute <---+--/ * *
- * * * *
- *************************** ****************************
- */
- !ifndef UAC_HDR__INC
- !verbose push
- !verbose 3
- !ifndef UAC_VERBOSE
- !define UAC_VERBOSE 3
- !endif
- !verbose ${UAC_VERBOSE}
- !define UAC_HDR__INC 0x00020400 ;MMmmbbrr
- !include LogicLib.nsh
- /* UAC_RunElevated
- **
- ** Starts the elevation operation.
- **
- ** Return values:
- **
- ** $0: Win32 error code (0 on success, 1223 if user aborted elevation dialog, anything else should be treated as a fatal error)
- ** $1: If $0==0:
- ** 0 UAC is not supported by the OS
- ** 1 Started a elevated child process, the current process should act like a wrapper (Call Quit without any further processing)
- ** 2 The process is already running @ HighIL (Member of admin group)
- ** 3 You should call RunElevated again (This can happen if a user without admin priv. is used in the runas dialog)
- ** $2: If $0==0 && $1==1: ExitCode of the elevated fork process (The NSIS errlvl is also set)
- ** $3: If $0==0: 1 if the user is a member of the admin group or 0 otherwise
- **/
- !macro UAC_RunElevated
- UAC::_ 0
- !macroend
- !macro UAC_PageElevation_RunElevated
- UAC::_ 0
- !macroend
- /*!macro UAC_OnInitElevation_RunElevated
- UAC::_ 0
- !macroend
- !macro UAC_OnInitElevation_OnGuiInit
- !macroend*/
- /* UAC_GetIntegrityLevel <NSISVar:Output | "s">
- **
- ** Get integrity level of current process
- **
- **/
- !macro UAC_GetIntegrityLevel outvar
- UAC::_ 6
- !if "${outvar}" != "s"
- Pop ${outvar}
- !endif
- !macroend
- /* UAC_IsAdmin
- **
- ** Is the current process running with administrator privileges? Result in $0
- **
- ** ${If} ${UAC_IsAdmin} ...
- **
- **/
- !macro UAC_IsAdmin
- UAC::_ 2
- !macroend
- !define UAC_IsAdmin `"" UAC_IsAdmin ""`
- !macro _UAC_IsAdmin _a _b _t _f
- !insertmacro _UAC_MakeLL_Cmp _!= 0 2s
- !macroend
- /* UAC_IsInnerInstance
- **
- ** Does the current process have a NSIS/UAC parent process that is part of the elevation operation?
- **
- ** ${If} ${UAC_IsInnerInstance} ...
- **
- **/
- !macro UAC_IsInnerInstance
- UAC::_ 3
- !macroend
- !define UAC_IsInnerInstance `"" UAC_IsInnerInstance ""`
- !macro _UAC_IsInnerInstance _a _b _t _f
- !insertmacro _UAC_MakeLL_Cmp _!= 0 3s
- !macroend
- /* UAC_PageElevation_OnInit, UAC_PageElevation_OnGuiInit,
- **
- ** Helper macros for elevation on a custom elevation page, see the DualMode example for more information.
- **
- **/
- !macro UAC_Notify_OnGuiInit
- UAC::_ 4
- !macroend
- !macro UAC_PageElevation_OnGuiInit
- !insertmacro UAC_Notify_OnGuiInit
- !macroend
- !macro UAC_PageElevation_OnInit
- UAC::_ 5
- ${IfThen} ${Errors} ${|} Quit ${|}
- !macroend
- /* UAC_AsUser_Call <Function|Label> <NSISAddressName> <UAC_* flags>
- **
- ** Calls a function or label in the user process instance.
- ** All the UAC_AsUser_* macros use this helper macro.
- **
- **/
- !define UAC_SYNCREGISTERS 0x1
- ;define UAC_SYNCSTACK 0x2
- !define UAC_SYNCOUTDIR 0x4
- !define UAC_SYNCINSTDIR 0x8
- ;define UAC_CLEARERRFLAG 0x10
- !macro UAC_AsUser_Call type name flags
- push $0
- Get${type}Address $0 ${name}
- !verbose push
- !verbose ${UAC_VERBOSE}
- !insertmacro _UAC_ParseDefineFlagsToInt _UAC_AsUser_Call__flags ${flags}
- !verbose pop
- StrCpy $0 "1$0:${_UAC_AsUser_Call__flags}"
- !undef _UAC_AsUser_Call__flags
- Exch $0
- UAC::_
- !macroend
- /*
- ** UAC_AsUser_GetSection <Flags|InstTypes|Size|Text> <SectionIndex> <NSISVar:Output>
- */
- !macro UAC_AsUser_GetSection secprop secidx outvar
- !insertmacro _UAC_AsUser_GenOp ${outvar} SectionGet${secprop} ${secidx} ""
- !macroend
- /*
- ** UAC_AsUser_GetGlobalVar <NSISVar:SourceAndOutput>
- ** UAC_AsUser_GetGlobal <NSISVar:Output> <NSISVar:Source>
- */
- !macro UAC_AsUser_GetGlobalVar var
- !insertmacro _UAC_AsUser_GenOp ${var} StrCpy "" ${var}
- !macroend
- !macro UAC_AsUser_GetGlobal outvar srcvar
- !insertmacro _UAC_AsUser_GenOp ${outvar} StrCpy "" ${srcvar}
- !macroend
- /*
- ** UAC_AsUser_ExecShell <Verb> <ApplicationOrFile> <Parameters> <Working Directory> <SW_*>
- **
- ** Call ExecShell in the user process instance.
- **
- */
- !macro UAC_AsUser_ExecShell verb command params workdir show
- !insertmacro _UAC_IncL
- goto _UAC_L_E_${__UAC_L}
- _UAC_L_F_${__UAC_L}:
- ExecShell "${verb}" "${command}" '${params}' ${show}
- return
- _UAC_L_E_${__UAC_L}:
- !if "${workdir}" != ""
- push $outdir
- SetOutPath "${workdir}"
- !endif
- !insertmacro UAC_AsUser_Call Label _UAC_L_F_${__UAC_L} ${UAC_SYNCREGISTERS}|${UAC_SYNCOUTDIR}|${UAC_SYNCINSTDIR} #|${UAC_CLEARERRFLAG}
- !if "${workdir}" != ""
- pop $outdir
- SetOutPath $outdir
- !endif
- !macroend
- !macro _UAC_MakeLL_Cmp cmpop cmp pluginparams
- !insertmacro _LOGICLIB_TEMP
- UAC::_ ${pluginparams}
- pop $_LOGICLIB_TEMP
- !insertmacro ${cmpop} $_LOGICLIB_TEMP ${cmp} `${_t}` `${_f}`
- !macroend
- !macro _UAC_definemath def val1 op val2
- !define /math _UAC_definemath "${val1}" ${op} ${val2}
- !ifdef ${def}
- !undef ${def}
- !endif
- !define ${def} "${_UAC_definemath}"
- !undef _UAC_definemath
- !macroend
- !macro _UAC_ParseDefineFlags_orin parse outflags
- !searchparse /noerrors ${${parse}} "" _UAC_ParseDefineFlags_orin_f1 "|" _UAC_ParseDefineFlags_orin_f2
- !define _UAC_ParseDefineFlags_orin_this ${_UAC_ParseDefineFlags_orin_f1}
- !undef ${parse}
- !define ${parse} ${_UAC_ParseDefineFlags_orin_f2}
- !define _UAC_ParseDefineFlags_orin_saveout ${${outflags}}
- !undef ${outflags}
- !define /math ${outflags} "${_UAC_ParseDefineFlags_orin_saveout}" | "${_UAC_ParseDefineFlags_orin_this}"
- !undef _UAC_ParseDefineFlags_orin_saveout
- !undef _UAC_ParseDefineFlags_orin_this
- !ifdef _UAC_ParseDefineFlags_orin_f1
- !undef _UAC_ParseDefineFlags_orin_f1
- !endif
- !ifdef _UAC_ParseDefineFlags_orin_f2
- !undef _UAC_ParseDefineFlags_orin_f2
- !endif
- !macroend
- !macro _UAC_ParseDefineFlags_Begin _outdef _in
- !define _UAC_PDF${_outdef}_parse "${_in}"
- !define _UAC_PDF${_outdef}_flags ""
- !define _UAC_PDF${_outdef}_r 0
- !insertmacro _UAC_ParseDefineFlags_orin _UAC_PDF${_outdef}_parse _UAC_PDF${_outdef}_flags ;0x1
- !insertmacro _UAC_ParseDefineFlags_orin _UAC_PDF${_outdef}_parse _UAC_PDF${_outdef}_flags ;0x2
- !insertmacro _UAC_ParseDefineFlags_orin _UAC_PDF${_outdef}_parse _UAC_PDF${_outdef}_flags ;0x4
- !insertmacro _UAC_ParseDefineFlags_orin _UAC_PDF${_outdef}_parse _UAC_PDF${_outdef}_flags ;0x8
- !insertmacro _UAC_ParseDefineFlags_orin _UAC_PDF${_outdef}_parse _UAC_PDF${_outdef}_flags ;0x10
- !macroend
- !macro _UAC_ParseDefineFlags_End _outdef
- !define ${_outdef} ${_UAC_PDF${_outdef}_r}
- !undef _UAC_PDF${_outdef}_r
- !undef _UAC_PDF${_outdef}_flags
- !undef _UAC_PDF${_outdef}_parse
- !macroend
- !macro _UAC_ParseDefineFlags_IncludeFlag _outdef flag
- !if ${_UAC_PDF${_outdef}_flags} & ${flag}
- !insertmacro _UAC_definemath _UAC_PDF${_outdef}_r ${_UAC_PDF${_outdef}_r} | ${flag}
- !endif
- !macroend
- !macro _UAC_ParseDefineFlagsToInt _outdef _in
- !insertmacro _UAC_ParseDefineFlags_Begin _UAC_ParseDefineFlagsToInt_tmp "${_in}"
- !define ${_outdef} ${_UAC_PDF_UAC_ParseDefineFlagsToInt_tmp_flags}
- !insertmacro _UAC_ParseDefineFlags_End _UAC_ParseDefineFlagsToInt_tmp
- !undef _UAC_ParseDefineFlagsToInt_tmp
- !macroend
- !macro _UAC_IncL
- !insertmacro _UAC_definemath __UAC_L "${__UAC_L}" + 1
- !macroend
- !macro _UAC_AsUser_GenOp outvar op opparam1 opparam2
- !define _UAC_AUGOGR_ID _UAC_AUGOGR_OP${outvar}${op}${opparam1}${opparam2}
- !ifndef ${_UAC_AUGOGR_ID} ;Has this exact action been done before?
- !if ${outvar} == $0
- !define ${_UAC_AUGOGR_ID} $1
- !else
- !define ${_UAC_AUGOGR_ID} $0
- !endif
- !if "${opparam1}" == ""
- !define _UAC_AUGOGR_OPP1 ${${_UAC_AUGOGR_ID}}
- !define _UAC_AUGOGR_OPP2 ${opparam2}
- !else
- !define _UAC_AUGOGR_OPP1 ${opparam1}
- !define _UAC_AUGOGR_OPP2 ${${_UAC_AUGOGR_ID}}
- !endif
- goto ${_UAC_AUGOGR_ID}_C
- ${_UAC_AUGOGR_ID}_F:
- ${op} ${_UAC_AUGOGR_OPP1} ${_UAC_AUGOGR_OPP2}
- return
- ${_UAC_AUGOGR_ID}_C:
- !undef _UAC_AUGOGR_OPP1
- !undef _UAC_AUGOGR_OPP2
- !endif
- push ${${_UAC_AUGOGR_ID}}
- !insertmacro UAC_AsUser_Call Label ${_UAC_AUGOGR_ID}_F ${UAC_SYNCREGISTERS}
- StrCpy ${outvar} ${${_UAC_AUGOGR_ID}}
- pop ${${_UAC_AUGOGR_ID}}
- !undef _UAC_AUGOGR_ID
- !macroend
- !verbose pop
- !endif /* UAC_HDR__INC */
|