mirror of
https://github.com/rbalsleyMSFT/FFU.git
synced 2026-06-14 02:09:35 -06:00
Improves Surface driver matching via System SKU
Adds best-effort Surface System SKU resolution and persists it into driver mappings to reduce model-name ambiguity during deployment. Speeds up Microsoft model discovery by using a local cache and updates cached Download Center details during driver downloads to keep the UI responsive. Prefers System SKU-based rule selection for Microsoft devices, falling back to legacy model-string matching when SKU data is unavailable.
This commit is contained in:
@@ -10,12 +10,33 @@ function Get-MicrosoftDriversModelList {
|
||||
[CmdletBinding()]
|
||||
param(
|
||||
[hashtable]$Headers, # Pass necessary headers
|
||||
[string]$UserAgent # Pass UserAgent
|
||||
[string]$UserAgent, # Pass UserAgent
|
||||
[Parameter(Mandatory = $true)]
|
||||
[string]$DriversFolder
|
||||
)
|
||||
|
||||
$url = "https://support.microsoft.com/en-us/surface/download-drivers-and-firmware-for-surface-09bb2e09-2a4b-cb69-0951-078a7739e120"
|
||||
$models = @()
|
||||
|
||||
# Load cached model list first (Source B) to keep the UI fast.
|
||||
# The cache is refreshed automatically when missing or invalid.
|
||||
try {
|
||||
$cachePath = Get-SurfaceDriverIndexCachePath -DriversFolder $DriversFolder
|
||||
if (Test-Path -Path $cachePath -PathType Leaf) {
|
||||
$cacheAgeDays = ((Get-Date) - (Get-Item -Path $cachePath).LastWriteTime).TotalDays
|
||||
if ($cacheAgeDays -lt 7) {
|
||||
$cache = Import-SurfaceDriverIndexCache -DriversFolder $DriversFolder
|
||||
if ($cache.ModelIndex -and $cache.ModelIndex.Count -gt 0) {
|
||||
WriteLog "Surface cache: Using cached Microsoft model list ($($cache.ModelIndex.Count) models)."
|
||||
return @($cache.ModelIndex)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
catch {
|
||||
WriteLog "Surface cache: Failed to load cached Microsoft model list. Falling back to online parse. Error: $($_.Exception.Message)"
|
||||
}
|
||||
|
||||
try {
|
||||
WriteLog "Getting Surface driver information from $url"
|
||||
$OriginalVerbosePreference = $VerbosePreference
|
||||
@@ -70,6 +91,18 @@ function Get-MicrosoftDriversModelList {
|
||||
}
|
||||
}
|
||||
WriteLog "Parsing complete. Found $($models.Count) models."
|
||||
|
||||
# Persist model list (Source B) into the local cache for fast UI population.
|
||||
try {
|
||||
$cache = Import-SurfaceDriverIndexCache -DriversFolder $DriversFolder
|
||||
$cache.ModelIndex = @($models)
|
||||
Save-SurfaceDriverIndexCache -Cache $cache -DriversFolder $DriversFolder
|
||||
WriteLog "Surface cache: Saved Microsoft model list to cache."
|
||||
}
|
||||
catch {
|
||||
WriteLog "Surface cache: Failed to save Microsoft model list. Error: $($_.Exception.Message)"
|
||||
}
|
||||
|
||||
return $models
|
||||
}
|
||||
catch {
|
||||
@@ -195,6 +228,40 @@ function Save-MicrosoftDriversTask {
|
||||
}
|
||||
}
|
||||
|
||||
# Update local cache with Download Center file details (Source C) for this model.
|
||||
# This runs during download (not during Get Models) so it won't slow the listview population.
|
||||
try {
|
||||
$filesForCache = [System.Collections.Generic.List[pscustomobject]]::new()
|
||||
if ($win10Link -and $win10FileName) {
|
||||
$filesForCache.Add([pscustomobject]@{ Name = $win10FileName; Url = $win10Link })
|
||||
}
|
||||
if ($win11Link -and $win11FileName) {
|
||||
$filesForCache.Add([pscustomobject]@{ Name = $win11FileName; Url = $win11Link })
|
||||
}
|
||||
|
||||
if ($filesForCache.Count -gt 0) {
|
||||
$cache = Import-SurfaceDriverIndexCache -DriversFolder $DriversFolder
|
||||
$detailsEntry = [pscustomobject][ordered]@{
|
||||
Model = $modelName
|
||||
Link = $modelLink
|
||||
Files = @($filesForCache)
|
||||
}
|
||||
|
||||
$newDetails = [System.Collections.Generic.List[pscustomobject]]::new()
|
||||
foreach ($item in @($cache.DownloadCenterDetails)) {
|
||||
if ($null -ne $item -and $item.PSObject.Properties['Link'] -and $item.Link -ne $modelLink) {
|
||||
$newDetails.Add($item)
|
||||
}
|
||||
}
|
||||
$newDetails.Add($detailsEntry)
|
||||
$cache.DownloadCenterDetails = @($newDetails)
|
||||
Save-SurfaceDriverIndexCache -Cache $cache -DriversFolder $DriversFolder
|
||||
}
|
||||
}
|
||||
catch {
|
||||
WriteLog "Surface cache: Failed updating Download Center details cache for '$modelName'. Error: $($_.Exception.Message)"
|
||||
}
|
||||
|
||||
# Decision logic to select the appropriate download link
|
||||
$downloadLink = $null
|
||||
$fileName = $null
|
||||
|
||||
Reference in New Issue
Block a user