"We couldn't complete the updates. Undoing changes. Don't turn off your computer." It is the politest failure message Windows produces, and operationally it is the worst one, because it hands the user nothing to write down. No code, no KB number, no log path. Just a progress screen that counts backwards.
The user waits, the device returns to the build it was already on, and the ticket that lands in your queue says update failed, rolled back. That is the entire technical content of it.
So the reflex is to redeploy and hope. That reflex is why the same device fails a second time in exactly the same way, on exactly the same night, and appears in the same report the following month.
A rollback is not a black box. It is a documented exit path that writes a specific set of files, in specific directories, and posts a specific event carrying the error code the user never saw. This post is about reconstructing what happened from those artefacts — after the fact, on a device that now looks perfectly healthy.
One user-facing sentence covers two unrelated mechanisms: a Component-Based Servicing transaction that failed at boot (a monthly quality update), or Windows Setup taking its prepared rollback branch (anything that changes the build). They leave different evidence, so step one is deciding which one you are looking at — read CurrentBuild and UBR, not the ticket. The error code the user never saw is recorded by Windows Error Reporting as Application event 1001, event name WinSetupDiag02, where parameter P2 = 5 means Rollback and P5/P6 carry the result and extend codes. The rollback log set lives in $Windows.~BT\Sources\Rollback and %WinDir%\Panther\NewOS, and SetupDiag.exe parses it — but Disk Cleanup's "clean up system files" and deleting Windows.old both destroy that evidence, and deleting Windows.old deletes SetupDiag.exe along with it. Microsoft publishes no event-ID catalog for the Microsoft-Windows-Servicing provider, so the Setup-log sequence below is read from real devices, not from documentation.
The problem: a friendly sentence, a reverted device, and a ticket with no error code
The message is not an error dialog. It is a progress screen shown by a process that has already decided to reverse itself, and progress screens do not carry error codes. That is not an oversight; the code exists, it is simply written somewhere the user is never shown.
What makes this failure genuinely hard is that the same sentence is produced by two mechanisms that share almost no diagnostic surface.
The first is Component-Based Servicing. A monthly cumulative update stages its payload while Windows runs, then defers the operations it cannot perform against files in use to the next boot. If that boot-time transaction cannot be committed, the servicing stack reverses it and Windows comes up on the old revision. Nothing about Windows Setup is involved.
The second is Windows Setup. Anything that changes the build — a feature update, an enablement package promotion, an in-place repair install — runs the setup platform through four phases, and setup has a rollback branch it can take at almost any point after the first reboot.
Both end with a reverted device and a user who saw the word "undoing". They do not end with the same files on disk. Deciding which one you are holding is the whole first step, and it is the step that gets skipped.
0xC1900101 "can be thrown at any stage of the upgrade process, with the exception of the downlevel phase". That exception matters: a downlevel failure happens inside the still-running original OS, so there is nothing to roll back and the user never sees the undoing screen at all. If they saw it, setup got past the first reboot — which already narrows your search to three phases out of four.The second difficulty is time. By the time the ticket reaches you the device has been running normally for days, and every live check you can think of — service states, pending-reboot markers, component-store health — comes back clean, because it is clean. The device really is fine. It is fine at the version it was already on.
So you are not troubleshooting a broken machine. You are reconstructing an event from residue, which means the goal is not "find the fault" but something more specific.
You need four facts, and they are the same four facts every time:
- When did it start. The moment the attempt began, not the moment the user noticed.
- Which phase did it reach. The furthest point it got before turning around.
- When did it revert. The moment the rollback branch was taken, and how long it took.
- What was the code. The result and extend pair the user never saw.
With those four you have a root cause candidate and a defensible next action. Without them you have a retry.
Why it happens: the rollback is a planned branch, not a crash
The most useful thing to understand about a setup rollback is that it is prepared in advance. Microsoft's description of the SafeOS phase is explicit about it: a recovery partition is configured, Windows files are expanded, updates are installed, and "an OS rollback is prepared if needed".
In operational terms: before setup ever risks the boot that could fail, it has already built the road back. There is a dedicated operation code for it — SP_EXECUTION_OP_PREPARE_ROLLBACK, operation 09 in the extend-code table. Which is why a rollback produces tidy evidence rather than wreckage: setup is not improvising after a disaster, it is executing a branch it provisioned earlier, and that branch includes writing its own log directory.
SafeOS: prepare rollback→Rollback branch taken→$Windows.~BT\Sources\Rollback
Phase names and the prepare-rollback operation are from Microsoft's documented phase and extend-code tables. The rollback directory is the documented location of the rollback-phase log set.
The extend code is the part practitioners under-use. An upgrade failure returns two codes, and Microsoft documents how to decompose the second one: the first digit is the phase, the last two are the operation. An extend code of 0x4000D is therefore phase 4 (SP_EXECUTION_OOBE_BOOT) during operation 0D (SP_EXECUTION_OP_MIGRATE_DATA).
That single value answers question two on your list before you open a log at all.
| Extend code phase digit | Documented phase constant | What reaching it tells you |
|---|---|---|
| 1 | SP_EXECUTION_DOWNLEVEL | Failed inside the original running OS. No rollback occurs here, so the user should not have seen the undoing screen. |
| 2 | SP_EXECUTION_SAFE_OS | Failed in WinPE. Microsoft attributes this phase primarily to hardware, firmware, and non-Microsoft disk encryption. |
| 3 | SP_EXECUTION_FIRST_BOOT | Failed applying initial settings under the new OS. Microsoft calls boot failures here rare and "almost exclusively caused by device drivers". |
| 4 | SP_EXECUTION_OOBE_BOOT | Failed applying final settings. Microsoft attributes this phase most commonly to anti-virus software and filter drivers. |
| 5 | SP_EXECUTION_UNINSTALL | The uninstall path itself. Documented example codes are 0x50000 and 0x50015. |
On the servicing side the mechanism is different but the logic is the same: a transaction that could not be closed gets reversed. Microsoft's own corruption-error table contains the code that describes it almost literally — 0x8007371B, ERROR_SXS_TRANSACTION_CLOSURE_INCOMPLETE, "One or more required members of the transaction are not present".
Now the part that explains the identical second failure. A rollback restores the operating system; it does not remove the reason the operating system could not be replaced. If the cause was a filter driver, the filter driver is still loaded. If it was a corrupt profile object, the object is still on disk. Setup will reach the same phase, hit the same object, and take the same prepared branch.
Worse, the retry can fail differently, which sends people chasing the wrong thing. Microsoft documents two result codes specifically for this state: 0xC1900107 (MOSETUP_E_CLEANUP_PENDING, "A cleanup operation from a previous installation attempt is still pending. A system reboot is required") and 0xC1900216 (MOSETUP_E_ROLLBACK_PENDING, "Found pending OS rollback operation"). Neither is the original fault. Both are the residue of the attempt you did not diagnose.
%WINDIR%\Panther\setup.etl is the Windows Setup performance ETW trace — Microsoft's instruction is to open it in Event Viewer via Open Saved Log, or dump it with Wevtutil qe /lf C:\windows\panther\setup.etl. The Setup channel under Windows Logs in Event Viewer is a different artefact entirely, holding servicing package-transition records. The upgrade text logs (setupact.log, setuperr.log) are a third thing again. When someone says "check the setup log", ask which one.How to verify: build the timeline before you touch anything
Everything below is read-only until the final step. That ordering is not fussiness — the standard remediation reflexes for this symptom are unusually good at destroying the only copy of the evidence.
Windows.old. Microsoft's own quick-fix guidance notes that enabling "Clean up system files" lets you "remove previous Windows installations", and the SetupDiag documentation states plainly that if the Windows.old directory is deleted later, SetupDiag.exe is also removed. The rollback log set lives under $Windows.~BT and %WinDir%\Panther\NewOS. Clean the disk first and you have deleted the logs, the minidump, and the tool that reads them — and the only remaining honest answer to "why did it fail" becomes "we no longer know". Equally: do not lead with Get-WindowsUpdateLog -ForceFlush. On the lab device that cmdlet stops the Update Orchestrator and Windows Update services as part of flushing, which is not a read-only act on a machine you are still gathering state from.Step 1 — Decide which mechanism you are looking at
Read the build identity. If the installed build and revision are unchanged from before the maintenance window, and the KB in question was a cumulative update, you are on the servicing path and there will be no $Windows.~BT\Sources\Rollback to find. If the release changed, or was meant to, you are on the setup path.
| Value | Meaning | What to look for |
|---|---|---|
CurrentBuild | Major build number of the installed OS. | Unchanged across the window means no build transition happened. On the lab device: 26200. |
UBR | Update Build Revision — the fourth part of the version, moved by cumulative updates. | This is the one a quality-update rollback leaves behind. Lab device: 9168. Compare against the revision the target KB should have produced. |
DisplayVersion | Marketing release label. | Lab device reads 25H2. If this did not move but a feature update was targeted, the setup platform is your path. |
ProductName | Legacy product string. | A real trap: on this Windows 11 25H2 device it still reads Windows 10 Enterprise. Any script keying on ProductName to detect Windows 11 fails silently. Use CurrentBuild (>= 22000) or DisplayVersion. |
Step 2 — Read the Setup event log and pin the servicing timeline
The Setup channel is where the servicing stack records each package state transition, and Microsoft's update-corruption guidance points at it directly: "You can check the Setup event log for errors." It is the cheapest timeline you will get, because every record carries a timestamp and a package identity.
| Event ID | Message (as observed on a real device) | What it tells you |
|---|---|---|
1 | Initiating changes for a package, naming the current state and the target state. | The servicing stack accepted the request and began a transition. Marks the start of your timeline for that KB. |
2 | "Package <KB> was successfully changed to the Staged state." The same ID also reports other completed transitions, including Installed. | A transition actually completed. Read the state name in the message — Staged is not Installed. |
4 | "A reboot is necessary before package <KB> can be changed to the Installed state." | The online part finished and the rest was deferred to boot. Observed for KB5120708 on the lab device. |
1013 | Component-store corruption detection starting, including a Detection Only field. | A store scan or repair began. Detection Only: 1 distinguishes a /ScanHealth-style detection from a /RestoreHealth repair. |
1014 | Completion of the operation opened by 1013. | Pairs with 1013. An unpaired 1013 means a scan or repair was interrupted — which is itself worth correlating against the rollback time. |
Provenance, stated plainly: Microsoft publishes no event-ID catalog for the Microsoft-Windows-Servicing provider. There is no Learn page listing these IDs and their messages. Every semantic in the table above was read off a real Windows 11 25H2 device (build 26200.9168) in this lab, or inferred from its position in an observed sequence — Event 1's exact string is described rather than quoted for exactly that reason. Treat the IDs as reliable and the wording as version-dependent, and always read the state name in the message body rather than trusting the ID alone. What is documented by Microsoft is that the Setup event log is the place to look.
Note what you have now: the start time (Event 1), the point it reached (Event 4, deferred to boot), and a hard fact about the outcome (no Installed transition). Three of your four facts, from one log, on a device that looks healthy.
Step 3 — Recover the error code the user never saw
This is the step almost nobody does, and it is the one that turns a codeless ticket into a diagnosable one. When Windows Setup fails, Microsoft documents that the result code and extend code are recorded as an informational event in the Application log by Windows Error Reporting, as event 1001 with the event name WinSetupDiag02.
| Parameter | Documented meaning | What it tells you about a rollback |
|---|---|---|
P1 | The Setup Scenario. 1 = Media, 5 = WindowsUpdate, 7 = Media Creation Tool. | Whether this came down your update channel or someone ran media by hand. |
P2 | Setup Mode. x = default, 1 = Downlevel, 5 = Rollback. | The single field that confirms a rollback happened, without relying on anyone's memory of a screen. |
P4 | Install Result. 0 = Success, 1 = Failure, 2 = Cancel, 3 = Blocked. | Separates a genuine failure from a cancel or a policy block — three very different tickets. |
P5 | Result Error Code. | The missing code. 0xc1900101 here means generic rollback, so P6 becomes the important half. |
P6 | Extend Error Code. | Phase and operation. This is your "which phase did it reach" answer, e.g. 0x20017 = SafeOS, 0x4000D = second boot during data migration. |
P7 / P9 | Source OS build / New OS build. | Proves what the device was on and what it was trying to become — and therefore whether the payload was a build change at all. |
Microsoft's Windows Error Reporting article documents all ten parameters, and notes the legacy event name was WinSetupDiag01. It also warns that these event logs are only present if Windows was actually updated from one version to another.
Step 4 — Collect the rollback log set, then analyse it offline
Now go to disk. The rollback phase has its own directory, and Microsoft's log-file table is unambiguous about what belongs where. Copy the tree off the device before you read it — a copy is a preserved exhibit, a live read is one Disk Cleanup away from gone.
| Artefact | Documented phase and location | What it gives you |
|---|---|---|
setupact.log | Rollback: $Windows.~BT\Sources\Rollback | The rollback narrative itself. Microsoft's stated use: "Investigating generic rollbacks - 0xC1900101". |
setupact.log | Down-Level: $Windows.~BT\Sources\Panther | The attempt as it ran under the old OS. Microsoft calls it the starting point for rollback investigations. |
setuperr.log | Same directories as setupact.log | Errors only. Read this first; it is short. |
setupmem.dmp | $Windows.~BT\Sources\Rollback or %WinDir%\Panther\NewOS\Rollback | A minidump setup extracts if the OS bug-checked mid-upgrade. Its presence changes the whole investigation. |
setupapi.dev.log | $Windows.~BT\Sources\Rollback | Device install detail. Microsoft ties it to extend code 0x30018. |
Event logs (*.evtx) | $Windows.~BT\Sources\Rollback | Documented as supplemental rollback logs for generic rollbacks and unexpected reboots. |
%WinDir%\Panther\NewOS | Post-attempt, new-OS side | Listed by Microsoft among the folders to copy for offline SetupDiag analysis. On a rolled-back device this is the new OS's own account of itself. |
BlueBox.log | Down-Level: Windows\Logs\Mosetup | Communication between setup.exe and Windows Update. Microsoft ties it to 0xC1900107. |
Then let the tool read it. SetupDiag.exe ships with Windows Setup in all currently supported versions of Windows; setup extracts it to %SystemDrive%\$Windows.~bt\Sources, and if the upgrade has a problem, SetupDiag runs automatically. When setup invokes it, the documented parameters are /ZipLogs:False /Format:xml /Output:%windir%\logs\SetupDiag\SetupDiagResults.xml /RegPath:HKEY_LOCAL_MACHINE\SYSTEM\Setup\SetupDiag\Results.
Which means the analysis may already be sitting on the device, in a file nobody opened.
Three other documented rules matter here. FindDebugInfoFromRollbackLog extracts bug-check detail from a rollback log without needing a debugger package installed. DebugSetupMemoryDump handles setupmem.dmp when the Windows Debugging Tools are present — and Microsoft is clear that memory dumps cannot be debugged in online mode, so this is an offline-only path. FindSuccessfulUpgrade exists too, which is a useful reminder that SetupDiag will also tell you the attempt worked.
$Windows.~BT\Sources\Panther, $Windows.~BT\Sources\Rollback, %WinDir%\Panther and %WinDir%\Panther\NewOS as a single tree gives you three things a live investigation cannot: the device goes back to the user immediately, the analysis is repeatable when someone challenges your conclusion, and you have an artefact you can hand to a hardware or AV vendor. SetupDiag's /ZipLogs defaults to true when run manually, so a plain run already produces the zip for you.Step 5 — Read the rollback log the way Microsoft says to read it
Microsoft's documented procedure is specific, and it is worth following literally: find the last occurrence of the result code in the file, then read upwards. SetupDiag's documentation makes the same point in stronger terms — when multiple failures are reported, the last failure is typically the fatal one, not the first.
Two search strings are documented as high-value: Shell application requested abort and Abandoning apply due to error for object. Both mark the moment setup gave up on a specific object, and both sit next to the object's name.
Log lines carry a component tag, and the useful ones are documented too: SP (setup platform), MIG (migration engine) and CONX (compatibility information), alongside PANTHR, IBSLIB, MOUPG, DISM, CSI and CBS. A rollback narrated by MIG is a data-migration problem; one narrated by SP around a crash is a driver problem.
That last line is the one to internalise. The splash window is logged as an event in setup's own narrative, which means the user-visible message has a timestamp you can pin. Subtract it from Event 1 in the Setup channel and you have the duration of the whole attempt, which is your fourth timeline fact and often the tell for a timeout rather than a fault.
Step 6 — Correlate against the servicing events
Now put the two logs side by side. This is the step that converts artefacts into a narrative you can put in a ticket.
| Clock | Source | Record | What it pins |
|---|---|---|---|
| 01:52 | Setup channel | Event 1 — initiating changes for the package | Timeline fact 1: the attempt began here, not when the user rebooted. |
| 01:53 | Setup channel | Event 4 — reboot necessary before Installed | The online portion succeeded. Everything after this is boot-time. |
| 02:01 | Rollback setupact.log | Crash 0x0000007E detected | Timeline fact 2: the furthest point reached, and the nature of the stop. |
| 02:01 | Rollback setupact.log | Rollback: Showing splash window | Timeline fact 3: the moment the user saw "undoing changes". |
| 02:14 | Setup channel | No Event 2 for the Installed state | Confirmation the transition never completed — the negative finding. |
| — | Application log | Event 1001 WinSetupDiag02, P2=5, P5/P6 | Timeline fact 4: the code, and the phase it belongs to. |
Worked example, assembled from the documented fields and the real observed event sequence. The clock values are illustrative; the sources, event IDs and record types are the ones you will actually be reading.
Notice that no step above required the device to be in a failed state, and no step required a change to the machine. That is what makes it repeatable across a fleet.
The fix: what the rollback undid, and what it left exactly as it was
Before choosing an action, be precise about what the rollback actually accomplished, because the gap between what people assume and what is documented is where the second failure lives.
What it undid: the operating system. The device is back on the previous build and revision, bootable, and serviceable. On the setup path that reversal was pre-provisioned in SafeOS; on the servicing path the transaction was reversed and the old component versions remain current. Verify it rather than assume it — CurrentBuild and UBR are two registry reads away.
What it did not undo:
- The cause. The driver, filter driver, encryption product, corrupt profile object or bad driver package that stopped the upgrade is untouched. This is the whole reason retries reproduce.
- The pending state. Microsoft documents
0xC1900107(cleanup from a previous attempt still pending, reboot required) and0xC1900216(pending OS rollback operation found) precisely because state survives. - The disk condition. If the attempt failed on space, the residue of the attempt has made the space problem worse, not better.
- The evidence. Which is good news, briefly. The logs are still there — until someone runs a cleanup.
So the fix is never "roll back, retry". It is: read the extend code, take the documented remediation for that phase and operation, then retry once with the cause removed. Microsoft's resolution table maps several of these directly.
| Documented code pair | Phase and operation | Documented direction |
|---|---|---|
0xC1900101 - 0x20017 | SafeOS boot failure | A driver caused an illegal operation and Windows could not migrate it. Microsoft points at drivers or non-Microsoft disk encryption software, and says to open setuperr.log and setupact.log in %windir%\Panther to locate the problem driver. Hardware failure is also listed. |
0xC1900101 - 0x30018 | First boot | A device driver stopped responding to setup.exe. This is the case Microsoft ties to setupapi.dev.log. |
0xC1900101 - 0x4000D | Second boot, MIGRATE_DATA | Microsoft's instruction is to check the supplemental rollback logs for setupmem.dmp, review the rollback log, and determine the stop code — the sample above is theirs. |
0xC1900101 - 0x40017 | Second boot | Caused by a faulty driver, with anti-virus filter drivers and encryption drivers given as the examples. |
0x8007001F - 0x3000D | First boot, MIGRATE_DATA | A profile problem. Microsoft names corrupt entries under HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList and invalid files in \Users — and notes that if a previous upgrade did not complete, invalid profiles may exist in Windows.old\Users. |
That last row is a nice closing of the loop: the residue of attempt one becomes the documented cause of attempt two.
There is exactly one documented command that reverses pending servicing actions, and its scope is far narrower than its reputation. DISM /Image:<path> /Cleanup-Image /RevertPendingActions is described as a recovery option for a boot failure, reverting all pending actions from previous servicing operations. Microsoft states it is "not supported on a running operating system or a Windows PE or Windows Recovery Environment (Windows RE) image", and that it should be used "only in a system-recovery scenario on a Windows image that did not boot".
Your device booted. It is not a candidate. This is not a button for clearing a rollback you have not diagnosed.
The binaries you are actually reasoning about
Naming the executables correctly is not pedantry — half the bad advice on this symptom comes from people who think one component's log describes another component's work.
| Binary | Where it lives | Role in a rollback |
|---|---|---|
SetupDiag.exe | %SystemDrive%\$Windows.~bt\Sources during the attempt; moved under %SystemDrive%\Windows.old if the upgrade succeeds | Parses the setup and rollback logs and matches them against documented rules. Deleted with Windows.old — the reason cleanup destroys your ability to investigate. |
setup.exe / setuphost.exe | Extracted setup payload under $Windows.~bt\Sources | The upgrade drivers. setuphost.exe surfaces early failures, which is why SetupDiag has a dedicated FindSetupHostReportedFailure rule. |
GatherOsState.exe | Setup payload | Captures pre-upgrade state. Named in two documented mosetup errors: an invalid signature, and a failure to execute. |
wimmount.sys | Filter driver, registered on the system | Mounts the Windows image. Two documented SetupDiag rules exist for its registration failing or being an unrecognised build. |
TrustedInstaller.exe | C:\Windows\servicing\, alongside CbsApi.dll | File description "Windows Modules Installer". The servicing-side committer. Verified Stopped/Manual when idle on a healthy device — a very common false alarm in tickets. |
TiWorker.exe and CbsCore.dll | Versioned WinSxS servicing-stack component directory | "Windows Modules Installer Worker" and the servicing stack core. CbsCore.dll is not in System32 — a real CBS.log line on the lab device loads it from the versioned servicing-stack directory (stack 10.0.26100.9156 on a 26200 build). |
poqexec.exe | System32 | File description "Primitive Operations Queue Executor". Runs the deferred file and registry operations at boot — the phase a quality-update rollback reverses. Its log records queue creation and validation, so entries there are not proof a queue executed. |
wuaueng.dll | System32 | The update agent, versioned independently of the OS: 1509.2607.1012.0 on a device running 10.0.26200.9168. Never infer agent capability from the build number. |
MoUsoCoreWorker.exe | C:\Windows\UUS\amd64 | Update Orchestrator worker. Lives in the Unified Update Stack directory, not System32, and is serviced separately from the OS. |
One more correction while we are here: C:\Windows\WindowsUpdate.log exists but is a roughly 276-byte stub pointing at Get-WindowsUpdateLog. It is not the real log and never contains rollback detail. The real traces are ETW .etl files under C:\Windows\Logs\WindowsUpdate\ — 99 files totalling 42.5 MB on the lab device.
Proof it worked: the same three places, on a device that finished
The only honest way to close this ticket is to show the successful sequence in the same artefacts you used to characterise the failure. Same channels, same fields, different shape.
First, the Setup channel completes its transition. The failure signature was the absence of a transition to Installed; success is its presence, and the state name is in the message body.
Second, the WER event records a result rather than a reversal: on a completed upgrade the WinSetupDiag02 event carries P4 = 0 (Success) and P2 is not 5. Microsoft's article illustrates exactly this — the sample event it shows is one from a successful upgrade, which is a useful reminder that 1001/WinSetupDiag02 is not an error-only event.
Third, and this is where people go wrong: do not use Get-HotFix as your proof.
That last block is the honest baseline for this whole class of investigation. A device that rolled back last Tuesday, on a fleet where the component store has quietly repaired itself five times over its life, will show Corrupt : 0 and AutoRepairNeeded : 0 today. Those values are not evidence that nothing happened. They are evidence that the mechanisms designed to recover did their job, and that your answer has to come from the timeline, not from a live health check.
Which is the whole argument. A rollback leaves a start time, a phase, a reversal time and a code. Recover those four and "it just rolled back, try again" stops being a plan and becomes what it always was: a decision to fail again on schedule.
References
- Log files and resolving upgrade errors — the log-file table (including the rollback-phase location and supplemental rollback logs), log entry structure and component tags, and the documented procedure for analysing a setup log.
- SetupDiag — automatic execution by Windows Setup, the output and registry paths, the offline folder list including
\Windows\Panther\NewOS,setupmem.dmplocations, and the full rule catalogue includingFindRollbackFailure. - Windows error reporting — Application log event 1001, event name WinSetupDiag02, and the ten documented parameters including P2 Setup Mode = 5 (Rollback).
- Upgrade error codes — result codes, extend codes, and the phase and operation tables used to decompose the extend code.
- Upgrade issues troubleshooting — the four phases, what each does, what Microsoft attributes failures in each phase to, and the volatile
SetupProgressregistry key. - Upgrade resolution procedures — the 0xC1900101 section, the extend-code mitigation table, the published rollback-log sample, and the mosetup error list containing
MOSETUP_E_ROLLBACK_PENDINGandMOSETUP_E_CLEANUP_PENDING. - Fix Windows Update corruptions and installation failures — "You can check the Setup event log for errors", the corruption error-code table including
ERROR_SXS_TRANSACTION_CLOSURE_INCOMPLETE, and the CBS log paths. - DISM operating system package servicing command-line options —
/Cleanup-Image /RevertPendingActionsand its documented restrictions, and the pending-online-actions limitation. - Windows Setup log files and event logs — setup log locations and
%WINDIR%\Panther\setup.etl, the Windows Setup performance trace that is not the Setup event log. - Upgrade quick fixes — the basic fix list, and the Disk Cleanup step that removes previous Windows installations.
Device measurements in this post (build 26200.9168, DisplayVersion 25H2, servicing stack 10.0.26100.9156, the ProductName quirk, Setup events 2 and 4 for KB5120708, the Get-HotFix versus package-inventory gap, and the component-store self-repair history) were captured read-only from a live Windows 11 25H2 corporate device. Illustrative timestamps and assembled sample output are labelled as such at the point of use.