private/Save-WinPEDriverPackageIntelEthernet.ps1

#Requires -PSEdition Core

function Save-WinPEDriverPackageIntelEthernet {
    <#
    .SYNOPSIS
        Downloads and prepares an Intel Ethernet WinPE driver package
 
    .DESCRIPTION
        Downloads an Intel Ethernet ZIP package to the OSDeployCore download cache and
        verifies its SHA256 checksum through Invoke-WinPEDriverPackageDownload. Unless
        DownloadOnly is specified, the function expands the archive into the architecture-specific
        managed architecture-specific winpedrivers folder when that folder contains no files.
 
        After expansion, the function removes non-WinPE payload including applications,
        documentation, Linux and FreeBSD content, server driver sets, selected older NDIS
        sets, firmware update content, and RDMA content. This cleanup runs whenever expansion
        is not bypassed, regardless of Force.
 
    .PARAMETER DriverPackage
        Specifies the OSDeployWinPEDriver.Package object to download. The object supplies
        the package name, version, architecture, URIs, filename, and SHA256 checksum.
 
    .PARAMETER Force
        Downloads the package again and passes Force to ZIP expansion. It does not suppress
        post-expansion cleanup.
 
    .PARAMETER DownloadOnly
        Returns after downloading the archive without expanding or cleaning driver content.
 
    .EXAMPLE
        PS> $package = Get-WinPEDriverPackageCore | Where-Object Name -Match 'Intel.*Ethernet' | Select-Object -First 1; Save-WinPEDriverPackageIntelEthernet -DriverPackage $package
 
        Downloads, expands, and removes non-WinPE content from the first Intel Ethernet package.
 
    .INPUTS
        None. This function does not accept pipeline input.
 
    .OUTPUTS
        System.IO.FileInfo. Returns the downloaded ZIP file, or no object when the download fails.
 
    .NOTES
        Author: David Segura
        Company: Recast Software
        Version: 1.0.0
        Date: 2026-08-28
 
        Assumes the OSDeployCore cache and Boot-Assets paths are initialized and writable.
 
    .LINK
        Save-WinPEDriverPackageCore
    #>

    [CmdletBinding()]
    [OutputType([System.IO.FileInfo])]
    param (
        [Parameter(Mandatory)]
        [PSTypeName('OSDeployWinPEDriver.Package')]
        [PSCustomObject]$DriverPackage,

        [Parameter()]
        [switch]$Force,

        [Parameter()]
        [switch]$DownloadOnly
    )

    $package     = $DriverPackage
    $idPrefix    = ($package.Name -split '-')[0]
    $downloadDir = Join-Path $script:OSDeployCoreDownloadsPath $idPrefix
    $targetPath  = Join-Path $downloadDir $package.FileName
    $driverDir   = Join-Path $script:OSDeployBootAssetsPath "winpedrivers-$($package.Architecture)" |
                   Join-Path -ChildPath "$($package.Name)-$($package.Version)"

    Write-HostDateTimeDarkGray -Message "Starting $($package.Name)"

    $downloadedFile = Invoke-WinPEDriverPackageDownload `
        -Uri             $package.DownloadUri `
        -DestinationPath $targetPath `
        -SearchUri       $package.UpdateUri `
        -ExpectedSHA256  $package.Checksums.SHA256 `
        -Force:$Force

    if (-not $downloadedFile) {
        return
    }

    if ($DownloadOnly) {
        return $downloadedFile
    }

    $expandedFiles = Get-ChildItem -Path $driverDir -Recurse -File -ErrorAction SilentlyContinue
    if (-not $expandedFiles) {
        if (-not (Test-Path -Path $driverDir)) {
            New-Item -ItemType Directory -Path $driverDir -Force | Out-Null
        }
        Write-HostDateTimeDarkGray -Message "Expand: $targetPath"
        Write-HostDateTimeDarkGray -Message "Output: $driverDir"
        Write-Verbose "[$($MyInvocation.MyCommand.Name)] Expanding '$($package.FileName)' to '$driverDir'"
        Expand-WinPEDriverPackageZip -Path $targetPath -DestinationPath $driverDir -Force:$Force
    }
    else {
        Write-Verbose "[$($MyInvocation.MyCommand.Name)] '$driverDir' already contains expanded files. Skipping expansion."
    }

    foreach ($cleanupPath in @(
        (Join-Path $driverDir 'APPS'),
        (Join-Path $driverDir 'DDP_Profiles'),
        (Join-Path $driverDir 'DOCS'),
        (Join-Path $driverDir 'NVMUpdatePackage'),
        (Join-Path $driverDir 'Resource'),
        (Join-Path $driverDir 'SetupBD.exe'),
        (Join-Path $driverDir 'PRO1000\LINUX'),
        (Join-Path $driverDir 'PRO1000\Winx64\NDIS65'),
        (Join-Path $driverDir 'PRO1000\Winx64\NDIS68'),
        (Join-Path $driverDir 'PRO1000\Winx64\WS2022'),
        (Join-Path $driverDir 'PRO1000\Winx64\WS2025'),
        (Join-Path $driverDir 'PRO2500\Winx64\NDIS68'),
        (Join-Path $driverDir 'PRO2500\Winx64\WS2022'),
        (Join-Path $driverDir 'PRO2500\Winx64\WS2025'),
        (Join-Path $driverDir 'PRO40GB\Linux'),
        (Join-Path $driverDir 'PRO40GB\Winx64\NDIS65'),
        (Join-Path $driverDir 'PRO40GB\Winx64\NDIS68'),
        (Join-Path $driverDir 'PRO40GB\Winx64\WS2022'),
        (Join-Path $driverDir 'PRO40GB\Winx64\WS2025'),
        (Join-Path $driverDir 'PROAVF\FreeBSD'),
        (Join-Path $driverDir 'PROAVF\Linux'),
        (Join-Path $driverDir 'PROAVF\Winx64\NDIS65'),
        (Join-Path $driverDir 'PROAVF\Winx64\NDIS68'),
        (Join-Path $driverDir 'PROAVF\Winx64\WS2022'),
        (Join-Path $driverDir 'PROCGB\FreeBSD'),
        (Join-Path $driverDir 'PROCGB\Linux'),
        (Join-Path $driverDir 'PROCGB\Winx64\NDIS65'),
        (Join-Path $driverDir 'PROCGB\Winx64\NDIS68'),
        (Join-Path $driverDir 'PROCGB\Winx64\WS2022'),
        (Join-Path $driverDir 'PROCGB\Winx64\WS2025'),
        (Join-Path $driverDir 'PROXGB\FreeBSD'),
        (Join-Path $driverDir 'PROXGB\Linux'),
        (Join-Path $driverDir 'PROXGB\Winx64\NDIS65'),
        (Join-Path $driverDir 'PROXGB\Winx64\NDIS68'),
        (Join-Path $driverDir 'PROXGB\Winx64\WS2022'),
        (Join-Path $driverDir 'PROXGB\Winx64\WS2025'),
        (Join-Path $driverDir 'RDMA\FreeBSD'),
        (Join-Path $driverDir 'RDMA\Linux'),
        (Join-Path $driverDir 'RDMA\Windows\W10'),
        (Join-Path $driverDir 'RDMA\Windows\ws2019'),
        (Join-Path $driverDir 'RDMA\Windows\ws2022'),
        (Join-Path $driverDir 'RDMA\Windows\ws2025')
    )) {
        if (Test-Path -Path $cleanupPath) {
            Write-Verbose "[$($MyInvocation.MyCommand.Name)] Removing '$cleanupPath'"
            Remove-Item -Path $cleanupPath -Recurse -Force
        }
    }

    $downloadedFile
}