# 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>
#


# This Powershell script is used by the Vulkan Run Time Installer/Uninstaller to:
#   - Copy the most recent vulkan-<majorabi>-*.dll in C:\Windows\System32
#     to vulkan-<majorabi>.dll
#   - Copy the most recent version of vulkaninfo-<abimajor>-*.exe in
#     C:\Windows\System32 to vulkaninfo.exe
#   - The same thing is done for those files in C:\Windows\SysWOW64 on a 64-bit
#     target.
#   - Set the layer registry entries to point to the layer json files
#     in the Vulkan SDK associated with the most recent vulkan*dll.
#
# This script can be called with the following two parameters:
#   $majorabi : a single string number specifying the major abi version.
#   $ossize     : an integer indicating if the target is a 64 (64) or 32 (32) bit OS.
#

# majorabi and ossize are either prepended to this script or specificied as args
Param(
 [string]$majorabiarg,
 [int]$ossizearg
)
if ($majorabi -eq $null) {
    $majorabi=$majorabiarg
}
if ($ossize -eq $null) {
    $ossize=$ossizearg
}

function WriteToLog ($x) {
    echo $x | Out-File -encoding ascii -append -filepath $script:log
}

function notNumeric ($x) {
    try {
        0 + $x | Out-Null
        return $false
    } catch {
        return $true
    }
}

function setScriptReturnValue($rvalue) {
    if ($script:scriptReturnValue -eq 0) {
        $script:scriptReturnValue = $rvalue
    }
}

# Clear any pre-existing errors and set default return value
$Error.Clear();
$script:scriptReturnValue=0

# Start logging
$script:log=$Env:Temp+"\ConfigLayersAndVulkanDLL.log"
Remove-Item $script:log

# Ignore errors related to log file
$Error.Clear();

WriteToLog "ConfigLayersAndVulkanDLL.ps1 called with inputs of : $majorabi $ossize"
$startTime=Get-Date
WriteToLog "Start time : $startTime"
WriteToLog "Poweshell Version information:"
WriteToLog $PsVersionTable

$vulkandll = "vulkan-"+$majorabi+".dll"
$windrive  = $env:SYSTEMDRIVE
$winfolder = $env:SYSTEMROOT
$script:VulkanDllList=@()

# The name of the versioned vulkan dll file is one of the following:
#
#   vulkan-<majorabi>-<major>-<minor>-<patch>-<buildno>-<prerelease>-<prebuildno>
#   vulkan-<majorabi>-<major>-<minor>-<patch>-<buildno>-<prerelease>
#   vulkan-<majorabi>-<major>-<minor>-<patch>-<buildno>-<prebuildno>
#   vulkan-<majorabi>-<major>-<minor>-<patch>-<buildno>.dll
#
# <major>, <minor>, <patch>, <buildno> and <prebuildno> are 1 to 10 numeric digits.
# <prerelease> is any combination of alpha and numeric characters.
# If <prerelease> and/or <prebuildno> are present, this identifies a prerelease,
# and the vulkan dll file will be considered less recent than one with the same
# <major>, <minor>, <patch>, <buildno> numbers without the <prerelease> and/or
# <prebuildno>.


# We first create an array, with one array element for each vulkan-*dll in
# C:\Windows\System32 (and C:\Windows\SysWOW64 on 64-bit systems), with each element
# containing:
#    <major>=<minor>=<patch>=<buildno>=<prebuildno>=<prerelease>=
#     filename
#    @<major>@<minor>@<patch>@<buildno>@<prerelease>@<prebuildno>@
# [Note that the above three lines are one element in the array.]
# The build identifiers separated by "=" are suitable for sorting, i.e.
# expanded to 10 digits with leading 0s. If <prerelease> or <prebuildno> are
# not specified, "zzzzzzzzzz" is substituted for them, so that they sort
# to a position after those that do specify them. Note that <prerelease>
# is "less significant" in the sort than <prebuildno>, and that <prerelease> is
# always treated as an alpha string, even though it may contain numeric characters.
# The build identifiers separated by "@" are the original values extracted
# from the file name. They are used later to find the path to the SDK
# install directory for the given filename.


