Skip to content

Add catalog-sourced GPU display driver scrapers (Intel/NVIDIA/AMD) - #4

Merged
jm2 merged 1 commit into
mainfrom
jm2/gpu-driver-scrapers
Jun 24, 2026
Merged

Add catalog-sourced GPU display driver scrapers (Intel/NVIDIA/AMD)#4
jm2 merged 1 commit into
mainfrom
jm2/gpu-driver-scrapers

Conversation

@jm2

@jm2 jm2 commented Jun 24, 2026

Copy link
Copy Markdown
Owner

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 existing Invoke-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 (-Installpnputil).

build_win11pxe.ps1

  • -GraphicsDrivers Intel|AMD|NVIDIA|All (ValidateSet), excluded from the -Drivers glob, mapped to shims, fed into the same DISM /Add-Driver.
  • Scraper Wait-Job timeout scales to 60 min when graphics are included (noted as a shared global budget).
  • Comment at $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 universal Key/Label/Queries schema check covers them) + targeted assertions (Intel-unified / NVIDIA consumer-vs-pro / AMD Radeon-Pro).

README.md — scraper table rows + -GraphicsDrivers documentation.

Scope decisions (deliberate)

  • Userspace utilities out of scope. A bare INF install (offline DISM or live 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.
  • x64 only. Discrete GPUs have no ARM64 Windows driver; Qualcomm Adreno is ACPI-enumerated and not on the catalog by any query shape, so no ARM64 GPU table is shipped (the arch plumbing already supports -Architecture arm64 if that changes).
  • Accepted limitation: newest-WHQL-on-catalog, not day-0 Game Ready, and no GRD/Studio/branch pinning — consistent with the existing scrapers' bar.

Verification

  • All touched/new .ps1 files AST-parse clean; the three .psd1 load with expected device counts (1/2/5).
  • Test-CatalogScrape.ps1: 81 passed, 0 failed (+9 new).
  • Invoke-ScriptAnalyzer not 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

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>

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Comment thread build_win11pxe.ps1
Comment on lines +241 to +242
Write-Host " -> Waiting for $($scraperJobs.Count) scrapers to complete (max $([int]($scraperTimeoutSec / 60)) min)..."
$scraperJobs | Wait-Job -Timeout $scraperTimeoutSec | Out-Null

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

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
        }

Comment thread build_win11pxe.ps1
Comment on lines +218 to +219
$gpuPath = Join-Path $PSScriptRoot $gpuName
if (Test-Path $gpuPath) { $driverScripts += Get-Item $gpuPath }

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

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 }

@jm2
jm2 merged commit 0257ce2 into main Jun 24, 2026
6 checks passed
jm2 added a commit that referenced this pull request Jun 25, 2026
…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>
@jm2
jm2 deleted the jm2/gpu-driver-scrapers branch July 8, 2026 22:07
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant