private/MDT/pwsh/Step-BuildMediaAddWallpaper.ps1

function Step-BuildMediaAddWallpaper {
    <#
    .SYNOPSIS
        Embeds the OSDeploy wallpaper into a mounted WinPE or WinRE image.
 
    .DESCRIPTION
        Writes the OSDeploy-branded winpe.jpg to the mounted image's
        System32 folder and, for WinRE images, injects an INF driver that
        sets the WinPE CustomBackground registry value so the wallpaper is
        displayed during the PE boot sequence.
 
    .PARAMETER Architecture
        Target processor architecture. Defaults to $global:BuildMedia.Architecture.
 
    .PARAMETER MountPath
        Path to the directory where the WIM image is mounted.
        Defaults to $global:BuildMedia.MountPath.
 
    .PARAMETER WimSourceType
        Type of the mounted image: 'WinPE' or 'WinRE'.
        Defaults to $global:BuildMedia.WimSourceType.
 
    .EXAMPLE
        Step-BuildMediaAddWallpaper
 
        Embeds the wallpaper using values from the global BuildMedia hashtable.
 
    .EXAMPLE
        Step-BuildMediaAddWallpaper -MountPath 'C:\Mount' -WimSourceType 'WinRE'
 
        Injects the wallpaper and registry INF into a WinRE image mounted at C:\Mount.
 
    .INPUTS
        None. This function does not accept pipeline input.
 
    .OUTPUTS
        None.
 
    .NOTES
        Author: David Segura
        Company: Recast Software
        Called by Invoke-OSDeployMDT during the WIM stage.
 
    Dependencies:
      Module Functions: Invoke-OSDeployMDT
      Executables: robocopy.exe
      Windows Features: DISM, MDT, Windows ADK WinPE Addon
      .NET Classes: [System.IO.File]
    #>

    [CmdletBinding()]
    param (
        [System.String]
        $Architecture = $global:BuildMedia.Architecture,
        [System.String]
        $MountPath = $global:BuildMedia.MountPath,
        [System.String]
        $WimSourceType = $global:BuildMedia.WimSourceType
    )
    #=================================================
    $Error.Clear()
    Write-Verbose "[$(Get-Date -format s)] Start"
    #=================================================
    Write-Verbose "[$(Get-Date -format s)] Architecture: $Architecture"
    Write-Verbose "[$(Get-Date -format s)] MountPath: $MountPath"
    Write-Verbose "[$(Get-Date -format s)] WimSourceType: $WimSourceType"
    #=================================================
$InfWinpeJpg = @'
[Version]
Signature = "$WINDOWS NT$"
Class = System
ClassGuid = {4D36E97d-E325-11CE-BFC1-08002BE10318}
Provider = OSDeploy
DriverVer = 07/20/2021,2021.07.20.0
 
[DefaultInstall]
AddReg = AddReg
 
[AddReg]
;rootkey,[subkey],[value],[flags],[data]
;0x00000 REG_SZ
;0x00001 REG_BINARY
;0x10000 REG_MULTI_SZ
;0x20000 REG_EXPAND_SZ
;0x10001 REG_DWORD
;0x20001 REG_NONE
HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\WinPE",CustomBackground,0x10000,"X:\Windows\System32\winpe.jpg"
'@

    #=================================================
    if ($WimSourceType -eq 'WinRE') {
<#
$bytes = [System.IO.File]::ReadAllBytes("C:\Users\DavidSegura\Downloads\winpe.jpg")
$base64 = [Convert]::ToBase64String($bytes)
$base64 | Set-Clipboard
 
    .NOTES
 
    Dependencies:
      Module Functions: Invoke-OSDeployMDT
      Executables: robocopy.exe
      Windows Features: DISM, MDT, Windows ADK WinPE Addon
      .NET Classes: [System.IO.File]
#>

        $Wallpaper = '/9j/4AAQSkZJRgABAgEAYABgAAD//gASTEVBRFRPT0xTIHYyMy4wAP/bAIQABQUFCAUIDAcHDAwJCQkMDQwMDAwNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQEFCAgKBwoMBwcMDQwKDA0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0N/8QBogAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoLAQADAQEBAQEBAQEBAAAAAAAAAQIDBAUGBwgJCgsQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+hEAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/8AAEQgAIAAgAwERAAIRAQMRAf/aAAwDAQACEQMRAD8A42v6PPxQKACgAoAKACgAoAKACgAoAKACgAoAKACgAoA//9k='
        Write-Host -ForegroundColor DarkGray "[$(Get-Date -format s)] Updating WinRE Wallpaper $MountPath\Windows\System32\winpe.jpg"
        [byte[]]$Bytes = [convert]::FromBase64String($Wallpaper)
        [System.IO.File]::WriteAllBytes("$env:TEMP\winpe.jpg", $Bytes)
        $null = robocopy.exe "$env:TEMP" "$MountPath\Windows\System32" winpe.jpg /b /ndl /np /r:0 /w:0 /xj /mt:128 /LOG+:$global:BuildMedia.LogsPath\Step-BuildMediaAddWallpaper.log


        <#
        Write-Host -ForegroundColor DarkGray "[$(Get-Date -format s)] Adding default WinRE Wallpaper $MountPath\Windows\System32\winpe.jpg"
        # Default color
        $Wallpaper = '/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAIBAQIBAQICAgICAgICAwUDAwMDAwYEBAMFBwYHBwcGBwcICQsJCAgKCAcHCg0KCgsMDAwMBwkODw0MDgsMDAz/2wBDAQICAgMDAwYDAwYMCAcIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz/wAARCAAgACADASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD5vooor+sD+KwooooAKKKKACiiigD/2Q=='
        # HP color
        # $Wallpaper = '/9j/4AAQSkZJRgABAQEAYABgAAD/4QAiRXhpZgAATU0AKgAAAAgAAQESAAMAAAABAAEAAAAAAAD/2wBDAAIBAQIBAQICAgICAgICAwUDAwMDAwYEBAMFBwYHBwcGBwcICQsJCAgKCAcHCg0KCgsMDAwMBwkODw0MDgsMDAz/2wBDAQICAgMDAwYDAwYMCAcIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz/wAARCAAgACADASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD4Pooor/Vw/jsKKKKACiiigAooooA//9k='
        [byte[]]$Bytes = [convert]::FromBase64String($Wallpaper)
        [System.IO.File]::WriteAllBytes("$env:TEMP\winpe.jpg", $Bytes)
        [System.IO.File]::WriteAllBytes("$env:TEMP\winre.jpg", $Bytes)
        $null = robocopy.exe "$env:TEMP" "$MountPath\Windows\System32" winpe.jpg /b /ndl /np /r:0 /w:0 /xj /mt:128 /LOG+:$global:BuildMedia.LogsPath\Step-BuildMediaAddWallpaper.log
        # $null = robocopy.exe "$env:TEMP" "$MountPath\Windows\System32" winre.jpg /b /ndl /np /r:0 /w:0 /xj /mt:128 /LOG+:$global:BuildMedia.LogsPath\Step-BuildMediaAddWallpaper.log
 
    .NOTES
 
    Dependencies:
      Module Functions: Invoke-OSDeployMDT
      Executables: robocopy.exe
      Windows Features: DISM, MDT, Windows ADK WinPE Addon
      .NET Classes: [System.IO.File]
        #>


        # Inject the WinRE Wallpaper Driver
        $InfFile = "$env:Temp\Set-WinREWallpaper.inf"
        $null = New-Item -Path $InfFile -Force
        Set-Content -Path $InfFile -Value $InfWinpeJpg -Encoding Unicode -Force
        $null = Add-WindowsDriver -Path $MountPath -Driver $InfFile -ForceUnsigned
    }
    #=================================================
    Write-Verbose "[$(Get-Date -format s)] End"
    #=================================================
}