Home | History | Annotate | Download | only in windowsRuntimeInstaller
      1 # NSIS Script for creating the Windows Vulkan RT installer.
      2 #
      3 # Copyright (c) 2015-2016 The Khronos Group Inc.
      4 # Copyright (c) 2015-2016 Valve Corporation
      5 # Copyright (c) 2015-2016 LunarG, Inc.
      6 #
      7 # Permission is hereby granted, free of charge, to any person obtaining a copy
      8 # of this software and/or associated documentation files (the "Materials"), to
      9 # deal in the Materials without restriction, including without limitation the
     10 # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
     11 # sell copies of the Materials, and to permit persons to whom the Materials are
     12 # furnished to do so, subject to the following conditions:
     13 #
     14 # The above copyright notice(s) and this permission notice shall be included in
     15 # all copies or substantial portions of the Materials.
     16 #
     17 # THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     18 # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     19 # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
     20 #
     21 # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
     22 # DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
     23 # OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE MATERIALS OR THE
     24 # USE OR OTHER DEALINGS IN THE MATERIALS.
     25 #
     26 # Author: David Pinedo <david (a] LunarG.com>
     27 # Author: Mark Young <mark (a] LunarG.com>
     28 #
     29 
     30 
     31 # Version information
     32 # Set VERSION_BUILDNO to:
     33 #    x.pre.z for prereleases
     34 #    x for releases
     35 #
     36 !define PRODUCTNAME "VulkanRT"
     37 !define VERSION_ABI_MAJOR "1"
     38 !define VERSION_API_MAJOR "1"
     39 !define VERSION_MINOR "0"
     40 !define VERSION_PATCH "1"
     41 !define VERSION_BUILDNO "0.pre.1"
     42 !define PUBLISHER "YourCompany, Inc."
     43 #!define VERSION_BUILDNO "0"
     44 !define PRODUCTVERSION "${VERSION_API_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}.${VERSION_BUILDNO}"
     45 
     46 # Includes
     47 !include LogicLib.nsh
     48 
     49 # This number is determined by doing an install, and then from Windows Explorer,
     50 # doing a "Properties" on the install directory. Add to this the size of the
     51 # files installed to C:\Windows\System32. And then add a little bit more.
     52 # The units are 1K bytes.
     53 !define ESTIMATEDSIZE "1700"
     54 
     55 # This is used for the error message if a problem occurs during install.
     56 !define errorMessage1 "Installation of ${PRODUCTNAME} failed!$\r$\n"
     57 !define errorMessage1un "Uninstall of ${PRODUCTNAME} failed!$\r$\n"
     58 !define errorMessage2 "Uninstalling any installed items and exiting.$\r$\n"
     59 
     60 # Set the icon
     61 !define ICOFILE "V.ico"
     62 Icon ${ICOFILE}
     63 UninstallIcon ${ICOFILE}
     64 WindowIcon off
     65 
     66 # If /DUNINSTALLER was specified, Create the uinstaller
     67 !ifdef UNINSTALLER
     68   !echo "Creating RT uninstaller...."
     69   OutFile "$%TEMP%\tempinstaller.exe"
     70   SetCompress off
     71 !else
     72   !echo "Creating RT installer...."
     73 
     74   # Define name of installer
     75   OutFile "VulkanRT-${PRODUCTVERSION}-Installer.exe"
     76   SetCompressor /SOLID lzma
     77 
     78 !endif
     79 
     80 # Define default installation directory
     81 InstallDir "$PROGRAMFILES\${PRODUCTNAME}\${PRODUCTVERSION}"
     82 
     83 # Version string used in file names
     84 Var FileVersion
     85 
     86 # Directory RT was installed to.
     87 # The uninstaller can't just use $INSTDIR because it is set to the
     88 # directory the uninstaller exe file is located in.
     89 !ifdef UNINSTALLER
     90 Var IDir
     91 !endif
     92 
     93 # Install count
     94 Var IC
     95 
     96 # Error code from powershell script
     97 Var PsErr
     98 
     99 
    100 #############################################
    101 # StrRep - string replace
    102 
    103 !define StrRep "!insertmacro StrRep"
    104 !macro StrRep output string old new
    105     Push `${string}`
    106     Push `${old}`
    107     Push `${new}`
    108     !ifdef __UNINSTALL__
    109         Call un.StrRep
    110     !else
    111         Call StrRep
    112     !endif
    113     Pop ${output}
    114 !macroend
    115 
    116 !macro Func_StrRep un
    117     Function ${un}StrRep
    118         Exch $R2 ;new
    119         Exch 1
    120         Exch $R1 ;old
    121         Exch 2
    122         Exch $R0 ;string
    123         Push $R3
    124         Push $R4
    125         Push $R5
    126         Push $R6
    127         Push $R7
    128         Push $R8
    129         Push $R9
    130 
    131         StrCpy $R3 0
    132         StrLen $R4 $R1
    133         StrLen $R6 $R0
    134         StrLen $R9 $R2
    135         loop:
    136             StrCpy $R5 $R0 $R4 $R3
    137             StrCmp $R5 $R1 found
    138             StrCmp $R3 $R6 done
    139             IntOp $R3 $R3 + 1 ;move offset by 1 to check the next character
    140             Goto loop
    141         found:
    142             StrCpy $R5 $R0 $R3
    143             IntOp $R8 $R3 + $R4
    144             StrCpy $R7 $R0 "" $R8
    145             StrCpy $R0 $R5$R2$R7
    146             StrLen $R6 $R0
    147             IntOp $R3 $R3 + $R9 ;move offset by length of the replacement string
    148             Goto loop
    149         done:
    150 
    151         Pop $R9
    152         Pop $R8
    153         Pop $R7
    154         Pop $R6
    155         Pop $R5
    156         Pop $R4
    157         Pop $R3
    158         Push $R0
    159         Push $R1
    160         Pop $R0
    161         Pop $R1
    162         Pop $R0
    163         Pop $R2
    164         Exch $R1
    165     FunctionEnd
    166 !macroend
    167 !insertmacro Func_StrRep ""
    168 !insertmacro Func_StrRep "un."
    169 
    170 #############################################
    171 # x64 macros
    172 
    173 !define IsWow64 `"" IsWow64 ""`
    174 !macro _IsWow64 _a _b _t _f
    175   !insertmacro _LOGICLIB_TEMP
    176   System::Call kernel32::GetCurrentProcess()p.s
    177   System::Call kernel32::IsWow64Process(ps,*i0s)
    178   Pop $_LOGICLIB_TEMP
    179   !insertmacro _!= $_LOGICLIB_TEMP 0 `${_t}` `${_f}`
    180 !macroend
    181 
    182 !define RunningX64 `"" RunningX64 ""`
    183 !macro _RunningX64 _a _b _t _f
    184   !if ${NSIS_PTR_SIZE} > 4
    185     !insertmacro LogicLib_JumpToBranch `${_t}` `${_f}`
    186   !else
    187     !insertmacro _IsWow64 `${_a}` `${_b}` `${_t}` `${_f}`
    188   !endif
    189 !macroend
    190 
    191 !define DisableX64FSRedirection "!insertmacro DisableX64FSRedirection"
    192 !macro DisableX64FSRedirection
    193   System::Call kernel32::Wow64EnableWow64FsRedirection(i0)
    194 !macroend
    195 
    196 !define EnableX64FSRedirection "!insertmacro EnableX64FSRedirection"
    197 !macro EnableX64FSRedirection
    198   System::Call kernel32::Wow64EnableWow64FsRedirection(i1)
    199 !macroend
    200 
    201 
    202 # Need admin to write to C:\Windows\System32 and install dir
    203 RequestExecutionLevel admin
    204 
    205 Function .onInit
    206 
    207 !ifdef UNINSTALLER
    208    ; Write out the uinstaller and quit
    209    WriteUninstaller "$%TEMP%\Uninstall${PRODUCTNAME}.exe"
    210    Quit
    211 !endif
    212 
    213 FunctionEnd
    214 
    215 AddBrandingImage left 150
    216 Caption "${PRODUCTNAME} ${PRODUCTVERSION} Setup"
    217 Name "${PRODUCTNAME} ${PRODUCTVERSION}"
    218 LIcenseData "VULKANRT_LICENSE.rtf"
    219 Page custom brandimage "" ": Brand Image"
    220 Page license
    221 Page directory
    222 Page instfiles
    223 UninstallCaption "\${PRODUCTNAME} ${PRODUCTVERSION} Uninstall"
    224 UninstallText "This wizard will uninstall ${PRODUCTNAME} ${PRODUCTVERSION} from your computer. Click Uninstall to start the uninstallation."
    225 UninstPage custom un.brandimage "" ": Brand Image"
    226 UninstPage uninstConfirm
    227 UninstPage instFiles
    228 
    229 # File Properties
    230 VIProductVersion "${PRODUCTVERSION}"
    231 VIAddVersionKey  "ProductName" "Vulkan Runtime"
    232 VIAddVersionKey  "FileVersion" "${PRODUCTVERSION}"
    233 VIAddVersionKey  "ProductVersion" "${PRODUCTVERSION}"
    234 VIAddVersionKey  "FileDescription" "Vulkan Runtime Installer"
    235 VIAddVersionKey  "LegalCopyright" ""
    236 
    237 # Start default section
    238 Section
    239 
    240     # If running on a 64-bit OS machine, disable registry re-direct since we're running as a 32-bit executable.
    241     ${If} ${RunningX64}
    242 
    243         ${DisableX64FSRedirection}
    244         SetRegView 64
    245 
    246     ${Endif}
    247 
    248     # Create our temp directory, with minimal permissions
    249     SetOutPath "$TEMP\VulkanRT"
    250     AccessControl::DisableFileInheritance $TEMP\VulkanRT
    251     AccessControl::SetFileOwner $TEMP\VulkanRT "Administrators"
    252     AccessControl::ClearOnFile  $TEMP\VulkanRT "Administrators" "FullAccess"
    253     AccessControl::SetOnFile    $TEMP\VulkanRT "SYSTEM" "FullAccess"
    254     AccessControl::GrantOnFile  $TEMP\VulkanRT "Everyone" "ListDirectory"
    255     AccessControl::GrantOnFile  $TEMP\VulkanRT "Everyone" "GenericExecute"
    256     AccessControl::GrantOnFile  $TEMP\VulkanRT "Everyone" "GenericRead"
    257     AccessControl::GrantOnFile  $TEMP\VulkanRT "Everyone" "ReadAttributes"
    258     StrCpy $1 10
    259     Call CheckForError
    260 
    261     # Check the registry to see if we are already installed
    262     ReadRegStr $0 HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCTNAME}${PRODUCTVERSION}" "InstallDir"
    263 
    264     # If the registry entry isn't there, it will throw an error as well as return a blank value.  So, clear the errors.
    265     ${If} ${Errors}
    266 
    267         # Nothing else to do since there is no previous install
    268         ClearErrors
    269 
    270     ${Else}
    271 
    272         # Use the previous install directory, so we don't have to keep tracking every possible runtime install.
    273         strcmp $INSTDIR $0 notinstalled
    274 
    275         ${If} $0 != ""
    276             MessageBox MB_OK "The Windows Vulkan Runtime is already installed to $0. It will be re-installed to the same folder." /SD IDOK
    277             Strcpy $INSTDIR $0
    278         ${Endif}
    279 
    280         notinstalled:
    281 
    282     ${EndIf}
    283 
    284     SetOutPath "$INSTDIR"
    285     AccessControl::DisableFileInheritance $INSTDIR
    286     AccessControl::SetFileOwner $INSTDIR "Administrators"
    287     AccessControl::ClearOnFile  $INSTDIR "Administrators" "FullAccess"
    288     AccessControl::SetOnFile    $INSTDIR "SYSTEM" "FullAccess"
    289     AccessControl::GrantOnFile  $INSTDIR "Everyone" "ListDirectory"
    290     AccessControl::GrantOnFile  $INSTDIR "Everyone" "GenericExecute"
    291     AccessControl::GrantOnFile  $INSTDIR "Everyone" "GenericRead"
    292     AccessControl::GrantOnFile  $INSTDIR "Everyone" "ReadAttributes"
    293     File ${ICOFILE}
    294     File VULKANRT_LICENSE.RTF
    295     File LICENSE.txt
    296     File ConfigLayersAndVulkanDLL.ps1
    297     StrCpy $1 15
    298     Call CheckForError
    299 
    300     # Add the signed uninstaller
    301     !ifndef UNINSTALLER
    302         SetOutPath $INSTDIR
    303         File "Uninstall${PRODUCTNAME}.exe"
    304     !endif
    305 
    306     StrCpy $1 20
    307     Call CheckForError
    308 
    309     # Reference count the number of times we have been installed.
    310     # The reference count is stored in the registry value InstallCount
    311     ReadRegDword $1 HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCTNAME}${PRODUCTVERSION}" "InstallCount"
    312     IntOp $1 $1 + 1
    313     StrCpy $IC $1
    314 
    315     # We need to create a new folder for each install. Since we are using counted installs,
    316     # an uninstall when the count is greater than one would result in the install
    317     # count being decremented and nothing being removed. But Windows Add/Remove Programs
    318     # generates a warning Window if the install dir for a package that is removed is not
    319     # deleted. So we create a unique folder for each counted install.
    320     # We fudge it a little and only create one folder, and rename it after each
    321     # install/uninstall.
    322 
    323     # Create the install instance folder. We rename the install instance folder if it already exists.
    324     # Then copy the uninstaller to it.
    325     ${If} $IC > 2
    326         IntOp $1 $IC - 1
    327         Rename "$INSTDIR\Instance_$1" "$INSTDIR\Instance_$IC"
    328         CopyFiles /SILENT "$INSTDIR\Uninstall${PRODUCTNAME}.exe" "$INSTDIR\Instance_$IC"
    329     ${ElseIf} $IC = 2
    330         CreateDirectory "$INSTDIR\Instance_$IC"
    331         CopyFiles /SILENT "$INSTDIR\Uninstall${PRODUCTNAME}.exe" "$INSTDIR\Instance_$IC"
    332     ${EndIf}
    333 
    334 
    335     # If the registry entry isn't there, it will throw an error as well as return a blank value.  So, clear the errors.
    336     ${If} ${Errors}
    337         ClearErrors
    338     ${EndIf}
    339 
    340     # Modify registry for Programs and Features
    341     WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCTNAME}${PRODUCTVERSION}" "DisplayName" "Vulkan Run Time Libraries ${PRODUCTVERSION}"
    342     WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCTNAME}${PRODUCTVERSION}" "UninstallString" "$INSTDIR\Uninstall${PRODUCTNAME}.exe"
    343     WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCTNAME}${PRODUCTVERSION}" "Publisher" "${PUBLISHER}"
    344     WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCTNAME}${PRODUCTVERSION}" "DisplayVersion" "${PRODUCTVERSION}"
    345     WriteRegDword HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCTNAME}${PRODUCTVERSION}" "EstimatedSize" ${ESTIMATEDSIZE}
    346     WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCTNAME}${PRODUCTVERSION}" "DisplayIcon" "$\"$INSTDIR\${ICOFILE}$\""
    347     WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCTNAME}${PRODUCTVERSION}" "InstallDir" "$INSTDIR"
    348     WriteRegDword HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCTNAME}${PRODUCTVERSION}" "InstallCount" $IC
    349 
    350     ${If} $IC > 1
    351         WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCTNAME}${PRODUCTVERSION}-$IC" "DisplayName" "Vulkan Run Time Libraries ${PRODUCTVERSION}"
    352         WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCTNAME}${PRODUCTVERSION}-$IC" "UninstallString" "$INSTDIR\Instance_$IC\Uninstall${PRODUCTNAME}.exe"
    353         WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCTNAME}${PRODUCTVERSION}-$IC" "Publisher" "${PUBLISHER}"
    354         WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCTNAME}${PRODUCTVERSION}-$IC" "DisplayVersion" "${PRODUCTVERSION}"
    355         WriteRegDword HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCTNAME}${PRODUCTVERSION}-$IC" "EstimatedSize" ${ESTIMATEDSIZE}
    356         WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCTNAME}${PRODUCTVERSION}-$IC" "DisplayIcon" "$\"$INSTDIR\${ICOFILE}$\""
    357         WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCTNAME}${PRODUCTVERSION}-$IC" "InstallDir" "$INSTDIR\Instance_$IC"
    358         WriteRegDword HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCTNAME}${PRODUCTVERSION}-$IC" "InstallCount" $IC
    359     ${EndIf}
    360 
    361     # Set SystemComponent to 1 for those instances that are not to be visible to Add/Remove Programs.
    362     # Set SystemComponent to 0 for the instance that is to be visible to Add/Remove Programs.
    363     ${If} $IC > 2
    364         IntOp $1 $IC - 1
    365         WriteRegDword HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCTNAME}${PRODUCTVERSION}-$IC" "SystemComponent" 0
    366         WriteRegDword HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCTNAME}${PRODUCTVERSION}-$1" "SystemComponent" 1
    367     ${ElseIf} $IC = 2
    368         WriteRegDword HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCTNAME}${PRODUCTVERSION}-$IC" "SystemComponent" 0
    369         WriteRegDword HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCTNAME}${PRODUCTVERSION}" "SystemComponent" 1
    370     ${Else}
    371         WriteRegDword HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCTNAME}${PRODUCTVERSION}" "SystemComponent" 0
    372     ${EndIf}
    373 
    374     StrCpy $1 25
    375     Call CheckForError
    376 
    377     # Set up version number for file names
    378     ${StrRep} $0 ${VERSION_BUILDNO} "." "-"
    379     StrCpy $FileVersion ${VERSION_ABI_MAJOR}-${VERSION_API_MAJOR}-${VERSION_MINOR}-${VERSION_PATCH}-$0
    380 
    381     # Remove vulkaninfo from Start Menu
    382     SetShellVarContext all
    383     Delete "$SMPROGRAMS\Vulkan\vulkaninfo32.lnk"
    384     Delete "$SMPROGRAMS\Vulkan\vulkaninfo.lnk"
    385     ClearErrors
    386 
    387     # Create Vulkan in the Start Menu
    388     CreateDirectory "$SMPROGRAMS\Vulkan"
    389     ClearErrors
    390 
    391     # If running on a 64-bit OS machine
    392     ${If} ${RunningX64}
    393 
    394         # 32-bit DLLs/EXEs destined for SysWOW64
    395         ##########################################
    396         SetOutPath $WINDIR\SysWow64
    397         File /oname=vulkan-$FileVersion.dll ..\build32\loader\Release\vulkan-${VERSION_ABI_MAJOR}.dll
    398         File /oname=vulkaninfo-$FileVersion.exe ..\build32\demos\Release\vulkaninfo.exe
    399         StrCpy $1 30
    400         Call CheckForError
    401 
    402         # 64-bit DLLs/EXEs
    403         ##########################################
    404         SetOutPath $WINDIR\System32
    405         File /oname=vulkan-$FileVersion.dll ..\build\loader\Release\vulkan-${VERSION_ABI_MAJOR}.dll
    406         StrCpy $1 35
    407         Call CheckForError
    408 
    409         # vulkaninfo.exe
    410         File /oname=vulkaninfo-$FileVersion.exe ..\build\demos\Release\vulkaninfo.exe
    411         SetOutPath "$INSTDIR"
    412         File ..\build\demos\Release\vulkaninfo.exe
    413         File /oname=vulkaninfo32.exe ..\build32\demos\Release\vulkaninfo.exe
    414         StrCpy $1 40
    415         Call CheckForError
    416 
    417         # Run the ConfigLayersAndVulkanDLL.ps1 script to copy the most recent version of
    418         # vulkan-<abimajor>-*.dll to vulkan-<abimajor>.dll, and to set up layer registry
    419         # entries to use layers from the corresponding SDK
    420         nsExec::ExecToStack 'powershell -NoLogo -NonInteractive -WindowStyle Hidden -inputformat none -ExecutionPolicy RemoteSigned -File ConfigLayersAndVulkanDLL.ps1 ${VERSION_ABI_MAJOR} 64'
    421         pop $PsErr
    422         ${If} $PsErr != 0
    423             SetErrors
    424         ${EndIf}
    425         StrCpy $1 45
    426         Call CheckForError
    427 
    428     # Else, running on a 32-bit OS machine
    429     ${Else}
    430 
    431         # 32-bit DLLs/EXEs destined for SysWOW64
    432         ##########################################
    433         SetOutPath $WINDIR\System32
    434         File /oname=vulkan-$FileVersion.dll ..\build32\loader\Release\vulkan-${VERSION_ABI_MAJOR}.dll
    435         StrCpy $1 50
    436         Call CheckForError
    437 
    438         # vulkaninfo.exe
    439         File /oname=vulkaninfo-$FileVersion.exe ..\build32\demos\Release\vulkaninfo.exe
    440         SetOutPath "$INSTDIR"
    441         File ..\build32\demos\Release\vulkaninfo.exe
    442         StrCpy $1 55
    443         Call CheckForError
    444 
    445         # Run the ConfigLayersAndVulkanDLL.ps1 script to copy the most recent version of
    446         # vulkan-<abimajor>-*.dll to vulkan-<abimajor>.dll, and to set up layer registry
    447         # entries to use layers from the corresponding SDK
    448         nsExec::ExecToStack 'powershell -NoLogo -NonInteractive -WindowStyle Hidden -inputformat none -ExecutionPolicy RemoteSigned -File ConfigLayersAndVulkanDLL.ps1 ${VERSION_ABI_MAJOR} 32'
    449         pop $PsErr
    450         ${If} $PsErr != 0
    451             SetErrors
    452         ${EndIf}
    453         StrCpy $1 60
    454         Call CheckForError
    455 
    456     ${Endif}
    457 
    458     # We are done using ConfigLayersAndVulkanDLL.ps1, delete it. It will be re-installed
    459     # by the uninstaller when it needs to be run again during uninstall.
    460     Delete ConfigLayersAndVulkanDLL.ps1
    461 
    462     # Add vulkaninfo to Start Menu
    463     SetShellVarContext all
    464     IfFileExists $WINDIR\System32\vulkaninfo.exe 0 +2
    465         CreateShortCut "$SMPROGRAMS\Vulkan\vulkaninfo.lnk" "$WINDIR\System32\vulkaninfo.exe"
    466     IfFileExists $WINDIR\SysWow64\vulkaninfo.exe 0 +2
    467         CreateShortCut "$SMPROGRAMS\Vulkan\vulkaninfo32.lnk" "$WINDIR\SysWow64\vulkaninfo.exe"
    468 
    469     # Possibly install MSVC 2013 redistributables
    470     ClearErrors
    471     ${If} ${RunningX64}
    472         ReadRegDword $1 HKLM "SOFTWARE\WOW6432Node\Microsoft\DevDiv\vc\Servicing\12.0\RuntimeMinimum" "Install"
    473         ${If} ${Errors}
    474            StrCpy $1 0
    475            ClearErrors
    476         ${Endif}
    477     ${Else}
    478        StrCpy $1 1
    479     ${Endif}
    480     ReadRegDword $2 HKLM "SOFTWARE\Microsoft\DevDiv\vc\Servicing\12.0\RuntimeMinimum" "Install"
    481     ${If} ${Errors}
    482        StrCpy $2 0
    483        ClearErrors
    484     ${Endif}
    485     IntOp $3 $1 + $2
    486     ${If} $3 <= 1
    487         # If either x86 or x64 redistributables are not present, install redistributables.
    488         # We install both resdistributables because we have found that the x86 redist
    489         # will uninstall the x64 redist if the x64 redistrib is an old version. Amazing, isn't it?
    490         SetOutPath "$TEMP\VulkanRT"
    491         ${If} ${RunningX64}
    492             File vcredist_x64.exe
    493             ExecWait '"$TEMP\VulkanRT\vcredist_x64.exe"  /quiet /norestart'
    494         ${Endif}
    495         File vcredist_x86.exe
    496         ExecWait '"$TEMP\VulkanRT\vcredist_x86.exe"  /quiet /norestart'
    497     ${Endif}
    498     StrCpy $1 65
    499     Call CheckForError
    500 
    501 SectionEnd
    502 
    503 # Uninstaller section start
    504 !ifdef UNINSTALLER
    505 Section "uninstall"
    506 
    507     # If running on a 64-bit OS machine, disable registry re-direct since we're running as a 32-bit executable.
    508     ${If} ${RunningX64}
    509 
    510         ${DisableX64FSRedirection}
    511         SetRegView 64
    512 
    513     ${Endif}
    514 
    515     # Look up the install dir and remove files from that directory.
    516     # We do this so that the uninstaller can be run from any directory.
    517     ReadRegStr $0 HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCTNAME}${PRODUCTVERSION}" "InstallDir"
    518     StrCpy $IDir $0
    519 
    520     StrCpy $1 70
    521     Call un.CheckForError
    522 
    523     SetOutPath "$IDir"
    524 
    525     # Set up version number for file names
    526     ${StrRep} $0 ${VERSION_BUILDNO} "." "-"
    527     StrCpy $FileVersion ${VERSION_ABI_MAJOR}-${VERSION_API_MAJOR}-${VERSION_MINOR}-${VERSION_PATCH}-$0
    528 
    529     # Decrement the number of times we have been installed.
    530     ReadRegDword $IC HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCTNAME}${PRODUCTVERSION}" "InstallCount"
    531     IntOp $1 $IC - 1
    532     WriteRegDword HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCTNAME}${PRODUCTVERSION}" "InstallCount" $1
    533 
    534     # Rename the install dir for this instance if is not the last uninstall
    535     ${If} $IC > 2
    536         IntOp $1 $IC - 1
    537         Rename "$IDir\Instance_$IC" "$IDir\Instance_$1"
    538     ${ElseIf} $IC = 2
    539         Delete /REBOOTOK "$IDir\Instance_$IC\Uninstall${PRODUCTNAME}.exe"
    540         Rmdir /REBOOTOK "$IDir\Instance_$IC"
    541     ${Endif}
    542 
    543     # Modify registry for Programs and Features
    544 
    545     ${If} $IC > 1
    546         DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCTNAME}${PRODUCTVERSION}-$IC"
    547     ${EndIf}
    548     ${If} $IC > 2
    549         IntOp $IC $IC - 1
    550         WriteRegDword HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCTNAME}${PRODUCTVERSION}-$IC" "SystemComponent" 0
    551     ${ElseIf} $IC = 2
    552         WriteRegDword HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCTNAME}${PRODUCTVERSION}" "SystemComponent" 0
    553     ${Else}
    554         # Last uninstall
    555         IntOp $IC $IC - 1
    556         DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCTNAME}${PRODUCTVERSION}"
    557     ${EndIf}
    558 
    559 
    560     # Install the ConfigLayersAndVulkanDLL.ps1 so we can run it.
    561     # It will be deleted later when we remove the install directory.
    562     File ConfigLayersAndVulkanDLL.ps1
    563 
    564     # If running on a 64-bit OS machine
    565     ${If} ${RunningX64}
    566 
    567         # Delete vulkaninfo.exe in C:\Windows\System32 and C:\Windows\SysWOW64
    568         Delete /REBOOTOK $WINDIR\SysWow64\vulkaninfo.exe
    569         Delete /REBOOTOK "$WINDIR\SysWow64\vulkaninfo-$FileVersion.exe"
    570         Delete /REBOOTOK $WINDIR\System32\vulkaninfo.exe
    571         Delete /REBOOTOK "$WINDIR\System32\vulkaninfo-$FileVersion.exe"
    572 
    573         # Delete vullkan dll files: vulkan-<majorabi>.dll and vulkan-<majorabi>-<major>-<minor>-<patch>-<buildno>.dll
    574         Delete /REBOOTOK $WINDIR\SysWow64\vulkan-${VERSION_ABI_MAJOR}.dll
    575         Delete /REBOOTOK $WINDIR\SysWow64\vulkan-$FileVersion.dll
    576         Delete /REBOOTOK $WINDIR\System32\vulkan-${VERSION_ABI_MAJOR}.dll
    577         Delete /REBOOTOK $WINDIR\System32\vulkan-$FileVersion.dll
    578 
    579         # Run the ConfigLayersAndVulkanDLL.ps1 script to:
    580         #   Copy the most recent version of vulkan-<abimajor>-*.dll to vulkan-<abimajor>.dll
    581         #   Copy the most recent version of vulkaninfo-<abimajor>-*.exe to vulkaninfo.exe
    582         #   Set up layer registry entries to use layers from the corresponding SDK
    583         nsExec::ExecToStack 'powershell -NoLogo -NonInteractive -WindowStyle Hidden -inputformat none -ExecutionPolicy RemoteSigned -File "$IDir\ConfigLayersAndVulkanDLL.ps1" ${VERSION_ABI_MAJOR} 64'
    584 
    585     # Else, running on a 32-bit OS machine
    586     ${Else}
    587 
    588         # Delete vulkaninfo.exe in C:\Windows\System32
    589         Delete /REBOOTOK $WINDIR\System32\vulkaninfo.exe
    590         Delete /REBOOTOK "$WINDIR\System32\vulkaninfo-$FileVersion.exe"
    591 
    592         # Delete vullkan dll files: vulkan-<majorabi>.dll and vulkan-<majorabi>-<major>-<minor>-<patch>-<buildno>.dll
    593         Delete /REBOOTOK $WINDIR\System32\vulkan-${VERSION_ABI_MAJOR}.dll
    594         Delete /REBOOTOK $WINDIR\System32\vulkan-$FileVersion.dll
    595 
    596         # Run the ConfigLayersAndVulkanDLL.ps1 script to:
    597         #   Copy the most recent version of vulkan-<abimajor>-*.dll to vulkan-<abimajor>.dll
    598         #   Copy the most recent version of vulkaninfo-<abimajor>-*.exe to vulkaninfo.exe
    599         #   Set up layer registry entries to use layers from the corresponding SDK
    600         nsExec::ExecToStack 'powershell -NoLogo -NonInteractive -WindowStyle Hidden -inputformat none -ExecutionPolicy RemoteSigned -File "$IDir\ConfigLayersAndVulkanDLL.ps1" ${VERSION_ABI_MAJOR} 32'
    601 
    602     ${EndIf}
    603 
    604     # If Ref Count is zero, uninstall everything
    605     ${If} $IC <= 0
    606 
    607         # Delete vulkaninfo from start menu.
    608         SetShellVarContext all
    609         Delete "$SMPROGRAMS\Vulkan\vulkaninfo.lnk"
    610 
    611         # If running on a 64-bit OS machine
    612         ${If} ${RunningX64}
    613             Delete "$SMPROGRAMS\Vulkan\vulkaninfo32.lnk"
    614         ${EndIf}
    615 
    616         # Possibly add vulkaninfo to Start Menu
    617         SetShellVarContext all
    618         IfFileExists $WINDIR\System32\vulkaninfo.exe 0 +2
    619             CreateShortCut "$SMPROGRAMS\Vulkan\vulkaninfo.lnk" "$WINDIR\System32\vulkaninfo.exe"
    620         IfFileExists $WINDIR\SysWow64\vulkaninfo.exe 0 +2
    621             CreateShortCut "$SMPROGRAMS\Vulkan\vulkaninfo32.lnk" "$WINDIR\SysWow64\vulkaninfo.exe"
    622 
    623         # Possibly delete vulkan Start Menu
    624         StrCpy $0 "$SMPROGRAMS\Vulkan"
    625         Call un.DeleteDirIfEmpty
    626         ClearErrors
    627 
    628         # Remove files in install dir
    629         Delete /REBOOTOK "$IDir\VULKANRT_LICENSE.rtf"
    630         Delete /REBOOTOK "$IDir\LICENSE.txt"
    631         Delete /REBOOTOK "$IDir\Uninstall${PRODUCTNAME}.exe"
    632         Delete /REBOOTOK "$IDir\V.ico"
    633         Delete /REBOOTOK "$IDir\ConfigLayersAndVulkanDLL.ps1"
    634         Delete /REBOOTOK "$IDir\vulkaninfo.exe"
    635 
    636         # If running on a 64-bit OS machine
    637         ${If} ${RunningX64}
    638             Delete /REBOOTOK "$IDir\vulkaninfo32.exe"
    639         ${EndIf}
    640 
    641         StrCpy $1 75
    642         Call un.CheckForError
    643 
    644         # Need to do a SetOutPath to something outside of install dir,
    645         # or the uninstall will think install dir is busy
    646         SetOutPath "$TEMP"
    647 
    648         # Remove install directories
    649         StrCpy $0 "$IDir"
    650         Call un.DeleteDirIfEmpty
    651         StrCpy $0 "$PROGRAMFILES\${PRODUCTNAME}"
    652         Call un.DeleteDirIfEmpty
    653         ClearErrors
    654 
    655         # If any of the remove commands failed, request a reboot
    656         IfRebootFlag 0 noreboot
    657             MessageBox MB_YESNO "A reboot is required to finish the uninstall. Do you wish to reboot now?" /SD IDNO IDNO returnerror
    658             Reboot
    659 
    660             returnerror:
    661 
    662             # Set an error message to output because we should reboot but didn't (whether because silent uninstall or user choice)
    663             SetErrorLevel 3 # ERROR_TOO_MANY_OPEN_FILES
    664 
    665         noreboot:
    666 
    667     ${Endif}
    668 
    669     StrCpy $1 80
    670     Call un.CheckForError
    671 
    672     # Remove temp dir
    673     SetOutPath "$TEMP"
    674     RmDir /R "$TEMP\VulkanRT"
    675 
    676 SectionEnd
    677 !endif
    678 
    679 Function brandimage
    680   SetOutPath "$TEMP"
    681   SetFileAttributes V.bmp temporary
    682   File V.bmp
    683   SetBrandingImage "$TEMP/V.bmp"
    684 Functionend
    685 
    686 
    687 Function un.brandimage
    688   SetOutPath "$TEMP"
    689   SetFileAttributes V.bmp temporary
    690   File V.bmp
    691   SetBrandingImage "$TEMP/V.bmp"
    692 Functionend
    693 
    694 Function un.DeleteDirIfEmpty
    695   FindFirst $R0 $R1 "$0\*.*"
    696   strcmp $R1 "." 0 NoDelete
    697    FindNext $R0 $R1
    698    strcmp $R1 ".." 0 NoDelete
    699     ClearErrors
    700     FindNext $R0 $R1
    701     IfErrors 0 NoDelete
    702      FindClose $R0
    703      Sleep 1000
    704      RMDir "$0"
    705   NoDelete:
    706    FindClose $R0
    707 FunctionEnd
    708 
    709 # Check for errors during install.  If we hit an error, stop, uninstall what we've put in so far, and quit.
    710 # NOTE: We return a non-zero error code as well.
    711 Function CheckForError
    712     ${If} ${Errors}
    713         # IHV's using this install may want no message box.
    714         MessageBox MB_OK|MB_ICONSTOP "${errorMessage1}${errorMessage2}Errorcode: $1$\r$\n" /SD IDOK
    715 
    716         # Copy the uninstaller to a temp folder of our own creation so we can completely
    717         # delete the old contents.
    718         SetOutPath "$TEMP\VulkanRT"
    719         CopyFiles "$INSTDIR\Uninstall${PRODUCTNAME}.exe" "$TEMP\VulkanRT"
    720 
    721         # No uninstall using the version in the temporary folder.
    722         ExecWait '"$TEMP\VulkanRT\Uninstall${PRODUCTNAME}.exe" /S _?=$INSTDIR'
    723 
    724         # Delete the copy of the uninstaller we ran
    725         Delete /REBOOTOK "$TEMP\VulkanRT\Uninstall${PRODUCTNAME}.exe"
    726         RmDir /R /REBOOTOK "$TEMP\VulkanRT"
    727 
    728         # Set an error message to output
    729         SetErrorLevel $1
    730 
    731         Quit
    732     ${EndIf}
    733 FunctionEnd
    734 
    735 # Check for errors during uninstall.  If we hit an error, don't attempt
    736 # to do anything. Just set a non-zero return code and quit.
    737 Function un.CheckForError
    738     ${If} ${Errors}
    739         # IHV's using this install may want no message box.
    740         MessageBox MB_OK|MB_ICONSTOP "${errorMessage1un}${errorMessage2}Errorcode: $1$\r$\n" /SD IDOK
    741 
    742         # Set an error message to output
    743         SetErrorLevel $1
    744 
    745         Quit
    746     ${EndIf}
    747 FunctionEnd
    748