* Add friendly explanations for common DISM exit codes
Invoke-WinUtilISODism threw only a raw exit code on DISM failure
(e.g. "DISM add-driver failed with exit code 112"), leaving users to
look up what the number means themselves.
Adds a $knownExitCode lookup table mapping common Windows/DISM exit
codes (disk full, access denied, file/path not found, file in use,
timeout, etc.) to plain-English explanations. When a failure's exit
code is recognized, the thrown message now includes the explanation
in parentheses; unrecognized codes fall back to the original
plain-number message.
Verified the script still parses correctly after the change.
* Add missing period to fallback DISM error message
* Add tests for DISM known/unknown exit code error messages
Adds a test verifying a known exit code (112) produces the friendly
explanation in the thrown message, alongside the existing test
verifying an unrecognized code still falls back to the plain
numeric message.
Verified: all 35 tests in win11creator.Tests.ps1 pass.
* Document DISM friendly error messages in Win11 Creator troubleshooting
Adds a Troubleshooting table row explaining the new DISM error
message format (exit code + explanation in parentheses), with
guidance for the most common cases and a link to Microsoft's full
error code reference for anything not explained.
* Fix duplicate DISM calls in unmapped exit code test
The unmapped-code test called Invoke-WinUtilISOScript twice — once
via Should -Throw, once to capture the message for the no-parens
check — causing $script:dismCalls to double-count. Consolidated to
a single call, checking both the exit code and the absence of a
parenthesized explanation against one captured exception message.
Verified: all 36 tests in win11creator.Tests.ps1 pass.
* Fix broken DISM error code reference link in docs
Replaced the dead windows-hardware/manufacture link with Microsoft's
actual System Error Codes reference page, which DISM exit codes
correspond to.
* Strengthen DISM fallback regression coverage
---------
Co-authored-by: Chris Titus <contact@christitus.com>
Invoke-WinUtilISOScript.ps1's PostInstall script set DisableFileSyncNGSC
to 1, which FirstLogon.ps1 (from #4409) then immediately overrides back
to 0. The final value was correct, but only because one script undoes
the other's write on every install.
Removes the redundant PostInstall write so FirstLogon.ps1's existing
0 assignment is the only place setting this value.
Verified the script still parses correctly after the change.
* fix(iso): inject drivers per package
Add each root package folder separately so one bad driver cannot fail the rest. The batch form is roughly four times faster. That cost is accepted for one deterministic code path
* Preserve retained nested driver packages
* Discard partial driver injection attempts
* Remove excluded nested driver INFs
---------
Co-authored-by: Chris Titus <contact@christitus.com>
* fix(win11-creator): filter unserviceable and stale drivers before injection
Add-Driver aborts the whole batch when one exported package is bad,
which broke ISO creation for anyone with an Extension-class or stale
duplicate driver in their store (#4971, #4982). Exclude both before
the single Add-Driver call instead of guessing per-vendor.
* fix(win11-creator): address driver filtering review feedback
Accept date-only DriverVer entries instead of treating them as
unknown. Use the full folder path as the dedup fallback key so two
unrelated packages can't collide on a shared leaf name. Discard the
logger's own output inside the selector so an emitting -Log callback
can't inflate the survivor count. Skip driver injection instead of
failing the whole ISO build when nothing is left to inject.
Also extracts the repeated DISM mock setup in the driver tests into
one shared harness, and asserts that excluded packages are actually
deleted from the export root before Add-Driver runs, not just logged.
* fix: address remaining code review comments
* refactor: simplify Win11 Creator ISO workflow
Keep no-driver ISO generation on the fast copy-only path.
Inject exported drivers with one selected-index WIM mount, one Add-Driver pass, and one commit.
Limit WinPE staging to boot-storage drivers and improve workflow validation coverage.
* refactor: stage Win11 setup script fallback
Copy the prepared setup script payloads into sources/$//Setup/Scripts so setup media does not depend solely on answer-file extension extraction.
Keep the existing autounattend execution path unchanged and cover the fallback files in the Win11 Creator tests.
* refactor: address codex feedback
* refactor: run ISO verification in runspace
Rename the ISO logger to Write-WinUtilISOLog so the shared runspace pool imports it automatically. Run Mount & Verify off the WPF thread with dispatcher-safe UI updates, and add Pester coverage for the runspace and logger contract.
* refactor: address ISO review feedback
Keep the selected ISO stable during background verification. Apply ContentDeliveryManager settings to both the first account and the default profile. Block FAT32 USB creation when install.esd exceeds the supported file size.
* refactor: address ISO setup edge cases
Set BypassNRO before OOBE so local account setup is available during Windows Setup.
Detect registered DISM mounts during driver-injection cleanup so partial mount failures are discarded.
* refactor: address ISO review edge cases
Use the actual FAT32 file limit for install.esd USB checks.
Disable ISO modification while mount verification is running.
Apply unsupported-hardware notice suppression to the first user profile.
* refactor: stage ISO setup safeguards earlier
Set device encryption and reserved-storage registry guards before OOBE.
Enable the OEM configuration-set fallback when setup scripts are staged there.
* Update functions/private/Invoke-WinUtilISOUSB.ps1
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
---------
Co-authored-by: Chris Titus <contact@christitus.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
* feat: Enhance Win11 Creator with edition ID handling and update autounattend.xml generation
* Strengthen Pester coverage for config and function files
* Fix slop remains
Chris likes to vibe code. AI likes to use different types of dashes (em-dashes, en-dashes), instead of regular dashes (-).
On PowerShell 7 this appears to work. The parser doesn't care. But, what about PowerShell 5? It begins throwing errors about the ampersand. Loading it in the ISE reveals how it stops parsing the syntax correctly when it encounters em-dashes. Rather than displaying them as such, the ISE displays them as —.
Chris, if you want to vibe code, I don't mind. But at least use regular dashes.
Anyway, I won't fix the AI code. I just want to make it work on my beloved powershell 5.
* Apparently this file is important
* initial usb fixes
* fix full button width
* Cleanup and Verbose output for copy
* expand ui and fix clean and reset
* Add minimal driver injection
* initial driver support
* fix verbage
* fix syntax error
* create log file on iso generation
* inject to boot.wim for install
* fix single driver install issues
* fix first run probs
* cleanup injection
* improve clean up
* Fix OSCDIMG output and cleanup comments
* Fix Scrollviewer in Status Log
* large drive support and change to Exfat
* Fix BOOT for older UEFI and Add error checks for small usb drives
* fix single usb drive error
* Tab creation
* scaffold outline for the iso tab
* autounattended creation
* inital modification success
* iso save success
* cleanup and iso improvements
* fix startmenu on new 26h2
* remove old first startup
* Fix run for use
* fix unapproved verb
* Keep step 4 output expanded
* update auto-merge
* Cleanup
* remove out-null and trailing whitespace
* explain modify and creator button
* fix scroll to end
* remove workflow change
* fix home updates
* Tab creation
* scaffold outline for the iso tab
* autounattended creation
* inital modification success
* iso save success
* cleanup and iso improvements
* fix startmenu on new 26h2
* remove old first startup
* Fix run for use
* fix unapproved verb
* Keep step 4 output expanded
* update auto-merge
* Cleanup
* remove out-null and trailing whitespace
* explain modify and creator button
* fix scroll to end
* remove workflow change