function UpdateVulkanSysFolder([string]$dir, [int]$writeSdkName)
{
   WriteToLog "UpdateVulkanSysFolder $dir $writeSdkName"

   # Push the current path on the stack and go to $dir
   Push-Location -Path $dir

   # Create a list for all the DLLs in the folder.
   # First Initialize the list to empty
   $script:VulkanDllList = @()

   # Find all vulkan dll files in this directory
   dir -name vulkan-$majorabi-*.dll |
   ForEach-Object {
       WriteToLog  "File $_"
       if ($_ -match "=" -or
           $_ -match "@" -or
           $_ -match " " -or
           ($_.Split('-').count -lt 6) -or
           ($_.Split('-').count -gt 8) -or
           !$?)
       {
           # 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.
           WriteToLog "Ignoring $_ - bad format"

           # Not a real error, so just clear it for now.
           $Error.Clear();

           # NOTE: Inside a ForEach-Object block, the 'return' call behaves like a 'continue' for a For loop
           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) -or
          !$?) {
           WriteToLog "Rejected $_ - $vulkaninfo not present"

           # Not a real error, so just clear it for now.
           $Error.Clear();

           # NOTE: Inside a ForEach-Object block, the 'return' call behaves like a 'continue' for a For loop
           return
       }

       $major=$_.Split('-')[2]
       $majorOrig=$major
       $minor=$_.Split('-')[3]
       $minorOrig=$minor
       $patch=$_.Split('-')[4]
       $patchOrig=$patch
       $buildno=$_.Split('-')[5]

       if ($buildno -match ".dll") {
          # prerelease and prebuildno are not in the name
          # Extract buildno, and set prerelease and prebuildno to "z"s
          $buildno=$buildno -replace ".dll",""
          $buildnoOrig=$buildno
          $prerelease="z"*10
          $prereleaseOrig=""
          $prebuildno="z"*10
          $prebuildnoOrig=""
       } else {
          # Extract buildno, prerelease, and prebuildno
          $f=$_ -replace ".dll",""
          $buildno=$f.Split('-')[5]
          $buildnoOrig=$buildno
          $prerelease=$f.Split('-')[6]
          $prebuildno=$f.Split('-')[7]
          if ($prebuildno.Length -eq 0) {
              if ($prerelease -match "^[0-9]") {
                  # prerelease starts with a digit, it must be the prebuildno
                  $prebuildno=$prerelease
                  $prerelease=""
              }
          }
          $prereleaseOrig=$prerelease
          $prebuildnoOrig=$prebuildno

          if ($prerelease.Length -eq 0) {
              $prerelease="z"*10
          }
          if ($prebuildno.Length -eq 0) {
              $prebuildno="z"*10
          }
       }
       WriteToLog "Version $majorOrig $minorOrig $patchOrig $buildnoOrig $prereleaseOrig $prebuildnoOrig"
       if (!$?) {
           WriteToLog "Ignoring version $majorOrig $minorOrig $patchOrig $buildnoOrig $prereleaseOrig $prebuildnoOrig"

           # Not a real error, so just clear it for now.
           $Error.Clear();

           # NOTE: Inside a ForEach-Object block, the 'return' call behaves like a 'continue' for a For loop
           return
       }

       # Make sure fields that are supposed to be numbers are numbers
       if (notNumeric($major)) {
           WriteToLog "Ignoring $_ - bad major"

           # Not a real error, so just clear it for now.
           $Error.Clear();

           # NOTE: Inside a ForEach-Object block, the 'return' call behaves like a 'continue' for a For loop
           return
       }
       if (notNumeric($minor)) {
           WriteToLog "Ignoring $_ - bad minor"

           # Not a real error, so just clear it for now.
           $Error.Clear();

           # NOTE: Inside a ForEach-Object block, the 'return' call behaves like a 'continue' for a For loop
           return
       }
       if (notNumeric($patch)) {
           WriteToLog "Ignoring $_ - bad patch"

           # Not a real error, so just clear it for now.
           $Error.Clear();

           # NOTE: Inside a ForEach-Object block, the 'return' call behaves like a 'continue' for a For loop
           return
       }
       if (notNumeric($buildno)) {
           WriteToLog "Ignoring $_ - bad buildno"

           # Not a real error, so just clear it for now.
           $Error.Clear();

           # NOTE: Inside a ForEach-Object block, the 'return' call behaves like a 'continue' for a For loop
           return
       }
       if (notNumeric($prebuildno)) {
           if ($prebuildno -ne "z"*10) {
               WriteToLog "Ignoring $_ - bad prebuildno"

               # Not a real error, so just clear it for now.
               $Error.Clear();

               # NOTE: Inside a ForEach-Object block, the 'return' call behaves like a 'continue' for a For loop
               return
           }
       }

       $major = $major.padleft(10,'0')
       $minor = $minor.padleft(10,'0')
       $patch = $patch.padleft(10,'0')
       $buildno = $buildno.padleft(10,'0')
       $prerelease = $prerelease.padright(10,'z')
       $prebuildno = $prebuildno.padleft(10,'0')

       # Add a new element to the $VulkanDllList array
       WriteToLog "Adding $_ to Vulkan dll list "
       $script:VulkanDllList+="$major=$minor=$patch=$buildno=$prebuildno=$prerelease= $_ @$majorOrig@$minorOrig@$patchOrig@$buildnoOrig@$prereleaseOrig@$prebuildnoOrig@"
       if (!$?) {
           WriteToLog "Error: UpdateVulkanSysFolder adding DLL $_ to list"
           setScriptReturnValue(10)
       }
   }

    # If $VulkanDllList contains at least one element, there's at least one vulkan*.dll file.
    # Copy the most recent vulkan*.dll (named in the last element of $VulkanDllList) to vulkan-$majorabi.dll.

    if ($script:VulkanDllList.Length -gt 0) {

        # Sort the list. The most recent vulkan-*.dll will be in the last element of the list.
        [array]::sort($script:VulkanDllList)
        if (!$?) {
           WriteToLog "Error: UpdateVulkanSysFolder sorting DLL list" 
           setScriptReturnValue(20)
        }

        # Put the name of the most recent vulkan-*.dll in $mrVulkanDLL.
        # 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]
        WriteToLog "Copying $mrVulkanDll $vulkandll"
        Copy-Item $mrVulkanDll $vulkandll -force
        if (!$?) {
           WriteToLog "Error: UpdateVulkanSysFolder encountered error during copy $mrVulkanDll $vulkandll"
           setScriptReturnValue(30)
        }

        # 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"
        WriteToLog "Copying $mrVulkaninfo vulkaninfo.exe"
        Copy-Item $mrVulkaninfo vulkaninfo.exe -force
        if (!$?) {
           WriteToLog "Error: UpdateVulkanSysFolder encountered error during copy $mrVulkaninfo vulkaninfo.exe"
           setScriptReturnValue(40)
        }

        # Create the name used in the registry for the SDK associated with $mrVulkanDll.
        $major=$script:VulkanDllList[-1].Split('@')[1]
        $minor=$script:VulkanDllList[-1].Split('@')[2]
        $patch=$script:VulkanDllList[-1].Split('@')[3]
        $buildno=$script:VulkanDllList[-1].Split('@')[4]
        $prerelease=$script:VulkanDllList[-1].Split('@')[5]
        $prebuildno=$script:VulkanDllList[-1].Split('@')[6]

        $sdktempname="VulkanSDK"+$major + "." + $minor + "." + $patch + "." + $buildno
        if ($prerelease -ne "") {
            $sdktempname=$sdktempname + "." + $prerelease
        }
        if ($prebuildno -ne "") {
            $sdktempname=$sdktempname + "." + $prebuildno
        }

        WriteToLog "sdkname = $sdktempname"
        if (!$?) {
           WriteToLog "Error: UpdateVulkanSysFolder encountered error generating SDK name"
           setScriptReturnValue(50)
        }
    }

    # Return to our previous folder
    Pop-Location
    if (!$?) {
       WriteToLog "Error: UpdateVulkanSysFolder popping location"
       setScriptReturnValue(60)
    }

    # Only update the overall script-scope SDK name if we're told to
    if ($writeSdkName -ne 0) {
        $script:sdkname = $sdktempname
    }

    return
}

