Add catalog-sourced GPU display driver scrapers (Intel/NVIDIA/AMD) - #4
Conversation
Extend the driver scrapers to GPU display drivers, single-source from the
Microsoft Update Catalog (no vendor-direct backend, no new dependency): each
vendor is a new .psd1 + thin shim feeding the existing Invoke-DriverScrape.
- intel-gfx.psd1: unified DCH (Arc A/B, Iris Xe, recent iGPU) -> one download
- nvidia-gfx.psd1: GeForce consumer (unified) + RTX/Quadro pro branch, by HWID
- amd-gfx.psd1: Radeon RX + Radeon Pro, one device per family (branch split)
- Get-{Intel,Nvidia,Amd}GraphicsDrivers.ps1 shims (post-boot convenience)
- build_win11pxe.ps1: -GraphicsDrivers Intel|AMD|NVIDIA|All, excluded from the
-Drivers glob, fed into the same DISM /Add-Driver; larger shared timeout;
no boot-start promotion (a GPU never serves iSCSI boot)
- Test-CatalogScrape.ps1: schema coverage + targeted assertions (81 pass)
- README: scraper table + -GraphicsDrivers docs
GPU is post-boot-only (like Wi-Fi). A bare INF install yields a fully
accelerated driver incl. GL/Vulkan/OpenCL/D3D + CUDA/NVENC runtimes; the
Store control-panel apps and AMD ISV PRO Edition are out of scope. x64 only
(no discrete-GPU ARM64 driver; Qualcomm Adreno is not on the catalog).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
There was a problem hiding this comment.
Code Review
This pull request adds support for scraping and injecting GPU display drivers (Intel, AMD, and NVIDIA) from the Microsoft Update Catalog. It introduces new scraper scripts, configuration files, and updates build_win11pxe.ps1 with a -GraphicsDrivers parameter to handle these large, post-boot-only drivers. The review feedback suggests two improvements in build_win11pxe.ps1: wrapping the Wait-Job call in a conditional block to prevent crashes when no scrapers are run, and using -LiteralPath with Test-Path and Get-Item to avoid wildcard expansion issues in paths.
Important
The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.
| Write-Host " -> Waiting for $($scraperJobs.Count) scrapers to complete (max $([int]($scraperTimeoutSec / 60)) min)..." | ||
| $scraperJobs | Wait-Job -Timeout $scraperTimeoutSec | Out-Null |
There was a problem hiding this comment.
If no scraper scripts are found or executed (for example, if -GraphicsDrivers is specified but the corresponding scraper script is missing, and -Drivers is not set), $scraperJobs will be empty or $null. Piping an empty or $null collection to Wait-Job will throw a terminating error under $ErrorActionPreference = 'Stop', which aborts the entire VHDX build process after a lengthy image application. Wrapping the Wait-Job call in an if ($scraperJobs) block safely avoids this crash.
if ($scraperJobs) {
Write-Host " -> Waiting for $($scraperJobs.Count) scrapers to complete (max $([int]($scraperTimeoutSec / 60)) min)..."
$scraperJobs | Wait-Job -Timeout $scraperTimeoutSec | Out-Null
}
| $gpuPath = Join-Path $PSScriptRoot $gpuName | ||
| if (Test-Path $gpuPath) { $driverScripts += Get-Item $gpuPath } |
There was a problem hiding this comment.
Using the default -Path parameter for Test-Path and Get-Item can cause failures if the repository is cloned into a directory path containing wildcard characters (such as [ or ]). Using -LiteralPath ensures that the path is treated as a literal string, preventing wildcard expansion issues.
$gpuPath = Join-Path $PSScriptRoot $gpuName
if (Test-Path -LiteralPath $gpuPath) { $driverScripts += Get-Item -LiteralPath $gpuPath }
…le-driver pick" This reverts the changes merged in PR #5 (merge commit 0f18b5f). Its premise was disproven: 11.19.602.2025 is NOT a stale 2016 generic NDIS driver — it is the CURRENT Realtek USB NetAdapterCx family driver. Verified by extracting the live catalog package: - binaries rtucx22x64.sys (PE32+ x86-64) and rtucx22arm64.sys (PE32+ ARM64); "rtucx" = Realtek USB NetAdapterCx - CAB packaged 2025/08 on the catalog CDN; the DriverVer 03/30/2016 is cosmetic - INF explicitly binds USB\VID_0BDA&PID_8157 AND PID_815A across all REV codes, in both [Realtek.NTamd64] and [Realtek.ntarm64] - the catalog serves it in x64 AND ARM64 (ARM64 updateid 7da54d16-6faf-4214-b869-93f53467a9e1) The MinVersion='1157'/'1159' floor skipped exactly that driver, shipping nothing for 8157/8159 and dropping the only ARM64 driver available for them. The pre-PR behavior (selecting 11.19.602.2025) was correct; RTL8126/8127 were never a bug. Tests: 81 passed / 0 failed (post-#4 baseline restored). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Summary
Extends the driver scrapers to GPU display drivers, kept single-source from the Microsoft Update Catalog — verified that NVIDIA (consumer GeForce and RTX/Quadro pro), AMD (Radeon RX and Radeon Pro), and Intel are all HWID-indexed, complete, and WHQL-signed on the catalog. So this needs no vendor-direct backend, no 7-Zip, no new dependency, and no engine change: each vendor is a new
.psd1+ a thin shim feeding the existingInvoke-DriverScrape, exactly like the Wi-Fi scrapers.What's added
Data tables (
catalogscrape/)intel-gfx.psd1(Intel_Display) — unified DCH; one device, multi-HWID dedup (Arc A/B, Iris Xe, recent iGPU) → one download.nvidia-gfx.psd1(NVIDIA_Display) — GeForce consumer (unified across Ampere/Ada/Blackwell) + RTX/Quadro pro; HWID targeting auto-resolves the pro production branch (a distinct, newer package).amd-gfx.psd1(AMD_Display) — Radeon RX + Radeon Pro, one device per family (RDNA4/3/2 + W7000/W6000) to avoid the current/legacy branch mis-pick.Shims (repo root) —
Get-{Intel,Nvidia,Amd}GraphicsDrivers.ps1, post-boot-convenience scope documented. Run standalone on a live box (-Install→pnputil).build_win11pxe.ps1-GraphicsDrivers Intel|AMD|NVIDIA|All(ValidateSet), excluded from the-Driversglob, mapped to shims, fed into the sameDISM /Add-Driver.Wait-Jobtimeout scales to 60 min when graphics are included (noted as a shared global budget).$nicDriverDefs: GPU drivers are deliberately not boot-promoted (a GPU is on neither the boot nor the iSCSI data path).Test-CatalogScrape.ps1— three tables added to$expectKeys(so the universalKey/Label/Queriesschema check covers them) + targeted assertions (Intel-unified / NVIDIA consumer-vs-pro / AMD Radeon-Pro).README.md— scraper table rows +-GraphicsDriversdocumentation.Scope decisions (deliberate)
pnputil) yields a fully accelerated driver incl. the OpenGL/Vulkan/OpenCL/D3D ICDs and the CUDA/NVENC runtime; only the Microsoft Store control-panel apps (NVIDIA App, AMD Adrenalin, Intel Graphics Software) are absent. Radeon Pro cards get the base WHQL driver, not the ISV-certified PRO Edition.-Architecture arm64if that changes).Verification
.ps1files AST-parse clean; the three.psd1load with expected device counts (1/2/5).Test-CatalogScrape.ps1: 81 passed, 0 failed (+9 new).Invoke-ScriptAnalyzernot run locally (PSScriptAnalyzer not installed in the dev env); additions use full cmdlet names and mirror existing patterns — CI will cover it.🤖 Generated with Claude Code