HomeNewsletterCommunityMVP FeedToolsArchiveBlogToday's NewsAboutServicesQuick Links Subscribe free
← Back to Blog
Windows Update Windows UpdateRollbackSetupDiagWindows SetupEvent LogsCBSPantherWindows 11

"We couldn't complete the updates, undoing changes": reconstructing a rollback from what it leaves behind

IA
Imran Awan
23 August 2026

"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.

The short version

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.

Context: Microsoft documents the upgrade as four phases — Downlevel, SafeOS, First boot, Second boot (also called the OOBE boot phase) — with a reboot between each. It also documents that the generic rollback result code 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:

  1. When did it start. The moment the attempt began, not the moment the user noticed.
  2. Which phase did it reach. The furthest point it got before turning around.
  3. When did it revert. The moment the rollback branch was taken, and how long it took.
  4. 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.

DownlevelSafeOSFirst bootSecond boot / OOBEInstalled
SafeOS: prepare rollbackRollback 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 digitDocumented phase constantWhat reaching it tells you
1SP_EXECUTION_DOWNLEVELFailed inside the original running OS. No rollback occurs here, so the user should not have seen the undoing screen.
2SP_EXECUTION_SAFE_OSFailed in WinPE. Microsoft attributes this phase primarily to hardware, firmware, and non-Microsoft disk encryption.
3SP_EXECUTION_FIRST_BOOTFailed applying initial settings under the new OS. Microsoft calls boot failures here rare and "almost exclusively caused by device drivers".
4SP_EXECUTION_OOBE_BOOTFailed applying final settings. Microsoft attributes this phase most commonly to anti-virus software and filter drivers.
5SP_EXECUTION_UNINSTALLThe 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.

Gotcha: two completely different things are called "the setup log", and mixing them up wastes an afternoon. %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.

Watch out: do not start with Disk Cleanup, and do not delete 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.

HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\
ValueMeaningWhat to look for
CurrentBuildMajor build number of the installed OS.Unchanged across the window means no build transition happened. On the lab device: 26200.
UBRUpdate 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.
DisplayVersionMarketing release label.Lab device reads 25H2. If this did not move but a feature update was targeted, the setup platform is your path.
ProductNameLegacy 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.
PowerShell (admin) - read-only build identity
# Which build is the device actually on right now? PS C:\> $k = 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion' PS C:\> Get-ItemProperty $k | Select CurrentBuild,UBR,DisplayVersion,ProductName CurrentBuild : 26200 UBR : 9168 DisplayVersion : 25H2 ProductName : Windows 10 Enterprise # Real values from the lab device. Note ProductName says "Windows 10" # on a Windows 11 25H2 machine - do not key detection logic on it. # Does the setup rollback evidence tree even exist? PS C:\> 'C:\$Windows.~BT\Sources\Rollback','C:\Windows\Panther\NewOS' | >> ForEach-Object { [pscustomobject]@{ Path=$_; Exists=(Test-Path $_) } } Path Exists ---- ------ C:\$Windows.~BT\Sources\Rollback False C:\Windows\Panther\NewOS False # Both absent on this healthy device: nothing ever ran the setup platform # here. On a rolled-back feature update, both are your primary evidence.

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 Viewer > Windows Logs > Setup (provider: Microsoft-Windows-Servicing)
Event IDMessage (as observed on a real device)What it tells you
1Initiating 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.
1013Component-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.
1014Completion 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.

PowerShell (admin) - Setup channel, newest first
# The whole timeline for one KB, in one read. No services touched. PS C:\> Get-WinEvent -LogName Setup -MaxEvents 200 | >> Where-Object { $_.Message -match 'KB5120708' } | >> Select-Object TimeCreated,Id,@{n='Msg';e={($_.Message -split "`n")[0]}} | >> Sort-Object TimeCreated TimeCreated Id Msg ----------- -- --- 8/20/2026 1:52:11 AM 1 Initiating changes for package KB5120708 ... 8/20/2026 1:52:44 AM 2 Package KB5120708 was successfully changed to the Staged state. 8/20/2026 1:53:02 AM 4 A reboot is necessary before package KB5120708 can be changed to the Installed state. 8/20/2026 2:07:38 AM 2 Package KB5120708 was successfully changed to the Installed state. # That is the shape of a SUCCESS: 1 -> 2(Staged) -> 4(reboot) -> 2(Installed). # Event IDs 2 and 4 and the Staged/reboot strings are real, captured from # this device for KB5120708. Timestamps are illustrative. # A ROLLBACK is the same sequence with the last line missing. The device # logs 4, reboots, and never records a transition to Installed. That # absence - not any error string - is your servicing-side finding.

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.