# We only care about SYSWOW64 if we're targeting a 64-bit OS
if ($ossize -eq 64) {

    # Update the SYSWOW64 Vulkan DLLS/EXEs
    WriteToLog "Calling UpdateVulkanSysFolder $winfolder\SYSWOW64 0"
    UpdateVulkanSysFolder $winfolder\SYSWOW64 0
    if (!$?) {
        WriteToLog "Error: Calling UpdateVulkanSysFolder for 64-bit OS" 
        setScriptReturnValue(70)
    }
}

# If this is a 64 bit OS and a 32 bit powershell
if (($ossize -eq 64 ) -and ([IntPtr]::size -eq 4)) {

    # Update the SYSTEM32 Vulkan DLLS/EXEs
    WriteToLog "Calling UpdateVulkanSysFolder $winfolder\SYSTEM32 1"
    UpdateVulkanSysFolder $winfolder\SYSNATIVE 1
    if (!$?) {
        WriteToLog "Error: Calling UpdateVulkanSysFolder for all OS"
        setScriptReturnValue(80)
    }

} else {

    # Update the SYSTEM32 Vulkan DLLS/EXEs
    WriteToLog "Calling UpdateVulkanSysFolder $winfolder\SYSTEM32 1"
    UpdateVulkanSysFolder $winfolder\SYSTEM32 1
    if (!$?) {
        WriteToLog "Error: Calling UpdateVulkanSysFolder for all OS"
        setScriptReturnValue(81)
    }
}

