2025-08-09 07:50:37 -07:00
; https://nsis.sourceforge.io/ShellExecWait
!macro ShellExecWait verb app param workdir show exitoutvar ;only app and show must be != "", every thing else is optional
#define SEE_MASK_NOCLOSEPROCESS 0x40
System :: Store S
!if " ${NSIS_PTR_SIZE} " > 4
!define /ReDef /math SYSSIZEOF_SHELLEXECUTEINFO 14 * ${NSIS_PTR_SIZE}
!else ifndef SYSSIZEOF_SHELLEXECUTEINFO
!define SYSSIZEOF_SHELLEXECUTEINFO 60
!endif
System :: Call '*(&i${SYSSIZEOF_SHELLEXECUTEINFO})i.r0'
System :: Call '*$0(i ${SYSSIZEOF_SHELLEXECUTEINFO},i 0x40,p $hwndparent,t "${verb}",t $\' ${app} $ \ ',t $\' ${param} $ \ ',t "${workdir}",i ${show})p.r0'
System :: Call 'shell32::ShellExecuteEx(t)(pr0)i.r1 ?e' ; (t) to trigger A/W selection
${If} $1 <> 0
System :: Call '*$0(is,i,p,p,p,p,p,p,p,p,p,p,p,p,p.r1)' ;stack value not really used, just a fancy pop ;)
System :: Call 'kernel32::WaitForSingleObject(pr1,i-1)'
System :: Call 'kernel32::GetExitCodeProcess(pr1,*i.s)'
System :: Call 'kernel32::CloseHandle(pr1)'
${EndIf}
System :: Free $0
!if " ${exitoutvar} " == " "
pop $0
!endif
System :: Store L
!if " ${exitoutvar} " != " "
pop ${exitoutvar}
!endif
!macroend
2024-09-10 00:24:17 -07:00
2025-08-09 07:50:37 -07:00
; --------------------------------------------------------------------------------
2024-09-10 00:24:17 -07:00
2025-08-09 07:50:37 -07:00
Var /GLOBAL OldInstallDir
2024-09-10 00:24:17 -07:00
2025-08-09 07:50:37 -07:00
!macro NSIS_HOOK_PREINSTALL
SetShellVarContext all
${If} ${FileExists} " $SMPROGRAMS \${PRODUCTNAME}.lnk "
UserInfo :: GetAccountType
2024-09-10 00:24:17 -07:00
Pop $0
2025-08-09 07:50:37 -07:00
${If} $0 != " Admin "
MessageBox MB_ICONINFORMATION | MB_OK " An old installation of the Modrinth App was detected that requires administrator permission to update from. You will be prompted with an admin prompt shortly. "
2024-09-10 00:24:17 -07:00
${EndIf}
2025-08-09 07:50:37 -07:00
ReadRegStr $4 SHCTX " ${MANUPRODUCTKEY} " " "
ReadRegStr $R1 SHCTX " ${UNINSTKEY} " " UninstallString "
ReadRegStr $OldInstallDir SHCTX " ${UNINSTKEY} " " InstallLocation "
StrCpy $OldInstallDir $OldInstallDir " " 1
StrCpy $OldInstallDir $OldInstallDir - 1 " "
2024-09-10 00:24:17 -07:00
2025-08-09 07:50:37 -07:00
DetailPrint " Executing $R1 "
!insertmacro ShellExecWait " runas " '$R1' '/P _?=$4' " " ${SW_SHOW} $3
${If} $3 <> 0
SetErrorLevel $3
MessageBox MB_ICONEXCLAMATION | MB_OK " Failed to uninstall old global installation "
Abort
${EndIf}
${EndIf}
SetShellVarContext current
!macroend
2024-09-10 00:24:17 -07:00
2025-08-09 07:50:37 -07:00
!macro NSIS_HOOK_POSTINSTALL
!insertmacro IsShortcutTarget " $DESKTOP \${PRODUCTNAME}.lnk " " $OldInstallDir \${MAINBINARYNAME}.exe "
Pop $0
${If} $0 = 1
!insertmacro SetShortcutTarget " $DESKTOP \${PRODUCTNAME}.lnk " " $INSTDIR \${MAINBINARYNAME}.exe "
Return
${EndIf}
2024-09-10 00:24:17 -07:00
!macroend