blob: fd05914de1a76a0de97a445f003be2db730cfe2a [file] [log] [blame]
# NSIS Script for creating the Windows Vulkan RT installer.
#
# Copyright (c) 2015-2016 The Khronos Group Inc.
# Copyright (c) 2015-2016 Valve Corporation
# Copyright (c) 2015-2016 LunarG, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# Author: David Pinedo <david@LunarG.com>
# Author: Mark Young <mark@LunarG.com>
#
# Version information
# Set VERSION_BUILDNO to:
# x.devbuild.z for development builds
# x for releases
#
# Set the default name to "Vulkan", but allow this to be overriden
!ifndef APINAME
!define APINAME "Vulkan"
!define APILOWER "vulkan"
!endif
!define PRODUCTNAME "${APINAME}RT"
!ifndef HIDE_VERSION
!define VERSION_ABI_MAJOR "1"
!define VERSION_API_MAJOR "1"
!define VERSION_MINOR "0"
!define VERSION_PATCH "12"
!define VERSION_BUILDNO "0.devbuild.1"
!endif
!ifndef HIDE_PUBLISHER
!define PUBLISHER "YourCompany, Inc."
!endif
!ifndef COPYRIGHT
!define COPYRIGHT ""
!endif
#!define VERSION_BUILDNO "0"
!define PRODUCTVERSION "${VERSION_API_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}.${VERSION_BUILDNO}"
# Includes
!include LogicLib.nsh
# This number is determined by doing an install, and then from Windows Explorer,
# doing a "Properties" on the install directory. Add to this the size of the
# files installed to C:\Windows\System32. And then add a little bit more.
# The units are 1K bytes.
!define ESTIMATEDSIZE "1700"
# This is used for the error message if a problem occurs during install.
!define errorMessage1 "Installation of ${PRODUCTNAME} failed!$\r$\n"
!define errorMessage1un "Uninstall of ${PRODUCTNAME} failed!$\r$\n"
!define errorMessage2 "Uninstalling any installed items and exiting.$\r$\n"
# Set the icon
!define ICOFILE "V.ico"
Icon ${ICOFILE}
UninstallIcon ${ICOFILE}
WindowIcon off
# If /DUNINSTALLER was specified, Create the uinstaller
!ifdef UNINSTALLER
!echo "Creating RT uninstaller...."
OutFile "$%TEMP%\tempinstaller.exe"
SetCompress off
!else
!echo "Creating RT installer...."
# Define name of installer
OutFile "${PRODUCTNAME}-${PRODUCTVERSION}-Installer.exe"
SetCompressor /SOLID lzma
!endif
# Define default installation directory
InstallDir "$PROGRAMFILES\${PRODUCTNAME}\${PRODUCTVERSION}"
# Version string used in file names
Var FileVersion
# Directory RT was installed to.
# The uninstaller can't just use $INSTDIR because it is set to the
# directory the uninstaller exe file is located in.
!ifdef UNINSTALLER
Var IDir
!endif
# Install count
Var IC
#############################################
# StrRep - string replace
!define StrRep "!insertmacro StrRep"
!macro StrRep output string old new
Push `${string}`
Push `${old}`
Push `${new}`
!ifdef __UNINSTALL__
Call un.StrRep
!else
Call StrRep
!endif
Pop ${output}
!macroend
!macro Func_StrRep un
Function ${un}StrRep
Exch $R2 ;new
Exch 1
Exch $R1 ;old
Exch 2
Exch $R0 ;string
Push $R3
Push $R4
Push $R5
Push $R6
Push $R7
Push $R8
Push $R9
StrCpy $R3 0
StrLen $R4 $R1
StrLen $R6 $R0
StrLen $R9 $R2
loop:
StrCpy $R5 $R0 $R4 $R3
StrCmp $R5 $R1 found
StrCmp $R3 $R6 done
IntOp $R3 $R3 + 1 ;move offset by 1 to check the next character
Goto loop
found:
StrCpy $R5 $R0 $R3
IntOp $R8 $R3 + $R4
StrCpy $R7 $R0 "" $R8
StrCpy $R0 $R5$R2$R7
StrLen $R6 $R0
IntOp $R3 $R3 + $R9 ;move offset by length of the replacement string
Goto loop
done:
Pop $R9
Pop $R8
Pop $R7
Pop $R6
Pop $R5
Pop $R4
Pop $R3
Push $R0
Push $R1
Pop $R0
Pop $R1
Pop $R0
Pop $R2
Exch $R1
FunctionEnd
!macroend
!insertmacro Func_StrRep ""
!insertmacro Func_StrRep "un."
#############################################
# x64 macros
!define IsWow64 `"" IsWow64 ""`
!macro _IsWow64 _a _b _t _f
!insertmacro _LOGICLIB_TEMP
System::Call kernel32::GetCurrentProcess()p.s
System::Call kernel32::IsWow64Process(ps,*i0s)
Pop $_LOGICLIB_TEMP
!insertmacro _!= $_LOGICLIB_TEMP 0 `${_t}` `${_f}`
!macroend
!define RunningX64 `"" RunningX64 ""`
!macro _RunningX64 _a _b _t _f
!if ${NSIS_PTR_SIZE} > 4
!insertmacro LogicLib_JumpToBranch `${_t}` `${_f}`
!else
!insertmacro _IsWow64 `${_a}` `${_b}` `${_t}` `${_f}`
!endif
!macroend
!define DisableX64FSRedirection "!insertmacro DisableX64FSRedirection"
!macro DisableX64FSRedirection
System::Call kernel32::Wow64EnableWow64FsRedirection(i0)
!macroend
!define EnableX64FSRedirection "!insertmacro EnableX64FSRedirection"
!macro EnableX64FSRedirection
System::Call kernel32::Wow64EnableWow64FsRedirection(i1)
!macroend
# Need admin to write to C:\Windows\System32 and install dir
RequestExecutionLevel admin
Function .onInit
!ifdef UNINSTALLER
; Write out the uinstaller and quit
WriteUninstaller "$%TEMP%\Uninstall${PRODUCTNAME}.exe"
Quit
!endif
FunctionEnd
; Initialize Explode variables
Var /GLOBAL explString
Var /GLOBAL explSeparator
Var /GLOBAL explStrLen
Var /GLOBAL explSepLen
Var /GLOBAL explOffset
Var /GLOBAL explTmp
Var /GLOBAL explTmp2
Var /GLOBAL explTmp3
Var /GLOBAL explArrCount
!macro Func_Explode un
Function ${un}Explode
; Get input from user
Pop $explString
Pop $explSeparator
; Calculates initial values
StrLen $explStrLen $explString
StrLen $explSepLen $explSeparator
StrCpy $explArrCount 1
${If} $explStrLen <= 1 ; If we got a single character
${OrIf} $explSepLen > $explStrLen ; or separator is larger than the string,
Push $explString ; then we return initial string with no change
Push 1 ; and set array's length to 1
Return
${EndIf}
; Set offset to the last symbol of the string
StrCpy $explOffset $explStrLen
IntOp $explOffset $explOffset - 1
; Clear temp string to exclude the possibility of appearance of occasional data
StrCpy $explTmp ""
StrCpy $explTmp2 ""
StrCpy $explTmp3 ""
; Loop until the offset becomes negative
${Do}
; If offset becomes negative, it is time to leave the function
${IfThen} $explOffset == -1 ${|} ${ExitDo} ${|}
; Remove everything before and after the searched part ("TempStr")
StrCpy $explTmp $explString $explSepLen $explOffset
${If} $explTmp == $explSeparator
; Calculating offset to start copy from
IntOp $explTmp2 $explOffset + $explSepLen ; Offset equals to the current offset plus length of separator
StrCpy $explTmp3 $explString "" $explTmp2
Push $explTmp3 ; Throwing array item to the stack
IntOp $explArrCount $explArrCount + 1 ; Increasing array's counter
StrCpy $explString $explString $explOffset 0 ; Cutting all characters beginning with the separator entry
StrLen $explStrLen $explString
${EndIf}
${If} $explOffset = 0 ; If the beginning of the line met and there is no separator,
; copying the rest of the string
${If} $explSeparator == "" ; Fix for the empty separator
IntOp $explArrCount $explArrCount - 1
${Else}
Push $explString
${EndIf}
${EndIf}
IntOp $explOffset $explOffset - 1
${Loop}
Push $explArrCount
FunctionEnd
!macroend
!insertmacro Func_Explode ""
!insertmacro Func_Explode "un."
AddBrandingImage left 150
Caption "${PRODUCTNAME} ${PRODUCTVERSION} Setup"
Name "${PRODUCTNAME} ${PRODUCTVERSION}"
LIcenseData "VULKANRT_LICENSE.rtf"
Page custom brandimage "" ": Brand Image"
Page license
Page directory
Page instfiles
UninstallCaption "\${PRODUCTNAME} ${PRODUCTVERSION} Uninstall"
UninstallText "This wizard will uninstall ${PRODUCTNAME} ${PRODUCTVERSION} from your computer. Click Uninstall to start the uninstallation."
UninstPage custom un.brandimage "" ": Brand Image"
UninstPage uninstConfirm
UninstPage instFiles
# File Properties
VIProductVersion "${PRODUCTVERSION}"
VIAddVersionKey "ProductName" "${APINAME} Runtime"
VIAddVersionKey "FileVersion" "${PRODUCTVERSION}"
VIAddVersionKey "ProductVersion" "${PRODUCTVERSION}"
VIAddVersionKey "LegalCopyright" "${COPYRIGHT}"
!ifdef UNINSTALLER
VIAddVersionKey "FileDescription" "${APINAME} Runtime Uninstaller"
!else
VIAddVersionKey "FileDescription" "${APINAME} Runtime Installer"
!endif
# Function to run ConfigureRT program.
# Return value is in $0 - 0 is success, all else is failure.
!macro ConfigLayersAndVulkanDLL un
Function ${un}ConfigLayersAndVulkanDLL
# Execute the configuration program
nsExec::ExecToStack 'ConfigureRT.exe --abi-major ${VERSION_ABI_MAJOR} --api-name ${APINAME}'
Delete "$TEMP\VulkanRT\configure_rt.log"
Rename "configure_rt.log" "$TEMP\VulkanRT\configure_rt.log"
pop $0
${IF} $0 == 0
Pop $1
LogText "Output from ConfigureRT: $1"
Push ";"
Push "$1"
Call ${un}Explode
Pop $2
${For} $4 1 $2
Pop $3
Push ">"
Push "$3"
Call ${un}Explode
Pop $5
${IF} "$5" == "2"
Pop $6
Pop $7
CopyFiles /SILENT "$6" "$7"
${ENDIF}
${Next}
${ENDIF}
# Ignore errors. If something went wrong, the return value will indicate it.
ClearErrors
FunctionEnd
!macroend
!insertmacro ConfigLayersAndVulkanDLL ""
!insertmacro ConfigLayersAndVulkanDLL "un."
# Function to run diagnostics if ConfigureRT program failed.
# On entry $0, contains the return value from ConfigureRT.exe. It shouldn't be changed.
!macro DiagConfigLayersAndVulkanDLL un
Function ${un}DiagConfigLayersAndVulkanDLL
# Report the failure
LogText "ConfigureRT.exe failed with return code $0"
# Ignore errors
ClearErrors
FunctionEnd
!macroend
!insertmacro DiagConfigLayersAndVulkanDLL ""
!insertmacro DiagConfigLayersAndVulkanDLL "un."
# Start default section
Section
# Turn on logging
LogSet on
# If running on a 64-bit OS machine, disable registry re-direct since we're running as a 32-bit executable.
${If} ${RunningX64}
${DisableX64FSRedirection}
SetRegView 64
${Endif}
# Create our temp directory, with minimal permissions
RmDir /R "$TEMP\VulkanRT"
SetOutPath "$TEMP\VulkanRT"
AccessControl::DisableFileInheritance $TEMP\VulkanRT
AccessControl::SetFileOwner $TEMP\VulkanRT "Administrators"
AccessControl::ClearOnFile $TEMP\VulkanRT "Administrators" "FullAccess"
AccessControl::SetOnFile $TEMP\VulkanRT "SYSTEM" "FullAccess"
AccessControl::GrantOnFile $TEMP\VulkanRT "Everyone" "ListDirectory"
AccessControl::GrantOnFile $TEMP\VulkanRT "Everyone" "GenericExecute"
AccessControl::GrantOnFile $TEMP\VulkanRT "Everyone" "GenericRead"
AccessControl::GrantOnFile $TEMP\VulkanRT "Everyone" "ReadAttributes"
StrCpy $1 10
Call CheckForError
# Check the registry to see if we are already installed
ReadRegStr $0 HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCTNAME}${PRODUCTVERSION}" "InstallDir"
# If the registry entry isn't there, it will throw an error as well as return a blank value. So, clear the errors.
${If} ${Errors}
# Nothing else to do since there is no previous install
ClearErrors
${Else}
# Use the previous install directory, so we don't have to keep tracking every possible runtime install.
strcmp $INSTDIR $0 notinstalled
${If} $0 != ""
MessageBox MB_OK "The Windows ${APINAME} Runtime is already installed to $0. It will be re-installed to the same folder." /SD IDOK
Strcpy $INSTDIR $0
${Endif}
notinstalled:
${EndIf}
SetOutPath "$INSTDIR"
AccessControl::DisableFileInheritance $INSTDIR
AccessControl::SetFileOwner $INSTDIR "Administrators"
AccessControl::ClearOnFile $INSTDIR "Administrators" "FullAccess"
AccessControl::SetOnFile $INSTDIR "SYSTEM" "FullAccess"
AccessControl::GrantOnFile $INSTDIR "Everyone" "ListDirectory"
AccessControl::GrantOnFile $INSTDIR "Everyone" "GenericExecute"
AccessControl::GrantOnFile $INSTDIR "Everyone" "GenericRead"
AccessControl::GrantOnFile $INSTDIR "Everyone" "ReadAttributes"
File ${ICOFILE}
File VULKANRT_LICENSE.RTF
File /oname=LICENSE.txt ..\COPYRIGHT.txt
File Release\ConfigureRT.exe
StrCpy $1 15
Call CheckForError
# Add the signed uninstaller
!ifndef UNINSTALLER
SetOutPath $INSTDIR
File "Uninstall${PRODUCTNAME}.exe"
!endif
StrCpy $1 20
Call CheckForError
# Reference count the number of times we have been installed.
# The reference count is stored in the registry value InstallCount
ReadRegDword $1 HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCTNAME}${PRODUCTVERSION}" "InstallCount"
IntOp $1 $1 + 1
StrCpy $IC $1
# We need to create a new folder for each install. Since we are using counted installs,
# an uninstall when the count is greater than one would result in the install
# count being decremented and nothing being removed. But Windows Add/Remove Programs
# generates a warning Window if the install dir for a package that is removed is not
# deleted. So we create a unique folder for each counted install.
# We fudge it a little and only create one folder, and rename it after each
# install/uninstall.
# Create the install instance folder. We rename the install instance folder if it already exists.
# Then copy the uninstaller to it.
${If} $IC > 2
IntOp $1 $IC - 1
Rename "$INSTDIR\Instance_$1" "$INSTDIR\Instance_$IC"
CopyFiles /SILENT "$INSTDIR\Uninstall${PRODUCTNAME}.exe" "$INSTDIR\Instance_$IC"
${ElseIf} $IC = 2
CreateDirectory "$INSTDIR\Instance_$IC"
CopyFiles /SILENT "$INSTDIR\Uninstall${PRODUCTNAME}.exe" "$INSTDIR\Instance_$IC"
${EndIf}
# If the registry entry isn't there, it will throw an error as well as return a blank value. So, clear the errors.
${If} ${Errors}
ClearErrors
${EndIf}
# Modify registry for Programs and Features
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCTNAME}${PRODUCTVERSION}" "DisplayName" "${APINAME} Run Time Libraries ${PRODUCTVERSION}"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCTNAME}${PRODUCTVERSION}" "UninstallString" "$INSTDIR\Uninstall${PRODUCTNAME}.exe"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCTNAME}${PRODUCTVERSION}" "Publisher" "${PUBLISHER}"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCTNAME}${PRODUCTVERSION}" "DisplayVersion" "${PRODUCTVERSION}"
WriteRegDword HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCTNAME}${PRODUCTVERSION}" "EstimatedSize" ${ESTIMATEDSIZE}
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCTNAME}${PRODUCTVERSION}" "DisplayIcon" "$\"$INSTDIR\${ICOFILE}$\""
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCTNAME}${PRODUCTVERSION}" "InstallDir" "$INSTDIR"
WriteRegDword HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCTNAME}${PRODUCTVERSION}" "InstallCount" $IC
${If} $IC > 1
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCTNAME}${PRODUCTVERSION}-$IC" "DisplayName" "${APINAME} Run Time Libraries ${PRODUCTVERSION}"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCTNAME}${PRODUCTVERSION}-$IC" "UninstallString" "$INSTDIR\Instance_$IC\Uninstall${PRODUCTNAME}.exe"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCTNAME}${PRODUCTVERSION}-$IC" "Publisher" "${PUBLISHER}"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCTNAME}${PRODUCTVERSION}-$IC" "DisplayVersion" "${PRODUCTVERSION}"
WriteRegDword HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCTNAME}${PRODUCTVERSION}-$IC" "EstimatedSize" ${ESTIMATEDSIZE}
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCTNAME}${PRODUCTVERSION}-$IC" "DisplayIcon" "$\"$INSTDIR\${ICOFILE}$\""
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCTNAME}${PRODUCTVERSION}-$IC" "InstallDir" "$INSTDIR\Instance_$IC"
WriteRegDword HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCTNAME}${PRODUCTVERSION}-$IC" "InstallCount" $IC
${EndIf}
# Set SystemComponent to 1 for those instances that are not to be visible to Add/Remove Programs.
# Set SystemComponent to 0 for the instance that is to be visible to Add/Remove Programs.
${If} $IC > 1
WriteRegDword HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCTNAME}${PRODUCTVERSION}-$IC" "SystemComponent" 1
${Else}
WriteRegDword HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCTNAME}${PRODUCTVERSION}" "SystemComponent" 1
${EndIf}
StrCpy $1 25
Call CheckForError
# Set up version number for file names
${StrRep} $0 ${VERSION_BUILDNO} "." "-"
StrCpy $FileVersion ${VERSION_ABI_MAJOR}-${VERSION_API_MAJOR}-${VERSION_MINOR}-${VERSION_PATCH}-$0
# Complete remove the Vulkan Start Menu. Prior version of the Vulkan RT
# created Start Menu items, we don't do that anymore.
SetShellVarContext all
RmDir /R "$SMPROGRAMS\Vulkan"
ClearErrors
# If running on a 64-bit OS machine
${If} ${RunningX64}
# 32-bit DLLs/EXEs destined for SysWOW64
##########################################
SetOutPath $WINDIR\SysWow64
File /oname=${APILOWER}-$FileVersion.dll ..\build32\loader\RelWithDebInfo\${APILOWER}-${VERSION_ABI_MAJOR}.dll
File /oname=${APILOWER}info-$FileVersion.exe ..\build32\demos\RelWithDebInfo\${APILOWER}info.exe
StrCpy $1 30
Call CheckForError
# 64-bit DLLs/EXEs
##########################################
SetOutPath $WINDIR\System32
File /oname=${APILOWER}-$FileVersion.dll ..\build\loader\RelWithDebInfo\${APILOWER}-${VERSION_ABI_MAJOR}.dll
StrCpy $1 35
Call CheckForError
# vulkaninfo.exe
File /oname=${APILOWER}info-$FileVersion.exe ..\build\demos\RelWithDebInfo\${APILOWER}info.exe
SetOutPath "$INSTDIR"
File /oname=${APILOWER}info.exe ..\build\demos\RelWithDebInfo\${APILOWER}info.exe
File /oname=${APILOWER}info32.exe ..\build32\demos\RelWithDebInfo\${APILOWER}info.exe
StrCpy $1 40
Call CheckForError
# Else, running on a 32-bit OS machine
${Else}
# 32-bit DLLs/EXEs destined for SysWOW64
##########################################
SetOutPath $WINDIR\System32
File /oname=${APILOWER}-$FileVersion.dll ..\build32\loader\RelWithDebInfo\${APILOWER}-${VERSION_ABI_MAJOR}.dll
StrCpy $1 50
Call CheckForError
# vulkaninfo.exe
File /oname=${APILOWER}info-$FileVersion.exe ..\build32\demos\RelWithDebInfo\${APILOWER}info.exe
SetOutPath "$INSTDIR"
File /oname=${APILOWER}info.exe ..\build32\demos\RelWithDebInfo\${APILOWER}info.exe
StrCpy $1 55
Call CheckForError
${Endif}
# Run the ConfigureRT program to copy the most recent version of
# vulkan-<abimajor>-*.dll to vulkan-<abimajor>.dll, and to set up layer registry
# entries to use layers from the corresponding SDK
SetOutPath "$INSTDIR"
Call ConfigLayersAndVulkanDLL
${If} $0 != 0
SetOutPath "$INSTDIR"
Call DiagConfigLayersAndVulkanDLL
# The program failed, and we don't know why.
# Simply configure system to use our loader and vulkaninfo.
MessageBox MB_OK "Warning!$\n$\nConfigureRT program called by VulkanRT Installer failed with error $0. This may result in an incomplete installation.$\n$\nWill configure system with Vulkan $FileVersion." /SD IDOK
${If} ${RunningX64}
Delete $WINDIR\SysWow64\${APILOWER}-${VERSION_ABI_MAJOR}.dll
Delete $WINDIR\SysWow64\${APILOWER}info.exe
CopyFiles /SILENT $WINDIR\SysWow64\${APILOWER}-$FileVersion.dll $WINDIR\SysWow64\${APILOWER}-${VERSION_ABI_MAJOR}.dll
CopyFiles /SILENT $WINDIR\SysWow64\${APILOWER}info-$FileVersion.exe $WINDIR\SysWow64\${APILOWER}info.exe
${Endif}
Delete $WINDIR\System32\${APILOWER}-${VERSION_ABI_MAJOR}.dll
Delete $WINDIR\System32\${APILOWER}info.exe
CopyFiles /SILENT $WINDIR\System32\${APILOWER}-$FileVersion.dll $WINDIR\System32\${APILOWER}-${VERSION_ABI_MAJOR}.dll
CopyFiles /SILENT $WINDIR\System32\${APILOWER}info-$FileVersion.exe $WINDIR\System32\${APILOWER}info.exe
ClearErrors
${Endif}
StrCpy $1 60
Call CheckForError
# We are done using ConfigureRT.exe, delete it. It will be re-installed
# by the uninstaller when it needs to be run again during uninstall.
Delete ConfigureRT.exe
# Finish logging and move log file to TEMP dir
LogSet off
Rename "$INSTDIR\install.log" "$TEMP\VulkanRT\installer.log"
SectionEnd
# Uninstaller section start
!ifdef UNINSTALLER
Section "uninstall"
# Turn on logging
SetOutPath "$TEMP\VulkanRT"
StrCpy $INSTDIR "$TEMP\VulkanRT"
LogSet on
# If running on a 64-bit OS machine, disable registry re-direct since we're running as a 32-bit executable.
${If} ${RunningX64}
${DisableX64FSRedirection}
SetRegView 64
${Endif}
# Look up the install dir and remove files from that directory.
ReadRegStr $0 HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCTNAME}${PRODUCTVERSION}" "InstallDir"
StrCpy $IDir $0
StrCpy $1 65
Call un.CheckForError
SetOutPath "$IDir"
# Set up version number for file names
${StrRep} $0 ${VERSION_BUILDNO} "." "-"
StrCpy $FileVersion ${VERSION_ABI_MAJOR}-${VERSION_API_MAJOR}-${VERSION_MINOR}-${VERSION_PATCH}-$0
# Decrement the number of times we have been installed.
ReadRegDword $IC HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCTNAME}${PRODUCTVERSION}" "InstallCount"
IntOp $1 $IC - 1
WriteRegDword HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCTNAME}${PRODUCTVERSION}" "InstallCount" $1
# Rename the install dir for this instance if is not the last uninstall
${If} $IC > 2
IntOp $1 $IC - 1
Rename "$IDir\Instance_$IC" "$IDir\Instance_$1"
${ElseIf} $IC = 2
Delete /REBOOTOK "$IDir\Instance_$IC\Uninstall${PRODUCTNAME}.exe"
Rmdir /REBOOTOK "$IDir\Instance_$IC"
${Endif}
StrCpy $1 70
Call un.CheckForError
# Modify registry for Programs and Features
${If} $IC > 1
DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCTNAME}${PRODUCTVERSION}-$IC"
${EndIf}
${If} $IC > 2
IntOp $IC $IC - 1
WriteRegDword HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCTNAME}${PRODUCTVERSION}-$IC" "SystemComponent" 1
${ElseIf} $IC = 2
WriteRegDword HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCTNAME}${PRODUCTVERSION}" "SystemComponent" 1
${Else}
# Last uninstall
IntOp $IC $IC - 1
DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCTNAME}${PRODUCTVERSION}"
${EndIf}
StrCpy $1 75
Call un.CheckForError
# Install ConfigureRT.exe so we can run it.
# It will be deleted later when we remove the install directory.
File Release\ConfigureRT.exe
# If running on a 64-bit OS machine
${If} ${RunningX64}
# Delete vulkaninfo.exe in C:\Windows\System32 and C:\Windows\SysWOW64
Delete /REBOOTOK $WINDIR\SysWow64\${APILOWER}info.exe
Delete /REBOOTOK $WINDIR\System32\${APILOWER}info.exe
# Delete vulkan-<majorabi>.dll in C:\Windows\System32 and C:\Windows\SysWOW64
Delete /REBOOTOK $WINDIR\SysWow64\${APILOWER}-${VERSION_ABI_MAJOR}.dll
Delete /REBOOTOK $WINDIR\System32\${APILOWER}-${VERSION_ABI_MAJOR}.dll
# Else, running on a 32-bit OS machine
${Else}
# Delete vulkaninfo.exe in C:\Windows\System32
Delete /REBOOTOK $WINDIR\System32\${APILOWER}info.exe
# Delete vulkan-<majorabi>.dll in C:\Windows\System32
Delete /REBOOTOK $WINDIR\System32\${APILOWER}-${VERSION_ABI_MAJOR}.dll
${EndIf}
StrCpy $1 80
Call un.CheckForError
# If Ref Count is zero, remove files in C:\Windows\System32 and C:\Windows\SysWow64
${If} $IC <= 0
${If} ${RunningX64}
# Delete vulkaninfo.exe in C:\Windows\System32 and C:\Windows\SysWOW64
Delete /REBOOTOK "$WINDIR\SysWow64\${APILOWER}info-$FileVersion.exe"
Delete /REBOOTOK "$WINDIR\System32\${APILOWER}info-$FileVersion.exe"
# Delete vulkan-<majorabi>-<major>-<minor>-<patch>-<buildno>.dll from sys dirs
Delete /REBOOTOK $WINDIR\SysWow64\${APILOWER}-$FileVersion.dll
Delete /REBOOTOK $WINDIR\System32\${APILOWER}-$FileVersion.dll
${Else}
# Delete vulkaninfo.exe in C:\Windows\System32
Delete /REBOOTOK "$WINDIR\System32\${APILOWER}info-$FileVersion.exe"
# Delete vulkan-<majorabi>-<major>-<minor>-<patch>-<buildno>.dll from sys dir
Delete /REBOOTOK $WINDIR\System32\${APILOWER}-$FileVersion.dll
${EndIf}
${Endif}
# Run the ConfigureRT.exe program to copy the most recent version of
# vulkan-<abimajor>-*.dll to vulkan-<abimajor>.dll, and to set up layer registry
# entries to use layers from the corresponding SDK
SetOutPath "$IDir"
Call un.ConfigLayersAndVulkanDLL
${If} $0 != 0
SetOutPath "$IDir"
Call un.DiagConfigLayersAndVulkanDLL
MessageBox MB_OK "Warning!$\n$\nConfigureRT program called by ${APILOWER} Runtime Installer failed with error $0. This may result in an incomplete uninstall.$\n$\nVulkan $FileVersion has been uninstalled from your system." /SD IDOK
${If} ${RunningX64}
Delete $WINDIR\SysWow64\${APILOWER}-${VERSION_ABI_MAJOR}.dll
Delete $WINDIR\SysWow64\${APILOWER}info.exe
${Endif}
Delete $WINDIR\System32\${APILOWER}-${VERSION_ABI_MAJOR}.dll
Delete $WINDIR\System32\${APILOWER}info.exe
ClearErrors
${Else}
StrCpy $1 85
${Endif}
Call un.CheckForError
# Remove ConfigureRT regardless of the ref count
Delete /REBOOTOK "$IDir\ConfigureRT.exe"
# If Ref Count is zero, remove install dir
${If} $IC <= 0
# Remove files in install dir
Delete /REBOOTOK "$IDir\VULKANRT_LICENSE.rtf"
Delete /REBOOTOK "$IDir\LICENSE.txt"
Delete /REBOOTOK "$IDir\Uninstall${PRODUCTNAME}.exe"
Delete /REBOOTOK "$IDir\V.ico"
Delete /REBOOTOK "$IDir\${APILOWER}info.exe"
# If running on a 64-bit OS machine
${If} ${RunningX64}
Delete /REBOOTOK "$IDir\${APILOWER}info32.exe"
${EndIf}
StrCpy $1 90
Call un.CheckForError
# Need to do a SetOutPath to something outside of install dir,
# or the uninstall will think install dir is busy
SetOutPath "$TEMP"
# Remove install directories
StrCpy $0 "$IDir"
Call un.DeleteDirIfEmpty
StrCpy $0 "$PROGRAMFILES\${PRODUCTNAME}"
Call un.DeleteDirIfEmpty
ClearErrors
# If any of the remove commands failed, request a reboot
IfRebootFlag 0 noreboot
MessageBox MB_YESNO "A reboot is required to finish the uninstall. Do you wish to reboot now?" /SD IDNO IDNO returnerror
Reboot
returnerror:
# Set an error message to output because we should reboot but didn't (whether because silent uninstall or user choice)
SetErrorLevel 3 # ERROR_TOO_MANY_OPEN_FILES
noreboot:
${Endif}
StrCpy $1 95
Call un.CheckForError
# Finish logging
LogSet off
Rename "$INSTDIR\install.log" "$TEMP\VulkanRT\uninstaller.log"
SectionEnd
!endif
Function brandimage
SetOutPath "$TEMP"
SetFileAttributes V.bmp temporary
File V.bmp
SetBrandingImage "$TEMP/V.bmp"
Functionend
Function un.brandimage
SetOutPath "$TEMP"
SetFileAttributes V.bmp temporary
File V.bmp
SetBrandingImage "$TEMP/V.bmp"
Functionend
Function un.DeleteDirIfEmpty
FindFirst $R0 $R1 "$0\*.*"
strcmp $R1 "." 0 NoDelete
FindNext $R0 $R1
strcmp $R1 ".." 0 NoDelete
ClearErrors
FindNext $R0 $R1
IfErrors 0 NoDelete
FindClose $R0
Sleep 1000
RMDir "$0"
NoDelete:
FindClose $R0
FunctionEnd
# Check for errors during install. If we hit an error, stop, uninstall what we've put in so far, and quit.
# NOTE: We return a non-zero error code as well.
Function CheckForError
${If} ${Errors}
# IHV's using this install may want no message box.
MessageBox MB_OK|MB_ICONSTOP "${errorMessage1}${errorMessage2}Errorcode: $1$\r$\n" /SD IDOK
# Finish logging and move log file to TEMP dir
LogSet off
Rename "$INSTDIR\install.log" "$TEMP\VulkanRT\installer.log"
# Copy the uninstaller to a temp folder of our own creation so we can completely
# delete the old contents.
SetOutPath "$TEMP\VulkanRT"
CopyFiles "$INSTDIR\Uninstall${PRODUCTNAME}.exe" "$TEMP\VulkanRT"
# Do uninstall using the version in the temporary folder.
ExecWait '"$TEMP\VulkanRT\Uninstall${PRODUCTNAME}.exe" /S _?=$INSTDIR'
# Delete the copy of the uninstaller we ran
Delete /REBOOTOK "$TEMP\VulkanRT\Uninstall${PRODUCTNAME}.exe"
# Set an error message to output
SetErrorLevel $1
Quit
${EndIf}
FunctionEnd
# Check for errors during uninstall. If we hit an error, don't attempt
# to do anything. Just set a non-zero return code and continue.
Function un.CheckForError
${If} ${Errors}
# IHV's using this install may want no message box.
MessageBox MB_OK|MB_ICONSTOP "${errorMessage1un}${errorMessage2}Errorcode: $1$\r$\n" /SD IDOK
# Set an error message to output
SetErrorLevel $1
${EndIf}
FunctionEnd