Event Viewer > Windows Logs > Application (Event ID 1001, event name WinSetupDiag02)
ParameterDocumented meaningWhat it tells you about a rollback
P1The Setup Scenario. 1 = Media, 5 = WindowsUpdate, 7 = Media Creation Tool.Whether this came down your update channel or someone ran media by hand.
P2Setup Mode. x = default, 1 = Downlevel, 5 = Rollback.The single field that confirms a rollback happened, without relying on anyone's memory of a screen.
P4Install Result. 0 = Success, 1 = Failure, 2 = Cancel, 3 = Blocked.Separates a genuine failure from a cancel or a policy block — three very different tickets.
P5Result Error Code.The missing code. 0xc1900101 here means generic rollback, so P6 becomes the important half.
P6Extend 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 / P9Source 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.

PowerShell (admin) - WinSetupDiag02 parameters (documented query)
# Microsoft's own documented query for this event: PS C:\> $events = Get-WinEvent -FilterHashtable @{LogName="Application";ID="1001";Data="WinSetupDiag02"} PS C:\> $event = [xml]$events[0].ToXml() PS C:\> $event.Event.EventData.Data # Reading a rollback: the parameters arrive in P1..P10 order. 5 # P1 scenario = WindowsUpdate 5 # P2 mode = ROLLBACK <-- confirms the reversal 9 # P3 arch = AMD64 1 # P4 result = Failure 0xc1900101 # P5 result code = generic rollback 0x4000D # P6 extend code = phase 4 (OOBE boot), op 0D (MIGRATE_DATA) # Values shown are the documented encodings, assembled to illustrate the # read. 0xC1900101 - 0x4000D is a Microsoft-documented pair: a rollback # in the second boot phase during data migration, attributed to drivers.

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.

ArtefactDocumented phase and locationWhat it gives you
setupact.logRollback: $Windows.~BT\Sources\RollbackThe rollback narrative itself. Microsoft's stated use: "Investigating generic rollbacks - 0xC1900101".
setupact.logDown-Level: $Windows.~BT\Sources\PantherThe attempt as it ran under the old OS. Microsoft calls it the starting point for rollback investigations.
setuperr.logSame directories as setupact.logErrors only. Read this first; it is short.
setupmem.dmp$Windows.~BT\Sources\Rollback or %WinDir%\Panther\NewOS\RollbackA minidump setup extracts if the OS bug-checked mid-upgrade. Its presence changes the whole investigation.
setupapi.dev.log$Windows.~BT\Sources\RollbackDevice install detail. Microsoft ties it to extend code 0x30018.
Event logs (*.evtx)$Windows.~BT\Sources\RollbackDocumented as supplemental rollback logs for generic rollbacks and unexpected reboots.
%WinDir%\Panther\NewOSPost-attempt, new-OS sideListed 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.logDown-Level: Windows\Logs\MosetupCommunication 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.

Elevated cmd - SetupDiag, offline against the preserved tree
# 1. Did Setup already do this for you? Check before running anything. C:\> dir %windir%\logs\SetupDiag\SetupDiagResults.xml C:\> reg query "HKLM\SYSTEM\Setup\SetupDiag\Results" # 2. Offline analysis of the copied tree. /LogsPath implies offline mode; # SetupDiag recurses all child directories, so point it at the parent. C:\> SetupDiag.exe /Output:D:\case\rollback.log /LogsPath:D:\case\logs SetupDiag v1.7.0.0 Copyright (c) Microsoft Corporation. All rights reserved. Searching for setup logs... Found d:\case\logs\Panther\setupact.log to be the correct setup log. Found d:\case\logs\Rollback\setupact.log to be the correct rollback log. Gathering baseline information from setup logs... SetupDiag: processing rule: FindRollbackFailure. .. SetupDiag found 1 matching issue. SetupDiag results were logged to: D:\case\rollback.log # Command form, version banner and the "correct rollback log" line follow # Microsoft's published sample output. FindRollbackFailure is a real # documented rule (GUID 3A43C9B5-05B3-4F7C-A955-88F991BB5A48) whose stated # job is to give last operation, failure phase and error when a rollback # occurs. That is precisely the reconstruction you are trying to do.

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.

Tip: copy first, analyse second, and keep the copy. Preserving $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.

