2017-03-13 22:46:15 +00:00
; PCSX2 Pre-Installer Script
2019-01-26 03:45:37 +00:00
; Copyright (C) 2019 PCSX2 Team
2017-03-13 22:46:15 +00:00
!include "SharedDefs.nsh"
RequestExecutionLevel user
!define OUTFILE_POSTFIX "setup"
OutFile "pcsx2-${APP_VERSION}-${OUTFILE_POSTFIX}.exe"
Var UserPrivileges
Var IsAdmin
Var DirectXSetupError
2019-01-26 03:45:37 +00:00
; Dialogs and Controls
2017-03-16 23:01:45 +00:00
Var hwnd
Var PreInstall_Dialog
Var PreInstall_DlgBack
Var PreInstall_DlgNext
2017-03-13 22:46:15 +00:00
Var InstallMode_Dialog
2017-03-16 23:01:45 +00:00
Var InstallMode_DlgBack
2017-03-13 22:46:15 +00:00
Var InstallMode_DlgNext
Var InstallMode_Label
2019-01-26 03:45:37 +00:00
# Normal installer mode (writes to Program Files)
Var InstallMode_Normal
# Portable installer mode
2017-03-13 22:46:15 +00:00
Var InstallMode_Portable
2019-01-26 03:45:37 +00:00
2017-03-13 22:46:15 +00:00
!include "nsDialogs.nsh"
Page Custom IsUserAdmin
2017-03-16 23:01:45 +00:00
Page Custom PreInstallDialog
2017-03-13 22:46:15 +00:00
Page Custom InstallMode InstallModeLeave
Function IsUserAdmin
!include WinVer.nsh
2019-01-26 03:45:37 +00:00
# No user should ever have to experience this pain ;)
2017-03-13 22:46:15 +00:00
${IfNot} ${AtLeastWinVista}
MessageBox MB_OK "Your operating system is unsupported by PCSX2. Please upgrade your operating system or install PCSX2 1.4.0."
Quit
${EndIf}
ClearErrors
UserInfo::GetName
2017-03-16 23:01:45 +00:00
Pop $R8
2017-03-13 22:46:15 +00:00
UserInfo::GetOriginalAccountType
Pop $UserPrivileges
# GetOriginalAccountType will check the tokens of the original user of the
# current thread/process. If the user tokens were elevated or limited for
# this process, GetOriginalAccountType will return the non-restricted
# account type.
# On Vista with UAC, for example, this is not the same value when running
# with `RequestExecutionLevel user`. GetOriginalAccountType will return
# "admin" while GetAccountType will return "user".
;UserInfo::GetOriginalAccountType
;Pop $R2
${If} $UserPrivileges == "Admin"
StrCpy $IsAdmin 1
${ElseIf} $UserPrivileges == "User"
StrCpy $IsAdmin 0
${EndIf}
FunctionEnd
2017-03-16 23:01:45 +00:00
Function PreInstallDialog
nsDialogs::Create /NOUNLOAD 1018
Pop $PreInstall_Dialog
GetDlgItem $PreInstall_DlgBack $HWNDPARENT 3
EnableWindow $PreInstall_DlgBack ${SW_HIDE}
GetDlgItem $PreInstall_DlgNext $HWNDPARENT 1
EnableWindow $PreInstall_DlgNext 0
${NSD_CreateTimer} NSD_Timer.Callback 1
nsDialogs::Show
FunctionEnd
Function NSD_Timer.Callback
${NSD_KillTimer} NSD_Timer.Callback
SendMessage $hwnd ${PBM_SETRANGE32} 0 100
2017-03-13 22:46:15 +00:00
!include WinVer.nsh
!include "X64.nsh"
2019-01-26 03:45:37 +00:00
# If the user is running at least Windows 8.1
# or has no admin rights, don't waste time trying
# to install the DX and VS2015 runtimes.
# (head straight to the first installer section)
2017-03-13 22:46:15 +00:00
${If} ${AtLeastWin8.1}
${OrIf} $IsAdmin == 0
2017-03-16 23:01:45 +00:00
Call PreInstall_UsrWait
SendMessage $HWNDPARENT ${WM_COMMAND} 1 0
2017-03-13 22:46:15 +00:00
${EndIf}
2019-01-26 03:45:37 +00:00
# Check if the VC 2015 runtimes are installed
2017-03-13 22:46:15 +00:00
${If} ${RunningX64}
ReadRegDword $R0 HKLM "SOFTWARE\Wow6432Node\Microsoft\VisualStudio\14.0\VC\Runtimes\x86" "Installed"
${Else}
ReadRegDword $R0 HKLM "SOFTWARE\Microsoft\VisualStudio\14.0\VC\Runtimes\x86" "Installed"
${EndIf}
Pop $R0
2019-01-26 03:45:37 +00:00
# If the runtimes are already here, check for DX.
2017-03-13 22:46:15 +00:00
${If} $R0 == "1"
Goto ExecDxSetup
${EndIf}
2019-01-26 03:45:37 +00:00
# Download and install the VC 2015 redistributable from the internet
2017-03-16 23:01:45 +00:00
${NSD_CreateLabel} 0 45 100% 10u "Downloading Visual C++ 2015 package"
Pop $hwnd
inetc::get "https://download.microsoft.com/download/9/3/F/93FCF1E7-E6A4-478B-96E7-D4B285925B00/vc_redist.x86.exe" "$TEMP\vcredist_2015_Update_1_x86.exe" /SILENT /CONNECTTIMEOUT 30 /RECEIVETIMEOUT 30 /END
${NSD_CreateLabel} 0 45 100% 10u "Installing Visual C++ 2015 package"
Pop $hwnd
ExecWait '"$TEMP\vcredist_2015_Update_1_x86.exe /S"'
SendMessage $hwnd ${PBM_SETPOS} 40 0
2017-03-13 22:46:15 +00:00
Delete "$TEMP\vcredist_2015_Update_1_x86.exe"
2019-01-26 03:45:37 +00:00
# Download and install DirectX
ExecDxSetup:
2017-03-16 23:01:45 +00:00
${NSD_CreateLabel} 0 45 100% 10u "Installing DXWebSetup package"
Pop $hwnd
SendMessage $hwnd ${PBM_SETPOS} 80 0
SetOutPath "$TEMP"
File "dxwebsetup.exe"
ExecWait '"$TEMP\dxwebsetup.exe" /Q' $DirectXSetupError
SendMessage $hwnd ${PBM_SETPOS} 100 0
Delete "$TEMP\dxwebsetup.exe"
Sleep 20
Call PreInstall_UsrWait
SendMessage $HWNDPARENT ${WM_COMMAND} 1 0
FunctionEnd
Function PreInstall_UsrWait
GetDlgItem $PreInstall_DlgNext $HWNDPARENT 1
EnableWindow $PreInstall_DlgNext 1
2017-03-13 22:46:15 +00:00
FunctionEnd
2019-01-26 03:45:37 +00:00
# Creates the first dialog "section" to display a choice of installer modes.
2017-03-13 22:46:15 +00:00
Function InstallMode
nsDialogs::Create /NOUNLOAD 1018
Pop $InstallMode_Dialog
2019-01-26 03:45:37 +00:00
GetDlgItem $InstallMode_DlgBack $HWNDPARENT 3
EnableWindow $InstallMode_DlgBack 0
2017-03-16 23:01:45 +00:00
2019-01-26 03:45:37 +00:00
GetDlgItem $InstallMode_DlgNext $HWNDPARENT 1
EnableWindow $InstallMode_DlgNext 0
2017-03-13 22:46:15 +00:00
${NSD_CreateLabel} 0 0 100% 10u "Select an installation mode for PCSX2."
Pop $InstallMode_Label
2019-01-26 03:45:37 +00:00
${NSD_CreateRadioButton} 0 35 100% 10u "Normal Installation"
Pop $InstallMode_Normal
2017-03-13 22:46:15 +00:00
2019-01-26 03:45:37 +00:00
# If the user doesn't have admin rights, disable the button for the normal (non-portable) installer
2017-03-13 22:46:15 +00:00
${If} $IsAdmin == 0
2019-01-26 03:45:37 +00:00
EnableWindow $InstallMode_Normal 0
2017-03-13 22:46:15 +00:00
${EndIf}
2019-01-26 03:45:37 +00:00
# Create labels/buttons for the normal installation
${NSD_OnClick} $InstallMode_Normal InstallMode_UsrWait
2017-03-16 23:01:45 +00:00
${NSD_CreateLabel} 10 55 100% 20u "PCSX2 will be installed in Program Files unless another directory is specified. User files are stored in the Documents/PCSX2 directory."
2019-01-26 03:45:37 +00:00
# Create labels/buttons for the portable installation
2017-03-16 23:01:45 +00:00
${NSD_CreateRadioButton} 0 95 100% 10u "Portable Installation"
2017-03-13 22:46:15 +00:00
Pop $InstallMode_Portable
2019-01-26 03:45:37 +00:00
${NSD_OnClick} $InstallMode_Portable InstallMode_UsrWait
${NSD_CreateLabel} 10 115 100% 20u "Install PCSX2 to any directory you want. Choose this option if you prefer to have all of your files in the same folder or frequently update PCSX2 through Orphis' Buildbot."
2017-03-13 22:46:15 +00:00
nsDialogs::Show
FunctionEnd
2019-01-26 03:45:37 +00:00
# Disables the "next" button until a selection has been made
2017-03-13 22:46:15 +00:00
Function InstallMode_UsrWait
GetDlgItem $InstallMode_DlgNext $HWNDPARENT 1
EnableWindow $InstallMode_DlgNext 1
2019-01-26 03:45:37 +00:00
# Displays a UAC shield on the button
${NSD_GetState} $InstallMode_Normal $0
${NSD_GetState} $InstallMode_Portable $1
${If} ${BST_CHECKED} == $0
SendMessage $InstallMode_DlgNext ${BCM_SETSHIELD} 0 1
${Else}
SendMessage $InstallMode_DlgNext ${BCM_SETSHIELD} 0 0
${EndIf}
2017-03-13 22:46:15 +00:00
FunctionEnd
2019-01-26 03:45:37 +00:00
# Runs the elevated installer and quits the current one
# If they chose portable mode, the current (unelevated installer)
# will still be used.
2017-03-13 22:46:15 +00:00
Function InstallModeLeave
2019-01-26 03:45:37 +00:00
${NSD_GetState} $InstallMode_Normal $0
2017-03-13 22:46:15 +00:00
${NSD_GetState} $InstallMode_Portable $1
${If} ${BST_CHECKED} == $0
2017-03-16 23:01:45 +00:00
SetOutPath "$TEMP"
File "pcsx2-${APP_VERSION}-include_standard.exe"
ExecShell open "$TEMP\pcsx2-${APP_VERSION}-include_standard.exe"
Quit
2017-03-13 22:46:15 +00:00
${EndIf}
FunctionEnd
; ----------------------------------
; Portable Install Section
; ----------------------------------
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!define MUI_FINISHPAGE_RUN "$INSTDIR\pcsx2.exe"
!define MUI_PAGE_CUSTOMFUNCTION_SHOW ModifyRunCheckbox
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_LANGUAGE "English"
!include "ApplyExeProps.nsh"
; The default installation directory for the portable binary.
2017-03-16 23:01:45 +00:00
InstallDir "$DOCUMENTS\$R8\PCSX2 ${APP_VERSION}"
2017-03-13 22:46:15 +00:00
2019-01-26 03:45:37 +00:00
; Files to be installed are housed here
2017-03-13 22:46:15 +00:00
!include "SharedCore.nsh"
Section "" INST_PORTABLE
SetOutPath "$INSTDIR"
File portable.ini
SectionEnd
Section "" SID_PCSX2
SectionEnd
2019-01-26 03:45:37 +00:00
# Gives the user a fancy checkbox to run PCSX2 right from the installer!
2017-03-13 22:46:15 +00:00
Function ModifyRunCheckbox
${IfNot} ${SectionIsSelected} ${SID_PCSX2}
SendMessage $MUI.FINISHPAGE.RUN ${BM_SETCHECK} ${BST_UNCHECKED} 0
EnableWindow $MUI.FINISHPAGE.RUN 0
${EndIf}
FunctionEnd