# Create an array of vulkan sdk install dirs

WriteToLog "Creating array of of Vulkan SDK Install dirs"
$mrVulkanDllInstallDir=""
$VulkanSdkDirs=@()
$installSDKRegs = @(Get-ChildItem -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall)
if ($installSDKRegs -ne $null) {
   ForEach ($curSDKReg in $installSDKRegs) {
      if ($curSDKReg -ne $null) {
         $regkey=$curSDKReg -replace ".*\\",""
         if ($regkey -match "VulkanSDK") {
             # Get the install path from UninstallString
             $tmp=Get-ItemProperty -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$regkey -Name UninstallString
             if (!$? -or $tmp -eq $null) {
                 WriteToLog "Error: Get-ItemProperty failed for Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$regkey"
                 $Error.Clear();
                 continue;
             }
             $tmp=$tmp -replace "\\Uninstall.exe.*",""
             $tmp=$tmp -replace ".*=.",""
             WriteToLog "Adding $tmp to VulkanSDKDirs"
             $VulkanSdkDirs+=$tmp
             if ($regkey -eq $script:sdkname) {
                 # Save away the sdk install dir for the the most recent vulkandll
                 WriteToLog "Setting mrVulkanDllInstallDir to $tmp"
                 $mrVulkanDllInstallDir=$tmp
             }
         }
      }
   }
}
if (!$?) {
    WriteToLog "Error: Failed creating array of of Vulkan SDK Install dirs"
    setScriptReturnValue(90)
}


# 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 "" -and $script:VulkanDllList.Length -gt 0) {
    WriteToLog "Searching VulkanDllList"
    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]
        $vulkanDllBuildno=$script:VulkanDllList[$idx].Split('@')[4]
        $vulkanDllPrerelease=$script:VulkanDllList[$idx].Split('@')[5]
        $vulkanDllPrebuildno=$script:VulkanDllList[$idx].Split('@')[6]
        $regEntry="VulkanSDK"+$vulkanDllMajor+"."+$vulkanDllMinor+"."+$vulkanDllPatch+"."+$vulkanDllBuildno
        if ($vulkanDllPrerelease) {
            $regEntry=$regEntry+"."+$vulkanDllPrerelease
        }
        if ($vulkanDllPrebuildno) {
            $regEntry=$regEntry+"."+$vulkanDllPrebuildno
        }
        WriteToLog "Comparing $regEntry"
        $rval=Get-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$regEntry -ErrorAction SilentlyContinue
        if (!$? -or $rval -eq $null) {
            WriteToLog "Ignoring $regEntry - corresponding SDK registry entry does not exist"
            $Error.Clear();
            continue
        }
        $instDir=$rval
        $instDir=$instDir -replace "\\Uninstall.exe.*",""
        $instDir=$instDir -replace ".*=.",""
        if ($rval) {
            $rval=$rval -replace ".* DisplayVersion=",""
            $rval=$rval -replace ";.*",""
            $reMajor=$rval.Split('.')[0]
            $reMinor=$rval.Split('.')[1]
            $rePatch=$rval.Split('.')[2]
            if ($reMajor+$reMinor+$rePatch -eq $vulkanDllMajor+$vulkanDllMinor+$vulkanDllPatch) {
                WriteToLog "Setting mrVulkanDllInstallDir to $instDir"
                $mrVulkanDllInstallDir=$instDir
                break
            }
        }
    }
    if (!$?) {
        WriteToLog "Failed searching VulkanDLLList"
        $Error.Clear();
    }
}

