!include "MUI2.nsh" !define NAME_FULL "VCV Rack Free ${VERSION}" !define NAME "VCV Rack ${VERSION_MAJOR} Free" !define RACK_DIR "Rack${VERSION_MAJOR}Free" !define INSTALL_REG "Software\VCV\Rack${VERSION_MAJOR}Free" !define UNINSTALL_REG "Software\Microsoft\Windows\CurrentVersion\Uninstall\VCVRack${VERSION_MAJOR}Free" Name "${NAME_FULL}" Unicode True SetCompressor /solid "lzma" SetCompressorDictSize 8 CRCCheck On ; Default installation folder InstallDir "$PROGRAMFILES\VCV\${RACK_DIR}" ; Get installation folder from registry if available InstallDirRegKey HKLM "${INSTALL_REG}" "" ; Request admin permissions so we can install to Program Files and add a registry entry RequestExecutionLevel admin ; MUI installer pages !define MUI_ICON "icon.ico" ;!define MUI_HEADERIMAGE ;!define MUI_HEADERIMAGE_BITMAP "installer-banner.bmp" ; 150x57 ;!define MUI_WELCOMEFINISHPAGE_BITMAP "$NSISDIR\Contrib\Graphics\Wizard\win.bmp" ; 164x314 ;!define MUI_UNWELCOMEFINISHPAGE_BITMAP "$NSISDIR\Contrib\Graphics\Wizard\win.bmp" ; 164x314 !define MUI_COMPONENTSPAGE_NODESC ;!insertmacro MUI_PAGE_COMPONENTS ; Prevent user from choosing an installation directory that already exists, such as C:\Program Files. ; This is necessary because the uninstaller removes the installation directory, which is dangerous for directories that existed before Rack was installed. !define MUI_PAGE_CUSTOMFUNCTION_LEAVE directoryLeave Function directoryLeave StrCmp "$INSTDIR" "$PROGRAMFILES" directoryBad StrCmp "$INSTDIR" "$PROGRAMFILES32" directoryBad StrCmp "$INSTDIR" "$PROGRAMFILES64" directoryBad StrCmp "$INSTDIR" "$COMMONFILES" directoryBad StrCmp "$INSTDIR" "$COMMONFILES32" directoryBad StrCmp "$INSTDIR" "$COMMONFILES64" directoryBad StrCmp "$INSTDIR" "$DESKTOP" directoryBad StrCmp "$INSTDIR" "$WINDIR" directoryBad StrCmp "$INSTDIR" "$SYSDIR" directoryBad StrCmp "$INSTDIR" "$DOCUMENTS" directoryBad StrCmp "$INSTDIR" "$MUSIC" directoryBad StrCmp "$INSTDIR" "$PICTURES" directoryBad StrCmp "$INSTDIR" "$VIDEOS" directoryBad StrCmp "$INSTDIR" "$APPDATA" directoryBad StrCmp "$INSTDIR" "$LOCALAPPDATA" directoryBad Return directoryBad: MessageBox MB_OK|MB_ICONSTOP "Cannot install to $INSTDIR." Abort FunctionEnd !insertmacro MUI_PAGE_DIRECTORY !insertmacro MUI_PAGE_INSTFILES !define MUI_FINISHPAGE_RUN "$INSTDIR\Rack.exe" !define MUI_FINISHPAGE_RUN_TEXT "Launch ${NAME}" !insertmacro MUI_PAGE_FINISH ; MUI uninstaller pages !insertmacro MUI_UNPAGE_CONFIRM !insertmacro MUI_UNPAGE_INSTFILES !insertmacro MUI_LANGUAGE "English" ; Sections Section "${NAME}" INSTALL_SECTION SectionIn RO SetOutPath "$INSTDIR" # Uninstall existing version silently before installing. # This is needed because the VST3 adapter used to be a file, and now it is a bundle (folder), and NSIS can't overwrite files with folders. # "_?=" makes the uninstaller block until exit. Explanation at bottom of page: # https://nsis.sourceforge.io/Docs/Chapter3.html # Fails gracefully if uninstaller does not exist. DetailPrint "Uninstalling existing version" ExecWait '"$INSTDIR\Uninstall.exe" /S _?=$INSTDIR' File /r "dist\${RACK_DIR}\*" ; Store installation folder WriteRegStr HKLM "${INSTALL_REG}" "" "$INSTDIR" ; Write uninstaller info WriteRegStr HKLM "${UNINSTALL_REG}" "DisplayName" "${NAME}" WriteRegStr HKLM "${UNINSTALL_REG}" "DisplayIcon" '"$INSTDIR\Rack.exe"' WriteRegStr HKLM "${UNINSTALL_REG}" "DisplayVersion" "${VERSION}" WriteRegStr HKLM "${UNINSTALL_REG}" "UninstallString" '"$INSTDIR\Uninstall.exe"' WriteRegStr HKLM "${UNINSTALL_REG}" "QuietUninstallString" '"$INSTDIR\Uninstall.exe" /S' WriteRegStr HKLM "${UNINSTALL_REG}" "InstallLocation" '"$INSTDIR"' WriteRegStr HKLM "${UNINSTALL_REG}" "Publisher" "VCV" SectionGetSize ${INSTALL_SECTION} $0 WriteRegDWORD HKLM "${UNINSTALL_REG}" "EstimatedSize" $0 WriteRegDWORD HKLM "${UNINSTALL_REG}" "NoModify" 1 WriteRegDWORD HKLM "${UNINSTALL_REG}" "NoRepair" 1 ; Create uninstaller WriteUninstaller "$INSTDIR\Uninstall.exe" ; Associate file type WriteRegStr HKLM "Software\Classes\.vcv" "" "VCVRack.Patch" WriteRegStr HKLM "Software\Classes\VCVRack.Patch" "" "VCV Rack patch" WriteRegStr HKLM "Software\Classes\VCVRack.Patch\shell\open\command" "" '"$INSTDIR\Rack.exe" "%1"' ; Create shortcuts CreateShortcut "$DESKTOP\${NAME}.lnk" "$INSTDIR\Rack.exe" CreateShortcut "$SMPROGRAMS\${NAME}.lnk" "$INSTDIR\Rack.exe" ; Add allowed app to Controlled Folder Access ExpandEnvStrings $0 "%COMSPEC%" ExecShellWait "" '"$0"' "/C powershell -ExecutionPolicy Bypass -WindowStyle Hidden $\"Add-MpPreference -ControlledFolderAccessAllowedApplications '$INSTDIR\Rack.exe'$\"" SW_HIDE SectionEnd Section "Uninstall" ; directoryLeave above ensures that INSTDIR is safe to remove. RMDir /r "$INSTDIR" ; Attempt to remove C:\Program Files\VCV if empty RMDir "$INSTDIR\.." Delete "$DESKTOP\${NAME}.lnk" Delete "$SMPROGRAMS\${NAME}.lnk" DeleteRegKey HKLM "${INSTALL_REG}" DeleteRegKey /ifempty HKLM "Software\VCV" DeleteRegKey HKLM "${UNINSTALL_REG}" DeleteRegKey HKLM "Software\Classes\.vcv" DeleteRegKey HKLM "Software\Classes\VCVRack.Patch" SectionEnd