$Windows.~BT\Sources\Rollback\setupact.log - documented sample
# Microsoft's published example of a rollback log for 0xC1900101 - 0x4000D: Info SP Crash 0x0000007E detected Info SP Module name : Info SP Bugcheck parameter 1: 0xFFFFFFFFC0000005 Info SP Bugcheck parameter 2: 0xFFFFF8015BC0036A Info SP Bugcheck parameter 3: 0xFFFFD000E5D23728 Info SP Bugcheck parameter 4: 0xFFFFD000E5D22F40 Info SP Can't recover the system. Info SP Rollback: Showing splash window with restoring text: Restoring your previous version of Windows. # Read it as a timeline, top to bottom: # line 1 the OS bug-checked mid-upgrade - 0x7E, unhandled kernel exception # line 2 the module name is EMPTY. Setup could not attribute the crash, # which is exactly why setupmem.dmp matters more than this log # line 3 parameter 1 = 0xC0000005, STATUS_ACCESS_VIOLATION # line 7 setup's decision point - it stops trying to go forward # line 8 the timestamp of THIS line is when the user saw the message. # Everything above it happened before they knew anything was wrong.

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.

ClockSourceRecordWhat it pins
01:52Setup channelEvent 1 — initiating changes for the packageTimeline fact 1: the attempt began here, not when the user rebooted.
01:53Setup channelEvent 4 — reboot necessary before InstalledThe online portion succeeded. Everything after this is boot-time.
02:01Rollback setupact.logCrash 0x0000007E detectedTimeline fact 2: the furthest point reached, and the nature of the stop.
02:01Rollback setupact.logRollback: Showing splash windowTimeline fact 3: the moment the user saw "undoing changes".
02:14Setup channelNo Event 2 for the Installed stateConfirmation the transition never completed — the negative finding.
Application logEvent 1001 WinSetupDiag02, P2=5, P5/P6Timeline 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:

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 pairPhase and operationDocumented direction
0xC1900101 - 0x20017SafeOS boot failureA 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 - 0x30018First bootA device driver stopped responding to setup.exe. This is the case Microsoft ties to setupapi.dev.log.
0xC1900101 - 0x4000DSecond boot, MIGRATE_DATAMicrosoft'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 - 0x40017Second bootCaused by a faulty driver, with anti-virus filter drivers and encryption drivers given as the examples.
0x8007001F - 0x3000DFirst boot, MIGRATE_DATAA 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.

BinaryWhere it livesRole in a rollback
SetupDiag.exe%SystemDrive%\$Windows.~bt\Sources during the attempt; moved under %SystemDrive%\Windows.old if the upgrade succeedsParses 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.exeExtracted setup payload under $Windows.~bt\SourcesThe upgrade drivers. setuphost.exe surfaces early failures, which is why SetupDiag has a dedicated FindSetupHostReportedFailure rule.
GatherOsState.exeSetup payloadCaptures pre-upgrade state. Named in two documented mosetup errors: an invalid signature, and a failure to execute.
wimmount.sysFilter driver, registered on the systemMounts the Windows image. Two documented SetupDiag rules exist for its registration failing or being an unrecognised build.
TrustedInstaller.exeC:\Windows\servicing\, alongside CbsApi.dllFile 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.dllVersioned 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.exeSystem32File 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.dllSystem32The 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.exeC:\Windows\UUS\amd64Update 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.

PowerShell (admin) - two views of the same device, real output
# What Get-HotFix reports (real output, lab device): PS C:\> Get-HotFix | Sort-Object InstalledOn -Descending | Select -First 5 HotFixID Description InstalledOn -------- ----------- ----------- KB5120708 Update 8/20/2026 12:00:00 AM KB5121003 Security Update 8/20/2026 12:00:00 AM KB5123304 Security Update 8/19/2026 12:00:00 AM KB5054156 Update 2/4/2026 12:00:00 AM # Four rows. Now the real package inventory on the SAME device: # Superseded : 199 # Installed : 121 # Staged : 95 # Win32_QuickFixEngineering - which is what Get-HotFix reads - returns # ONLY Component Based Servicing updates. Four rows against 121 installed # packages. A KB missing from Get-HotFix is not evidence it rolled back, # and a KB present is not evidence the transition completed. # Component store self-repair history on the same device (real values): # LifetimeTimesSuccessfullyRepaired : 5 # PreviousCorruptionDetected : 2026-03-07 09:04:47 UTC # Corrupt : 0 AutoRepairNeeded : 0 # Five historical self-repairs, zero current corruption. History is not # a fault - do not open a ticket on the counter.

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

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.

Was this post helpful?
React below — no account needed
Share this post
LinkedIn X / Twitter Reddit Bluesky

More from EndpointWeekly

Windows Update
The folders that look like corruption: Panther, $WINDOWS.~BT and…
A feature update fails and the evidence lands in hidden folders whose names read like…
Windows Update
A feature update failed and setupact.log is 547 MB: read…
Windows Setup keeps its own logs, separate from CBS.log and the WU traces. On this device…
Windows Update
The Windows patching triage decision tree: which log, which key,…
Route each patching symptom to the one evidence source that answers it. Then learn the…