# Add C:\Vulkan\SDK\0.9.3 to list of SDK install dirs.
# We do this because there is in a bug in SDK 0.9.3 in which layer
# reg entries were not removed on uninstall. So we'll try to clean up
# and remove them now.
# This works only if 0.9.3 was installed to the default location.
# If it was not installed to the default location, those entries will
# need to be cleaned up manually.

$VulkanSdkDirs+="C:\VulkanSDK\0.9.3"
$VulkanSdkDirs+="$windrive\VulkanSDK\0.9.3"

# Remove layer registry values associated with all installed Vulkan SDKs.
# 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.

WriteToLog "Removing old layer registry values from HKLM\SOFTWARE\Khronos\Vulkan\ExplicitLayers"
$regkeys = @(Get-Item -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Khronos\Vulkan\ExplicitLayers | Select-Object -ExpandProperty Property)
if ($regkeys -ne $null) {
   ForEach ($regval in $regkeys) {
       if ($regval -ne $null) {
           ForEach ($sdkdir in $VulkanSdkDirs) {
              if ($regval -like "$sdkdir\*.json") {
                  Remove-ItemProperty -ErrorAction SilentlyContinue -Path HKLM:\SOFTWARE\Khronos\Vulkan\ExplicitLayers -name $regval
                  if (!$?) {
                     WriteToLog "Error: Remove-ItemProperty failed for -Path HKLM:\SOFTWARE\Khronos\Vulkan\ExplicitLayers -name $regval"
                  } else {
                     WriteToLog "Removed registry value $regval"
                  }
              }
           }
        }
    }
}

if (!$?) {
    WriteToLog "Error: Failed Removing old layer registry values from HKLM\SOFTWARE\Khronos\Vulkan\ExplicitLayers"
    setScriptReturnValue(100)
}

# Remove 32-bit layer registry value if we're targeting a 64-bit OS
if ($ossize -eq 64) {
   $regkeys = @(Get-Item -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Khronos\Vulkan\ExplicitLayers | Select-Object -ExpandProperty Property)
   if ($regkeys -ne $null) {
      ForEach ($regval in $regkeys) {
          if ($regval -ne $null) {
              ForEach ($sdkdir in $VulkanSdkDirs) {
                 if ($regval -like "$sdkdir\*.json") {
                    Remove-ItemProperty -ErrorAction SilentlyContinue -Path HKLM:\SOFTWARE\WOW6432Node\Khronos\Vulkan\ExplicitLayers -name $regval
                    if (!$?) {
                       WriteToLog "Error: Remove-ItemProperty failed for -Path HKLM:\SOFTWARE\WOW6432Node\Khronos\Vulkan\ExplicitLayers -name $regval"
                    } else {
                       WriteToLog "Removed WOW6432Node registry value $regval"
                    }
                 }
             }
         }
      }
   }

   if (!$?) {
      WriteToLog "Error: Failed Removing old layer registry values from HKLM\SOFTWARE\WOW6432Node\Khronos\Vulkan\ExplicitLayers"
      setScriptReturnValue(110)
   }
}


# Create layer registry values associated with Vulkan SDK from which $mrVulkanDll is from

