winrtinstaller: Add logging support to Windows Runtime Installer
diff --git a/windowsRuntimeInstaller/ConfigLayersAndVulkanDLL.ps1 b/windowsRuntimeInstaller/ConfigLayersAndVulkanDLL.ps1
index 9a6665d..dcbf257 100644
--- a/windowsRuntimeInstaller/ConfigLayersAndVulkanDLL.ps1
+++ b/windowsRuntimeInstaller/ConfigLayersAndVulkanDLL.ps1
@@ -46,6 +46,13 @@
[int]$ossize
)
+# Start logging
+$log=$Env:Temp+"\VulkanRT"
+New-Item -ItemType Directory -Force -Path $log | Out-Null
+$log=$log+"\ConfigLayersAndVulkanDLL.log"
+echo "ConfigLayersAndVulkanDLL.ps1 $majorabi $ossize" >$log
+(Get-Date).ToString() >>$log
+
$vulkandll = "vulkan-"+$majorabi+".dll"
$windrive = $env:SYSTEMDRIVE
$winfolder = $env:SYSTEMROOT
@@ -93,6 +100,8 @@
function UpdateVulkanSysFolder([string]$dir, [int]$writeSdkName)
{
+ echo "UpdateVulkanSysFolder $dir $writeSdkName" >>$log
+
# Push the current path on the stack and go to $dir
Push-Location -Path $dir
@@ -100,9 +109,10 @@
# First Initialize the list to empty
$script:VulkanDllList = @()
- # Find all DLL objects in this directory
+ # Find all vulkan dll files in this directory
dir -name vulkan-$majorabi-*.dll |
ForEach-Object {
+ echo "File $_" >>$log
if ($_ -match "=" -or
$_ -match "@" -or
$_ -match " " -or
@@ -112,8 +122,18 @@
# If a file name contains "=", "@", or " ", or it contains less then 5 dashes or more than
# 7 dashes, it wasn't installed by the Vulkan Run Time.
# Note that we need to use return inside of ForEach-Object is to continue with iteration.
+ echo "Rejected $_ - bad format" >>$log
return
}
+
+ # If the corresponding vulkaninfo is not present, it wasn't installed by the Vulkan Run Time
+ $vulkaninfo=$_ -replace ".dll",".exe"
+ $vulkaninfo=$vulkaninfo -replace "vulkan","vulkaninfo"
+ if (-not (Test-Path $vulkaninfo)) {
+ echo "Rejected $_ - vulkaninfo not present" >>$log
+ return
+ }
+
$major=$_.Split('-')[2]
$majorOrig=$major
$minor=$_.Split('-')[3]
@@ -155,14 +175,30 @@
$prebuildno="z"*10
}
}
+ echo "Version $majorOrig $minorOrig $patchOrig $buildnoOrig $prereleaseOrig $prebuildnoOrig" >>$log
# Make sure fields that are supposed to be numbers are numbers
- if (notNumeric($major)) {return}
- if (notNumeric($minor)) {return}
- if (notNumeric($patch)) {return}
- if (notNumeric($buildno)) {return}
+ if (notNumeric($major)) {
+ echo "Rejected $_ - bad major" >>$log
+ return
+ }
+ if (notNumeric($minor)) {
+ echo "Rejected $_ - bad minor" >>$log
+ return
+ }
+ if (notNumeric($patch)) {
+ echo "Rejected $_ - bad patch" >>$log
+ return
+ }
+ if (notNumeric($buildno)) {
+ echo "Rejected $_ - bad buildno" >>$log
+ return
+ }
if (notNumeric($prebuildno)) {
- if ($prebuildno -ne "z"*10) {return}
+ if ($prebuildno -ne "z"*10) {
+ echo "Rejected $_ - bad prebuildno" >>$log
+ return
+ }
}
$major = $major.padleft(10,'0')
@@ -173,6 +209,7 @@
$prebuildno = $prebuildno.padleft(10,'0')
# Add a new element to the $VulkanDllList array
+ echo "Adding $_ to Vulkan dll list " >>$log
$script:VulkanDllList+="$major=$minor=$patch=$buildno=$prerelease=$prebuildno= $_ @$majorOrig@$minorOrig@$patchOrig@$buildnoOrig@$prereleaseOrig@$prebuildnoOrig@"
}
@@ -188,12 +225,14 @@
# The most recent vulkanDLL is the second word in the last element of the
# sorted $VulkanDllList. Copy it to $vulkandll.
$mrVulkanDll=$script:VulkanDllList[-1].Split(' ')[1]
+ echo "copy $mrVulkanDll $vulkandll" >>$log
copy $mrVulkanDll $vulkandll
# Copy the most recent version of vulkaninfo-<abimajor>-*.exe to vulkaninfo.exe.
# We create the source file name for the copy from $mrVulkanDll.
$mrVulkaninfo=$mrVulkanDll -replace ".dll",".exe"
$mrVulkaninfo=$mrVulkaninfo -replace "vulkan","vulkaninfo"
+ echo "copy $mrVulkaninfo vulkaninfo.exe" >>$log
copy $mrVulkaninfo vulkaninfo.exe
# Create the name used in the registry for the SDK associated with $mrVulkanDll.
@@ -211,6 +250,7 @@
if ($prebuildno -ne "") {
$sdktempname=$sdktempname + "." + $prebuildno
}
+ echo "sdkname = $sdktempname" >>$log
}
# Return to our previous folder
@@ -227,14 +267,17 @@
# We only care about SYSWOW64 if we're targeting a 64-bit OS
if ($ossize -eq 64) {
# Update the SYSWOW64 Vulkan DLLS/EXEs
+ echo "Calling UpdateVulkanSysFolder $winfolder\SYSWOW64 0" >>$log
UpdateVulkanSysFolder $winfolder\SYSWOW64 0
}
# Update the SYSTEM32 Vulkan DLLS/EXEs
+echo "Calling UpdateVulkanSysFolder $winfolder\SYSTEM32 1" >>$log
UpdateVulkanSysFolder $winfolder\SYSTEM32 1
# Create an array of vulkan sdk install dirs
+echo "Creating array of of Vulkan SDK Install dirs" >>$log
$mrVulkanDllInstallDir=""
$VulkanSdkDirs=@()
Get-ChildItem -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall |
@@ -245,9 +288,11 @@
$tmp=Get-ItemProperty -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$regkey -Name UninstallString
$tmp=$tmp -replace "\\Uninstall.exe.*",""
$tmp=$tmp -replace ".*=.",""
+ echo "Adding $tmp to VulkanSDKDirs" >>$log
$VulkanSdkDirs+=$tmp
if ($regkey -eq $script:sdkname) {
# Save away the sdk install dir for the the most recent vulkandll
+ echo "Setting mrVulkanDllInstallDir to $tmp" >>$log
$mrVulkanDllInstallDir=$tmp
}
}
@@ -257,7 +302,9 @@
# Search list of sdk install dirs for an sdk compatible with $script:sdkname.
# We go backwards through VulkanDllList to generate SDK names, because we want the most recent SDK.
if ($mrVulkanDllInstallDir -eq "") {
+ echo "Searching VulkanDllList" >>$log
ForEach ($idx in ($script:VulkanDllList.Length-1)..0) {
+ $tmp=$script:VulkanDllList[$idx]
$vulkanDllMajor=$script:VulkanDllList[$idx].Split('@')[1]
$vulkanDllMinor=$script:VulkanDllList[$idx].Split('@')[2]
$vulkanDllPatch=$script:VulkanDllList[$idx].Split('@')[3]
@@ -271,6 +318,7 @@
if ($vulkanDllPrebuildno) {
$regEntry=$regEntry+"."+$vulkanDllPrebuildno
}
+ echo "Comparing $regEntry" >>$log
$rval=Get-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$regEntry -ErrorAction SilentlyContinue
$instDir=$rval
$instDir=$instDir -replace "\\Uninstall.exe.*",""
@@ -282,6 +330,7 @@
$reMinor=$rval.Split('.')[1]
$rePatch=$rval.Split('.')[2]
if ($reMajor+$reMinor+$rePatch -eq $vulkanDllMajor+$vulkanDllMinor+$vulkanDllPatch) {
+ echo "Setting mrVulkanDllInstallDir to $instDir" >>$log
$mrVulkanDllInstallDir=$instDir
break
}
@@ -304,12 +353,14 @@
# Note that we remove only those entries created by Vulkan SDKs. If other
# layers were installed that are not from an SDK, we don't mess with them.
+echo "Removing old layer registry entries from HKLM\SOFTWARE\Khronos\Vulkan\ExplicitLayers" >>$log
Get-Item -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Khronos\Vulkan\ExplicitLayers | Select-Object -ExpandProperty Property |
ForEach-Object {
$regval=$_
ForEach ($sdkdir in $VulkanSdkDirs) {
if ($regval -like "$sdkdir\*.json") {
Remove-ItemProperty -ErrorAction SilentlyContinue -Path HKLM:\SOFTWARE\Khronos\Vulkan\ExplicitLayers -name $regval
+ echo "Removed registry entry $regval" >>$log
}
}
}
@@ -321,6 +372,7 @@
ForEach ($sdkdir in $VulkanSdkDirs) {
if ($regval -like "$sdkdir\*.json") {
Remove-ItemProperty -ErrorAction SilentlyContinue -Path HKLM:\SOFTWARE\WOW6432Node\Khronos\Vulkan\ExplicitLayers -name $regval
+ echo "Removed WOW6432Node registry entry $regval" >>$log
}
}
}
@@ -329,6 +381,7 @@
# Create layer registry entries associated with Vulkan SDK from which $mrVulkanDll is from
+echo "Creating new layer registry entries in HKLM\SOFTWARE\Khronos\Vulkan\ExplicitLayers" >>$log
if ($mrVulkanDllInstallDir -ne "") {
if ($ossize -eq 64) {
@@ -337,6 +390,7 @@
Get-ChildItem $mrVulkanDllInstallDir\Bin -Filter VkLayer*json |
ForEach-Object {
New-ItemProperty -Path HKLM:\SOFTWARE\Khronos\Vulkan\ExplicitLayers -Name $mrVulkanDllInstallDir\Bin\$_ -PropertyType DWord -Value 0 | out-null
+ echo "Created registry entry for $mrVulkanDllInstallDir\Bin\$_" >>$log
}
# Create registry entires for the WOW6432Node registry location for 32-bit items on a 64-bit OS
@@ -344,6 +398,7 @@
Get-ChildItem $mrVulkanDllInstallDir\Bin32 -Filter VkLayer*json |
ForEach-Object {
New-ItemProperty -Path HKLM:\SOFTWARE\WOW6432Node\Khronos\Vulkan\ExplicitLayers -Name $mrVulkanDllInstallDir\Bin32\$_ -PropertyType DWord -Value 0 | out-null
+ echo "Created WOW6432Node registry entry for $mrVulkanDllInstallDir\Bin32\$_" >>$log
}
} else {
@@ -353,16 +408,22 @@
Get-ChildItem $mrVulkanDllInstallDir\Bin32 -Filter VkLayer*json |
ForEach-Object {
New-ItemProperty -Path HKLM:\SOFTWARE\Khronos\Vulkan\ExplicitLayers -Name $mrVulkanDllInstallDir\Bin32\$_ -PropertyType DWord -Value 0 | out-null
+ echo "Created registry entry for $mrVulkanDllInstallDir\Bin\$_" >>$log
}
}
}
+echo "ConfigLayersAndVulkanDLL.ps1 completed" >>$log
+(Get-Date).ToString() >>$log
+
+
+
# SIG # Begin signature block
# MIIcZgYJKoZIhvcNAQcCoIIcVzCCHFMCAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB
# gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR
-# AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUdeZMvyfevbCm2d9Sn02g0L39
-# 6EKggheVMIIFHjCCBAagAwIBAgIQDmYEpPtQ2iBY4vC2AGq6uzANBgkqhkiG9w0B
+# AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUXAaVuJRboqiwfHon/TJIXS0m
+# ohqggheVMIIFHjCCBAagAwIBAgIQDmYEpPtQ2iBY4vC2AGq6uzANBgkqhkiG9w0B
# AQsFADByMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYD
# VQQLExB3d3cuZGlnaWNlcnQuY29tMTEwLwYDVQQDEyhEaWdpQ2VydCBTSEEyIEFz
# c3VyZWQgSUQgQ29kZSBTaWduaW5nIENBMB4XDTE1MDQzMDAwMDAwMFoXDTE2MDcw
@@ -493,22 +554,22 @@
# QTIgQXNzdXJlZCBJRCBDb2RlIFNpZ25pbmcgQ0ECEA5mBKT7UNogWOLwtgBqursw
# CQYFKw4DAhoFAKB4MBgGCisGAQQBgjcCAQwxCjAIoAKAAKECgAAwGQYJKoZIhvcN
# AQkDMQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEOMAwGCisGAQQBgjcCARUw
-# IwYJKoZIhvcNAQkEMRYEFCQBfl/Xm3/R6yW/EO6kbSmkdowDMA0GCSqGSIb3DQEB
-# AQUABIIBADCbC3HqswOLfqwjX9+TM0hW9sG02WMHPbz0fFBTH5J/tck4wZECl9ct
-# DK0pUzHoJBY9EuBnH9OD46MiVCIYwYHQ9w/xiaypUNRbfXYEwSVL9EXCIcYkkqAN
-# pSpDrQJu0TzmGyvN1fSvYj/qahvIVKz/cxbzzQbYl4NqNXRfiD26Pa5JOdNABP8g
-# WL5Ruk/MPvMJE0dIW3em40hoanGKQhP0xgQ/BGJygumYrZsigENfhQkRVngH/aUP
-# f5k78VKL3DFoCMmneIxAfIwspTC37izb/AjlqDNUbqEmfBBIsbLgu6teZVIyPBI/
-# nktk5kwOOhzuyeQxLAcn0z+8ToF5frKhggIPMIICCwYJKoZIhvcNAQkGMYIB/DCC
+# IwYJKoZIhvcNAQkEMRYEFLzB0lbx2Z662b5ESDWLj98ew1UOMA0GCSqGSIb3DQEB
+# AQUABIIBADsR0P8QxSNCPshQFDxK9Ezsrk25HyGM9a0SZOaGrL8ZSSZ6PY8Wz/bQ
+# i2we//wLD31wkdzj/VKBdFHTvheQiA3b094RcC+Ii3VsH4esb6gSBVEnfX0Iu5ZJ
+# o9k1L5CNS9nhJ+ydgKFmDS6R3MUCZi613yZpCe9ZFqsgf9UP/gQiZSC29es7WnaX
+# OtPrz5OAO/JTNFDnTO9d+rg/iYeN4ybDtuSp0j6fKQ/DPesmE/MZpcfD+kiRtY9u
+# x7o8IVv/lq0+5sRTaBogeauXVhEaA37jZdo0IbwESl8YvaHj2zstRBcT8AxMuGBW
+# H/FjShnOONEAPrFyFoPi8CFrXbrqJkahggIPMIICCwYJKoZIhvcNAQkGMYIB/DCC
# AfgCAQEwdjBiMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkw
# FwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBBc3N1
# cmVkIElEIENBLTECEAMBmgI6/1ixa9bV6uYX8GYwCQYFKw4DAhoFAKBdMBgGCSqG
-# SIb3DQEJAzELBgkqhkiG9w0BBwEwHAYJKoZIhvcNAQkFMQ8XDTE2MDMyMjIwMjM0
-# N1owIwYJKoZIhvcNAQkEMRYEFM6NeSjPd00j7j25copMrjENL7GXMA0GCSqGSIb3
-# DQEBAQUABIIBAHJbUlt2mxIX5hbiigRw3kIoug57G5sDYWQK8rcTjHUif6PAdEqj
-# 5c1UhxQHJxEasddUAqbEtCsG8qiz1lq76KKiwaWxffSRQ2JwjYEvnYQ2TK9rtnMs
-# zeYnQajrIUP44z7ysqoikB0bEgup0QVDScm4SSa1SmqQzHMsUX5rCygsM3PlpF5K
-# dH2u3eSK4zDhGiye6/SQkcddvsI2lLFRcxQIyfUD4+W9oFdXuYkKhNBGPLUlOH9V
-# DEDQG9zH6CAzvla/r1iYnX8RZ4rz7yacdrMBq5g92HAEcuXFTBQfaeAZSGQBhNSn
-# p1rVWgLb0T3a/5zlOtZvp+bLyDRbms+w8BY=
+# SIb3DQEJAzELBgkqhkiG9w0BBwEwHAYJKoZIhvcNAQkFMQ8XDTE2MDMyOTE5NDM0
+# NlowIwYJKoZIhvcNAQkEMRYEFBarBhBOgDzXlhQxxNXSfB14mBngMA0GCSqGSIb3
+# DQEBAQUABIIBACWObtn5lJ8laqfd55xT4EfWbvmPGV04c/CkDF6ziecEQxhCxUYi
+# rw8kV8nEhYa79qE5p3EXe+aZflRo70t21sr3s8GNHUW98pc0goIaC5rKzOVT3X0x
+# VH870qjVWdGMRRTUXlryBAQRv3LL93GyMIL1g1Y4uYKEU9PyrC8L26bsrGQggQEy
+# KxL0hopMSUNNE8glc1nbe/FGDylkHyi33qwNaz0buVLr7xCZQTpIecXat1mfvzPn
+# gsSr3+u9086Asz0QEbVmskhzFLSdd6QKpWjwYXWoyeFqrKlPdL4InHhRKFsEA8fQ
+# xV5A7ORVrXHOpPd+ZUrIhaggYDBqFiGWfmA=
# SIG # End signature block
diff --git a/windowsRuntimeInstaller/InstallerRT.nsi b/windowsRuntimeInstaller/InstallerRT.nsi
index a0291a7..791b9b5 100644
--- a/windowsRuntimeInstaller/InstallerRT.nsi
+++ b/windowsRuntimeInstaller/InstallerRT.nsi
@@ -237,6 +237,13 @@
# Start default section
Section
+ # Turn on logging
+ LogSet on
+
+ # Remove contents of temp dir
+ SetOutPath "$TEMP\VulkanRT"
+ RmDir /R "$TEMP\VulkanRT"
+
# If running on a 64-bit OS machine, disable registry re-direct since we're running as a 32-bit executable.
${If} ${RunningX64}
@@ -498,12 +505,23 @@
StrCpy $1 65
Call CheckForError
+ # Finish logging and move log file to TEMP dir
+ LogSet off
+ Rename "$INSTDIR\install.log" "$TEMP\VulkanRT\Install.log"
+
SectionEnd
# Uninstaller section start
!ifdef UNINSTALLER
Section "uninstall"
+ # Turn on logging
+ LogSet on
+
+ # Remove contents of temp dir
+ SetOutPath "$TEMP\VulkanRT"
+ RmDir /R "$TEMP\VulkanRT"
+
# If running on a 64-bit OS machine, disable registry re-direct since we're running as a 32-bit executable.
${If} ${RunningX64}
@@ -669,9 +687,9 @@
StrCpy $1 80
Call un.CheckForError
- # Remove temp dir
- SetOutPath "$TEMP"
- RmDir /R "$TEMP\VulkanRT"
+ # Finish logging and move log file to TEMP dir
+ LogSet off
+ Rename "$INSTDIR\install.log" "$TEMP\VulkanRT\Uninstall.log"
SectionEnd
!endif
@@ -713,6 +731,10 @@
# 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\install.log"
+
# Copy the uninstaller to a temp folder of our own creation so we can completely
# delete the old contents.
SetOutPath "$TEMP\VulkanRT"
@@ -742,6 +764,11 @@
# Set an error message to output
SetErrorLevel $1
+ # Finish logging and move log file to TEMP dir
+ LogSet off
+ Delete "$TEMP\VulkanRT\Uninstall.log"
+ Rename "$INSTDIR\install.log" "$TEMP\VulkanRT\Uninstall.log"
+
Quit
${EndIf}
FunctionEnd
diff --git a/windowsRuntimeInstaller/README.txt b/windowsRuntimeInstaller/README.txt
index 73f8254..d1833a8 100644
--- a/windowsRuntimeInstaller/README.txt
+++ b/windowsRuntimeInstaller/README.txt
@@ -3,8 +3,15 @@
To build the Vulkan Runtime Installer:
- 1. Install Nullsoft Install System version 3.0b1 or greater. (Available
- from http://nsis.sourceforge.net/Download.)
+ 1. Install Nullsoft Install System (NSIS) version 3.0b1 or greater. The
+ version of NSIS needed for building the Vulkan Runtime Installer
+ must support logging (i.e. must have been built with NSIS_CONFIG_LOG=yes
+ set), and must support long strings (i.e. NSIS_MAX_STRLEN=8192 must be
+ set). Note that the NSIS binary version available at
+ http://nsis.sourceforge.net/Download does not have these enabled. You
+ may have to build NSIS yourself with these flags set - see
+ http://nsis//sourceforge.net/Docs/AppendixG.html for information on
+ building NSIS.
2. Install the NSIS AccessControl plug-in. (Available from
http://nsis.sourceforge.net/AccessControl_plug-in.)
@@ -109,3 +116,10 @@
This ProductVersion should always be identical to <version> in:
HKLM\Software\Microsoft\Windows\CurrentVersion\Uininstall\VulkanRT<version>\UinstalString
+
+ o The Installer and Uninstaller create log files, which can be
+ found in the VulkanrRT folder in the current TEMP folder.
+ (The TEMP folder is generally identified by the TEMP environment
+ variable). In addition to installer/uninstaller logs files,
+ the folder also contains a log from the last run of the
+ ConfigLayersAndVulkanDLL.ps1 script.