WriteToLog "Creating new layer registry values"
if ($mrVulkanDllInstallDir -ne "") {

    # Create registry keys if they don't exist
    if (-not (Test-Path -Path HKLM:\SOFTWARE\Khronos\Vulkan\ExplicitLayers)) {
        WriteToLog "Creating new registry key HKLM\SOFTWARE\Khronos\Vulkan\ExplicitLayers"
        New-Item -Force -ErrorAction SilentlyContinue -Path HKLM:\SOFTWARE\Khronos\Vulkan\ExplicitLayers | out-null
        if (!$?) {
            WriteToLog "Error: Failed creating HKLM\SOFTWARE\Khronos\Vulkan\ExplicitLayers"
            setScriptReturnValue(120)
        }
    }
    if ($ossize -eq 64) {
        if (-not (Test-Path -Path HKLM:\SOFTWARE\WOW6432Node\Khronos\Vulkan\ExplicitLayers)) {
            WriteToLog "Creating new registry key HKLM\SOFTWARE\WOW6432Node\Khronos\Vulkan\ExplicitLayers"
            New-Item -Force -ErrorAction SilentlyContinue -Path HKLM:\SOFTWARE\WOW6432Node\Khronos\Vulkan\ExplicitLayers | out-null
            if (!$?) {
                WriteToLog "Error: Failed creating HKLM\SOFTWARE\WOW6432Node\Khronos\Vulkan\ExplicitLayers"
                setScriptReturnValue(130)
            }
        }
    }


    if ($ossize -eq 64) {
        # Create registry values in normal registry location for 64-bit items on a 64-bit OS
        Get-ChildItem $mrVulkanDllInstallDir\Bin -Filter VkLayer*json |
           ForEach-Object {
               WriteToLog "Creating registry value $mrVulkanDllInstallDir\Bin\$_"
               New-ItemProperty -Path HKLM:\SOFTWARE\Khronos\Vulkan\ExplicitLayers -Name $mrVulkanDllInstallDir\Bin\$_ -PropertyType DWord -Value 0 | out-null
               if (!$?) {
                   WriteToLog "Error: Failed creating $mrVulkanDllInstallDir\Bin\$_"
                   setScriptReturnValue(140)
               }
           }
           if (!$?) {
               WriteToLog "Error: Failed Get-ChildItem $mrVulkanDllInstallDir\Bin | ForEach-Object "
               setScriptReturnValue(150)
           }

        # Create registry values for the WOW6432Node registry location for 32-bit items on a 64-bit OS
        Get-ChildItem $mrVulkanDllInstallDir\Bin32 -Filter VkLayer*json |
           ForEach-Object {
               WriteToLog "Creating WOW6432Node registry value $mrVulkanDllInstallDir\Bin32\$_"
               New-ItemProperty -Path HKLM:\SOFTWARE\WOW6432Node\Khronos\Vulkan\ExplicitLayers -Name $mrVulkanDllInstallDir\Bin32\$_ -PropertyType DWord -Value 0 | out-null
               if (!$?) {
                   WriteToLog "Error: Failed creating $mrVulkanDllInstallDir\Bin32\$_"
                   setScriptReturnValue(160)
               }
           }
           if (!$?) {
               WriteToLog "Error: Failed Get-ChildItem $mrVulkanDllInstallDir\Bin32 | ForEach-Object "
               setScriptReturnValue(170)
           }
    } else {
        # Create registry values in normal registry location for 32-bit items on a 32-bit OS
        Get-ChildItem $mrVulkanDllInstallDir\Bin32 -Filter VkLayer*json |
           ForEach-Object {
               WriteToLog "Creating registry value $mrVulkanDllInstallDir\Bin\$_"
               New-ItemProperty -Path HKLM:\SOFTWARE\Khronos\Vulkan\ExplicitLayers -Name $mrVulkanDllInstallDir\Bin32\$_ -PropertyType DWord -Value 0 | out-null
               if (!$?) {
                   WriteToLog "Error: Failed creating $mrVulkanDllInstallDir\Bin\$_"
                   setScriptReturnValue(180)
               }
            }
            if (!$?) {
                WriteToLog "Error: Failed Get-ChildItem $mrVulkanDllInstallDir\Bin32 | ForEach-Object "
                setScriptReturnValue(190)
            }
    }
}

# Debug - for testing handling of script failure in installer
#setScriptReturnValue(200)

# Final log output
WriteToLog "ConfigLayersAndVulkanDLL.ps1 completed, return status is $script:scriptReturnValue"
$endTime=Get-Date
WriteToLog "End time: $endTime"

# Since InstallerRT.nsi runs this script by piping it to powershell.exe, the exit status
# doesn't seem to be available. So we put in it a file where InstallRT.nsi can retrieve it.
$statusfile=$Env:Temp+"\ConfigLayersAndVulkanDLL.stat"
echo $script:scriptReturnValue | Out-File -encoding ascii -filepath $statusfile

exit $script:scriptReturnValue
