HomeNewsletterCommunityMVP FeedToolsArchiveBlogToday's NewsAboutServicesQuick Links Subscribe free
← Back to Blog
Windows Update Windows UpdateFeature UpdatePantherSetupDiagWindows SetupRollbackWindows 11Troubleshooting

The folders that look like corruption: Panther, $WINDOWS.~BT and $WINDOWS.~WS after a failed feature update

IA
Imran Awan
23 August 2026

A fleet-wide disk-space alert fires. Someone opens File Explorer on the worst offender, switches on hidden items, and finds two folders sitting in the root of C: that look like the aftermath of a crash: $WINDOWS.~BT and $Windows.~WS. Dollar sign, tilde, truncated names. Everything about them reads as corruption.

They get deleted. The space comes back. Two days later the same device rolls back a feature update for the third time, the ticket escalates, and the only copy of the evidence explaining why is gone.

Those folders are not corruption. They are Windows Setup's working directories, and together with C:\Windows\Panther they are where every log that explains a failed in-place upgrade actually lives. Microsoft documents them — just not in the place most admins look.

This post is the layout: what each directory is, when each one exists, which log lands where at which phase of Setup, what survives a rollback, and how long you have before Windows takes it away. Then how to collect the whole set read-only for a support case, without touching a single byte of it.

The short version

Windows Setup runs an upgrade in four phases — Downlevel, SafeOS, First boot, Second boot — with a reboot between each, plus a fifth Uninstall phase when it fails. Each phase writes its own setupact.log, in a different directory, and Microsoft publishes the mapping: down-level goes to $Windows.~BT\Sources\Panther, rollback goes to $Windows.~BT\Sources\Rollback, and post-upgrade goes to Windows\Panther. There are therefore several setupact.log files on a failed device and only one of them is the right one. Microsoft documents a 10-day default uninstall window (range 2 to 60) for rolling back — but documents no retention period at all for the log directories, and on the lab device a Panther generation from March 2025 and $Windows.~BT residue from May 2025 were both still present in August 2026. What does disappear on success is the Sources payload: Microsoft states it is moved under Windows.old, and "if the Windows.old directory is deleted later, SetupDiag.exe is also removed". Delete Windows.old to free space and you delete the tool that reads the logs.

The problem: the evidence lives in folders that look like junk

The symptom of a failed in-place upgrade is almost always the same. The device spends an hour on Working on updates, reaches somewhere past halfway, then announces that it is undoing changes and boots back onto the build it started from. Windows Update reports the feature update as failed, usually with 0xC1900101.

Microsoft is explicit that 0xC1900101 is not a root cause. It "is generic and indicates that a rollback occurred", and the guidance is to analyse the extend code to find which phase failed. That analysis happens in log files. There is a registry verdict and an event, and both are covered below — but neither survives as reliably as the files, and neither tells you why.

Which is where the folders come in. On a device that has been through Setup you can find any of these in the root of the system drive, all hidden:

C:\ $WINDOWS.~BT Setup's boot/install working directory $Windows.~WS the download/staging pass that precedes it $WINDOWS.~LS not documented by Microsoft; absent on the lab device Windows.old the previous installation - the rollback source ESD left by the Media Creation Tool run; EMPTY here $GetCurrent Update Assistant residue; absent on the lab device $SysReset push-button reset, NOT an upgrade directory

Read from a live Windows 11 25H2 device (build 26200.9168). Only the entries marked as present were actually there — the others are listed because they are what people find and misidentify.

The naming is genuinely awful, and it is inconsistent even on disk. On the lab device the directory listing came back as $WINDOWS.~BT in full caps but $Windows.~WS in mixed case. Microsoft's own documentation writes it three ways across different articles — $Windows.~BT, $Windows.~bt and $WINDOWS.~BT. Any script that compares these names case-sensitively will miss them.

Watch out: the reflex fix for a disk-space alert is Disk Cleanup with Clean up system files ticked, which Microsoft documents will "remove previous Windows installations". Run that while an upgrade-failure investigation is open and you destroy Windows.old, the rollback path, and — per Microsoft's own SetupDiag article — SetupDiag.exe itself. Do the collection first. It takes two minutes and a few hundred megabytes.

The first command on a suspect device should therefore never be a cleanup. It should be an inventory that changes nothing.

PowerShell - read-only inventory, no elevation required
$roots = '$WINDOWS.~BT','$WINDOWS.~WS','$WINDOWS.~LS','Windows.old','ESD','$GetCurrent' foreach ($r in $roots) { $p = Join-Path 'C:\' $r if (Test-Path -LiteralPath $p) { 'PRESENT : ' + $p } else { 'absent : ' + $p } } # Test-Path only. Nothing is created, moved or deleted. PRESENT : C:\$WINDOWS.~BT PRESENT : C:\$WINDOWS.~WS absent : C:\$WINDOWS.~LS absent : C:\Windows.old PRESENT : C:\ESD absent : C:\$GetCurrent # Now the exact on-disk names and attributes, straight from the directory entry: [System.IO.DirectoryInfo]::new('C:\').GetDirectories() | Where-Object Name -like '$Windows*' | ForEach-Object { $_.Name + ' ' + $_.Attributes } $WINDOWS.~BT Hidden, Directory, NotContentIndexed $Windows.~WS Hidden, Directory, NotContentIndexed # NotContentIndexed is why Windows Search will never find setupact.log for you. # Note the casing difference between the two. It is real, not a transcription slip.

Two things in that output matter more than they look. Hidden explains why nobody has ever seen these folders. NotContentIndexed explains why searching the drive for setupact.log comes back empty even when four copies of it are sitting there.

On the lab device the owner of both working directories was BUILTIN\Administrators, while C:\Windows\Panther was owned by NT AUTHORITY\SYSTEM. That matters for collection: you can read Panther as an admin, but a plain file copy of some of its contents needs the backup privilege, which is covered further down.

Why it happens: four phases, four working directories

The layout stops looking arbitrary the moment you know how Setup executes. Microsoft's description is blunt: "the upgrade process consists of four phases that are controlled by Windows Setup: Downlevel, SafeOS, First boot, and Second boot. The computer will reboot once between each phase." A fifth phase, Uninstall, "occurs if upgrade is unsuccessful".

Downlevel->SafeOS (WinPE)->First boot->Second boot / OOBE->Done
Uninstall<-any phase fails->rollback to previous OS

Now the directories make sense. The down-level phase runs inside the old operating system. It cannot log into the new C:\Windows, because the new C:\Windows does not exist yet. So Setup creates its own workspace on the system drive and logs there.

Microsoft states the location directly: "During the upgrade process, Windows Setup extracts all its source files, including SetupDiag.exe, to the %SystemDrive%\$Windows.~bt\Sources directory." Everything the upgrade needs — the setup host, the setup platform, the diagnostic tool, the image — lands under there. Its log subdirectory is Panther.

The lab device confirms it from Setup's own mouth. The first lines of a real down-level setupact.log print the paths the host chose:

C:\$WINDOWS.~BT\Sources\Panther\setupact.log - first lines, real device
2025-05-14 11:24:05, Info MOUPG *************** SetupHost Logging Begin *************** 2025-05-14 11:24:05, Info MOUPG SetupHost::Initialize 2025-05-14 11:24:05, Info MOUPG SetupHost::Initialize: ModulePath = [C:\$WINDOWS.~BT\Sources] 2025-05-14 11:24:05, Info MOUPG SetupHost::Initialize: WorkingPath = [C:\$WINDOWS.~BT\Sources] 2025-05-14 11:24:05, Info MOUPG SetupHost::Initialize: LoggingPath = [C:\$WINDOWS.~BT\Sources\Panther] 2025-05-14 11:24:05, Info MOUPG SetupHost::Initialize: MediaPath = [D:] 2025-05-14 11:24:05, Info MOUPG SetupHost::Initialize: InstallFilePath = [D:\Sources\Install.wim] 2025-05-14 11:24:05, Info MOUPG SetupHost::Initialize: CmdLine = [/Install /Media /InstallFile "D:\Sources\Install.wim" /MediaPath "D:"] 2025-05-14 11:24:05, Info MOUPG SetupHost::Initialize: Mode = [0x2] 2025-05-14 11:24:05, Info MOUPG SetupHost::Initialize: Scenario = [0x1] # LoggingPath is the documented down-level Panther path, printed by Setup itself. # CmdLine tells you the trigger: this run came from mounted media at D:, not from WU. # MOUPG is one of the documented log component tags. So are SP, MIG, CONX and CBS.

That header is the single most useful block in the whole directory. It tells you the working root, the log root, the source of the image and the exact command line that started the run — before you have read a single error.

Down-level Panther versus the post-upgrade Panther

Once the new OS boots, logging moves. Microsoft's log table places the post-upgrade setupact.log at Windows\Panther, described as "information about setup actions during the installation", to be used to "investigate post-upgrade related issues". The same directory holds miglog.xml, which "contains information about what was migrated during the installation".

So there are two distinct Panther directories and they are not interchangeable:

"Large" is not a figure of speech. On the lab device, whose last real in-place upgrade completed on 15 March 2025:

C:\Windows\Panther 284 files, 2,281,660,534 bytes (2.12 GiB) setupact.log 573,433,781 bytes 547 MiB, one file setuperr.log 9,099 bytes read this one first MigLog.xml 336,444,054 bytes what migrated WinSetupMon.log 11,924,452 bytes diagwrn.xml / diagerr.xml 2,901,430 / 38,472 bytes setup.etl 1,552,384 bytes Setup performance ETW trace NewOs\Panther\ present, EMPTY here Rollback\ pre-upgrade snapshot UnattendGC\ OOBE-phase logs Journals\ 3 x MigJournal.xml setup.exe\ a DIRECTORY named setup.exe

A 547 MiB single-file setupact.log is a real constraint. It will not open in Notepad in any useful time, and it is the reason Microsoft's own advice is to "review the entries in the Setuperr.log file first, then the Setupact.log file second". Nine kilobytes of errors beats half a gigabyte of information.

Gotcha: C:\Windows\Panther\setup.exe on the lab device is a directory, with attributes Directory, Compressed, NotContentIndexed — not an executable. Scripts that enumerate Panther looking for files, and security tooling that flags an unexpected setup.exe under C:\Windows, will both get this wrong. Check the type before you act on the name.

The rollback directories

Rollback gets its own space, and Microsoft names two locations for it. The down-level rollback log is at $Windows.~BT\Sources\Rollback, holding "information about actions during rollback" and used for "investigating generic rollbacks - 0xC1900101". Alongside it sit the supplemental rollback artefacts: Setupmem.dmp, setupapi.dev.log and event logs (*.evtx).

Setupmem.dmp is worth knowing by name. Microsoft: "if the bug check occurs during an upgrade, Windows Setup extracts a minidump (setupmem.dmp) file", created "in either %SystemDrive%\$Windows.~bt\Sources\Rollback, or in %WinDir%\Panther\NewOS\Rollback depending on when the bug check occurs". If an upgrade bugchecks, that file is your dump — and it will not be in C:\Windows\Minidump.

The second rollback location, C:\Windows\Panther\Rollback, is the one nobody talks about, and it is the most interesting directory on the disk. It is not a log folder. It is a snapshot of the machine's pre-upgrade boot and servicing state, kept so the uninstall path has something to restore from. On the lab device:

C:\Windows\Panther\Rollback\ rollbackinfo.ini 1,817 bytes the rollback plan itself checkpoint.info 512 bytes rollbackstate.dat 1 byte TrackedVolumes.ini 1,736 bytes FolderMoveLog.TXT 2,218,528 bytes every folder Setup moved LogRestore.TXT 62 bytes UTF-16, one path WinSetupMon.DAT 19,448 bytes EFI\Microsoft\Boot\ 145 files, 27,934,763 bytes old boot files BCD, bootmgfw.efi, bootmgr.efi, memtest.efi, SecureBootRecovery.efi, CIPolicies\Active\*.cip, Fonts\, *.mui MachineIndependent\Transformers\CBS\ a KTM transaction log set Rollback, Rollback.LOG1, Rollback.LOG2, Rollback{<guid>}.TM.blf, Rollback{<guid>}.TMContainer* boot_volume\WinLH\WinSxS\{Manifests,Temp\InFlight,Temp\PendingRenames} WinPE\setupapi\setupapi.offline.log 478,564 bytes SafeOS driver log

Read that as a design, not a list. Setup preserved 26.6 MiB of the previous EFI boot files — boot manager, BCD, code-integrity policies, boot fonts — so a rollback can put the old boot path back exactly. It preserved a Kernel Transaction Manager log set for Component-Based Servicing, so a half-applied servicing transaction can be unwound. And it kept the SafeOS-phase setupapi.offline.log, which is precisely the log Microsoft points you at for driver-install failures during the offline servicing sub-phase.

LogRestore.TXT is 62 bytes of UTF-16 and its entire content is one path: \$WINDOWS.~BT\Sources\Panther. It is a note Setup left itself about where to restore logs from. That single file is the clearest possible statement that the working directory and the Panther tree are two halves of one mechanism.

The rollback plan itself is readable. rollbackinfo.ini on the lab device carries the boot-entry GUIDs for the down-level OS, the rollback entry and the new OS, a [Quarantine.WinOld] section naming Windows.old, and a [Quarantine.NewPaths] list of exactly the six top-level directories Setup intends to swap:

C:\Windows\Panther\Rollback\rollbackinfo.ini - real device, GUIDs and SIDs redacted
[Flow] RollbackMode=0 CurrentPhase=OOBEBoot,Start RollbackActive=1 PostRollbackShutdown=TRUE CurrentOperation=165,end OperationResult=0 [BootEntries] DownlevelOS={9392CE58-....} DownlevelDefault={9392CE58-....} Rollback={7254A080-....} RollbackExternal=No NewOS={658E0E47-....} [RecoveryPartition] Backup=Yes Setup=Yes [Quarantine.WinOld] 0=GlobalPath,Yes,{...},0,290455552,1820697348,Windows.old [Quarantine.NewPaths] 0=...,PerfLogs 1=...,Program Files 2=...,Program Files (x86) 3=...,ProgramData 4=...,Users 5=...,Windows # RollbackActive=1 with OperationResult=0 is a prepared, unused rollback. # [Quarantine.NewPaths] is the swap list: those six directories are what # moves aside into Windows.old if the uninstall phase ever runs. # The real file also holds a [Profiles] section mapping user SIDs to old and # new profile paths. Redact that before it goes into a ticket.
Context: the phase that failed is encoded in the error you already have. Microsoft's extend code reads as one hex digit of phase plus two of operation: 1 = SP_EXECUTION_DOWNLEVEL, 2 = SP_EXECUTION_SAFE_OS, 3 = SP_EXECUTION_FIRST_BOOT, 4 = SP_EXECUTION_OOBE_BOOT, 5 = SP_EXECUTION_UNINSTALL. So 0xC1900101 - 0x4000D is "phase 4, data migration", which tells you to open the second-boot logs under Windows\Panther rather than the down-level ones. Use the code to choose the directory.

What $Windows.~WS actually is, and what Microsoft does not say

Here the honest answer matters. $Windows.~BT appears by name in Microsoft's upgrade log tables, in the SetupDiag article and in the setup memory-dump guidance. $Windows.~WS appears in none of them. There is no Microsoft product documentation that defines it, states its layout, or says what the letters stand for. The only Microsoft-hosted mentions are community answers on Microsoft Q&A, which are not product documentation.

What can be established without guessing is that it is a genuine Setup working directory with the same internal shape — because a Microsoft-signed Setup binary prints its path and complains about it. From the lab device's own $Windows.~WS error log:

C:\$Windows.~WS\Sources\Panther\setuperr.log - real device, excerpt
2025-05-14 08:26:47, Error MOUPG CDlpTransportBits::Prepare(1232): Result = 0x80070006 2025-05-14 08:26:47, Error MOUPG Cancelling BITS job due to error: 0x80070006 2025-05-14 08:26:47, Error MOUPG CSetupManager::ExecuteDownloadMode(10934): Result = 0x80070006 2025-05-14 08:26:47, Error MOUPG CSetupManager::ExecuteDownlevelMode(605): Result = 0x80070006 2025-05-14 08:26:50, Error MOUPG SetupHost: Diagnostic tool does not exist [C:\$Windows.~WS\Sources\SetupDiag.exe][gle=0x00000002] 2025-05-14 08:26:50, Error MOUPG CSetupHost::ExecuteDiagnosticAnalysis(1768): Result = 0x80070003 # Setup expected SetupDiag.exe under $Windows.~WS\Sources - the same relative # path Microsoft documents for $Windows.~BT\Sources. Same layout, different root. # ExecuteDownloadMode: this directory is the DOWNLOAD pass, not the install pass. # net helpmsg 6 = "The handle is invalid." net helpmsg 2 = file not found.

Note the phrase ExecuteDownloadMode. On the lab device the $Windows.~WS logs are timestamped 08:25 to 08:28 and the $WINDOWS.~BT logs 11:24 — same day, three hours earlier. $Windows.~WS also contains Eula.rtf, which an install pass has no reason to stage. The ordering and the contents both say: download and staging first, install second.

One further clue sits in the same file: another failing object in that directory is named CDlpActionGetWebSetupUserInput. "Web setup" is suggestive of what the WS might stand for. It is not confirmation, Microsoft has never stated it, and this post is not going to assert it. Treat $Windows.~WS as an undocumented-but-real Setup working directory that carries a Sources\Panther log set worth collecting.

How to verify: read the directories in phase order

The published mapping is the spine of the whole diagnostic. Here it is in the order you will walk it, with the paths as Microsoft writes them.

PhaseLog and locationWhat it is for
Pre-initialization (before down-level)setupact.log in Windows"If setup fails to launch." Nothing else got written, so this is all you have.
Down-level (Windows Update side)BlueBox.log in Windows\Logs\Mosetup"Communication between setup.exe and Windows Update." Use for WSUS and WU down-level failures and 0xC1900107.
Down-levelsetupact.log in $Windows.~BT\Sources\Panther"All downlevel failures and starting point for rollback investigations." Microsoft calls this the most important log for diagnosing setup issues.
SafeOS (WinPE)setupapi.offline.log; on the lab device under Windows\Panther\Rollback\WinPE\setupapiDriver failures in the offline servicing sub-phase. Pairs with extend-code phase 2.
Rollback (any phase)setupact.log in $Windows.~BT\Sources\Rollback"Investigating generic rollbacks - 0xC1900101." Its presence is itself the evidence that a rollback ran.
Rollback - supplementalSetupmem.dmp, setupapi.dev.log, *.evtx in $Windows.~BT\Sources\RollbackBugcheck minidump, device-install issues (0x30018), unexpected reboots.
OOBE / second bootsetupact.log in $Windows.~BT\Sources\Panther\UnattendGC; also %windir%\panther\unattendGCOOBE-phase rollbacks and operations 0x4001C through 0x4001F.
Post-upgrade (after OOBE)setupact.log, setuperr.log, miglog.xml in Windows\Panther"Investigate post-upgrade related issues" and "identify post upgrade data migration issues."
New-OS generationWindows\Panther\NewOSNamed by Microsoft as one of the four folders to copy for offline analysis. Present but empty on the lab device.
Automatic diagnosisSetupDiagResults.xml in %WinDir%\Logs\SetupDiagWhere Setup's own automatic SetupDiag run writes its verdict.

Paths from Microsoft's upgrade log-files table, the SetupDiag article and the Windows Setup log-files reference. One caveat from the real device: on disk the folder is NewOs, not NewOS. Case-insensitive on NTFS, but worth knowing if you are string-matching output.

The decision path

Work these in order. Each step either explains the failure or hands you the next directory.

  1. Did Setup even start? Check C:\Windows\Logs\Mosetup\BlueBox.log. It records the handoff between setup.exe and Windows Update, and its first lines name the build and the command line that launched the attempt. No BlueBox entries for the date in question means the run never reached Setup.
  2. Was there a download or staging pass? If C:\$Windows.~WS\Sources\Panther exists, read its setuperr.log. Failures here are transport failures — BITS, media, offer selection — and they happen before any system change.
  3. Read the down-level header. Open the first twenty lines of C:\$WINDOWS.~BT\Sources\Panther\setupact.log and record LoggingPath, CmdLine, Mode and Scenario. This tells you what kind of run you are debugging before you debug it.
  4. Read errors before actions. setuperr.log in the same directory, then the matching setupact.log. Microsoft's search strategy is to find the last occurrence of the result code and then look upward, and to grep for the strings Shell application requested abort and Abandoning apply due to error for object.
  5. Did it roll back? The existence of C:\$WINDOWS.~BT\Sources\Rollback answers this. If it is there, that is the authoritative log for a 0xC1900101. Check the same directory for Setupmem.dmp.
  6. Check Setup's own verdict. Read C:\Windows\Logs\SetupDiag\SetupDiagResults.xml and the registry copy. Setup runs SetupDiag automatically on failure, so the analysis may already be done for you.
  7. Decode the codes. Split the result code from the extend code. Take the last four hex digits of the result code and look them up as a Win32 error or NTSTATUS value; take the first digit of the extend code as the phase.
  8. Only now look at C:\Windows\Panther. If the failure was down-level, this directory is describing a different, earlier run and will send you chasing ghosts. Check its file timestamps against the failure date before you trust a single line of it.

Step 6 is where most investigations should end, because Setup usually did the work for you. On the lab device the automatic run had already matched a documented rule:

C:\Windows\Logs\SetupDiag\setupdiagresults.xml - real device, 1,081 bytes
<SetupDiag> <Version>1.7.0.0</Version> <ProfileName>FindAbruptDownlevelFailure</ProfileName> <ProfileGuid>55882B1A-DA3E-408A-9076-23B22A0472BD</ProfileGuid> <LogErrorLine>2025-05-14 11:24:17, Error MOUPG CSetupResponseTemplate&lt;class IDlpResponse&gt;::OnCancel(240): Result = 0x800704C7</LogErrorLine> <FailureDetails>ErrorCode = 0x800704C7, ExCode = 0x40004</FailureDetails> </SetupDiag> # FindAbruptDownlevelFailure is a documented SetupDiag rule, and that GUID # matches the published rule table exactly. Microsoft's description: # "last operation failure information when the system fails in the downlevel, # but the log just ends abruptly." # Decode the result code using Windows itself - no lookup table needed: net helpmsg 1223 The operation was canceled by the user. # 0x800704C7 -> last four digits 04C7 -> 1223 -> ERROR_CANCELLED. # And the log line literally says OnCancel. The upgrade did not break. It was stopped.

That is the whole point of reading before fixing. A device that reports a failed feature update, with a rollback-flavoured generic code, turned out to have been cancelled. No driver to chase, no image to rebuild, no ticket.

Where Setup keeps its verdict in the registry

Two of the steps above have registry equivalents, which is useful when you are collecting from a fleet rather than sitting at one keyboard. Setup writes its automatic diagnosis to a fixed key.

HKLM\SYSTEM\Setup\SetupDiag\Results
ValueMeaningWhat to look for
ProfileNameThe SetupDiag rule that matched, by name.A named rule is a diagnosis. FindSuccessfulUpgrade means the last run worked; FindRollbackFailure or FindAbruptDownlevelFailure mean it did not.
ProfileGuidThe rule's unique identifier.Cross-check against Microsoft's published rule table so you are reading the right description, not the closest-sounding one.
FailureDetailsResult code plus extend code, pre-split.ErrorCode feeds net helpmsg; the first digit of ExCode is the phase, which picks your directory.
HostOSVersion / TargetOSVersionBuild the device was on, and the build it was going to.If these are the same family, you are looking at a repair or media re-install, not a version upgrade. That changes what you investigate.
UpgradeStartTime / UpgradeEndTime / UpgradeElapsedTimeWhen the attempt ran and for how long.Match against the log timestamps so you know which Panther generation belongs to which attempt. A 27-second elapsed time is not a failed migration.
RollbackStartTime / RollbackEndTimeWhen the uninstall phase ran.01/01/0001 00:00:00 means no rollback occurred. A real timestamp means go and read Sources\Rollback.
SetupDiagVersionVersion of the tool that produced the verdict.Older versions carry fewer rules. Microsoft recommends re-running the current download for a second opinion.

Two neighbouring keys are worth knowing. When SetupDiag is run manually without /RegPath, its default target is HKLM\SYSTEM\Setup\MoSetup\Volatile\SetupDiag — a different key from the automatic one, which is a genuine trap when you compare devices. And during an upgrade in flight, Microsoft documents progress at HKLM\System\Setup\mosetup\volatile\SetupProgress: "this key is volatile and only present during the upgrade process; it contains a binary value in the range 0-100". Volatile means gone after the reboot, so it is a live-monitoring value only.

The one event log entry that matters, and why it may not be there

Microsoft documents exactly one Windows Error Reporting event for Setup failures, and it lives in the Application channel.

Event Viewer -> Windows Logs -> Application
Event IDEvent name and messageWhat it tells you
1001WinSetupDiag02 — an informational Windows Error Reporting event carrying ten parametersThe result code and extend code for the attempt, plus source and target builds. Microsoft notes it is also written on a successful upgrade, so its presence alone is not a failure signal — read parameter P4.
1001WinSetupDiag01 — the legacy event nameSame role on older operating systems. Search for both names or you will conclude nothing was logged.

The ten parameters are documented, and P5 and P6 are the two you came for:

ParameterMeaningDocumented values or example
P1The Setup scenario1 = Media, 5 = Windows Update, 7 = Media Creation Tool
P2Setup modex = default, 1 = Downlevel, 5 = Rollback
P3New OS architecturex = default, 0 = X86, 9 = AMD64
P4Install resultx = default, 0 = Success, 1 = Failure, 2 = Cancel, 3 = Blocked
P5Result error code0xc1900101
P6Extend error code0x20017
P7 / P8Source OS build and branch9600; branch "not typically available"
P9 / P10New OS build and branch16299; rs3_release

Now the reason the directories matter more than the events. On the lab device, which has two documented Setup failures on record from May 2025, a scan of the Application channel returned zero matching WinSetupDiag events. The log had wrapped. Microsoft also flags that these entries "are only available if Windows was updated from a previous version of Windows to a new version of Windows".

The XML in C:\Windows\Logs\SetupDiag, the registry copy under HKLM\SYSTEM\Setup\SetupDiag\Results, and the Panther logs were all still there fifteen months later. The file evidence outlives the event evidence. Plan your collection around the files.

The fix: collect the set read-only, then decide

For this class of problem the fix is not a repair command. It is a collection, done before anything else, because every subsequent action — retrying the upgrade, running Disk Cleanup, letting Storage Sense loose — overwrites or removes what you need.

Microsoft names the folders to take. From the SetupDiag article: "For offline processing, SetupDiag should be run against the contents of the entire folder", and depending on when the upgrade failed, copy one of \$Windows.~bt\sources\panther, \$Windows.~bt\Sources\Rollback, \Windows\Panther or \Windows\Panther\NewOS. Critically: "if the parent folder and all subfolders are copied, SetupDiag automatically searches for log files in all subdirectories".

So take the parents, not individual files. Copy, never move.

Elevated PowerShell - copies only, source untouched
# One collection root, stamped, so two devices never collide. $dest = 'C:\SetupEvidence\' + $env:COMPUTERNAME + '_' + (Get-Date -Format 'yyyyMMdd-HHmm') New-Item -ItemType Directory -Path $dest -Force | Out-Null $sources = @( 'C:\$WINDOWS.~BT\Sources\Panther', 'C:\$WINDOWS.~BT\Sources\Rollback', 'C:\$WINDOWS.~WS\Sources\Panther', 'C:\Windows\Panther', 'C:\Windows\Logs\Mosetup', 'C:\Windows\Logs\SetupDiag' ) foreach ($s in $sources) { if (-not (Test-Path -LiteralPath $s)) { 'skip (absent): ' + $s; continue } $leaf = ($s -replace '[:\\$~.]','_') robocopy $s (Join-Path $dest $leaf) /E /B /R:1 /W:1 /NFL /NDL /NJH /NP | Out-Null 'copied: ' + $s } # /E keep empty subdirs - an empty NewOs\Panther is itself a finding # /B backup mode, uses SeBackupPrivilege for the SYSTEM-owned Panther tree # no /MOV and no /MIR - the originals are never modified or deleted copied: C:\$WINDOWS.~BT\Sources\Panther skip (absent): C:\$WINDOWS.~BT\Sources\Rollback copied: C:\$WINDOWS.~WS\Sources\Panther copied: C:\Windows\Panther copied: C:\Windows\Logs\Mosetup copied: C:\Windows\Logs\SetupDiag # Then the registry verdict, and finally one archive for the support case: reg.exe export "HKLM\SYSTEM\Setup\SetupDiag" ($dest + '\SetupDiag_Results.reg') /y Compress-Archive -Path ($dest + '\*') -DestinationPath ($dest + '.zip')
Tip: size the collection before you run it. On the lab device C:\Windows\Panther alone is 2.12 GiB, dominated by a 547 MiB setupact.log and a 321 MiB MigLog.xml. The two working-directory Panther sets are trivial by comparison: 112,860 bytes under $WINDOWS.~BT and 330,306 bytes under $Windows.~WS, seven files each. If bandwidth is the constraint, take the working directories and setuperr.log first — they are almost always where the answer is — and pull the full Panther tree only if you need it.

With the copies in hand, run the analysis offline. SetupDiag switches to offline mode automatically once /LogsPath is supplied; the old /Mode parameter is deprecated:

Offline analysis on your workstation, not the user's device
SetupDiag.exe /Output:C:\SetupEvidence\Results.xml /Format:xml /LogsPath:C:\SetupEvidence\PC01_20260823-1104 # /LogsPath alone puts SetupDiag in offline mode. It recurses all subdirectories, # so pointing it at the collection root is enough. # Requires .NET Framework 4.7.2 or newer, and an elevated prompt. # If a bugcheck was involved, gather setupmem.dmp too. It is in either # %SystemDrive%\$Windows.~bt\Sources\Rollback or # %WinDir%\Panther\NewOS\Rollback # and needs the Windows Debugging Tools installed to be decoded.

One catch that catches everybody: SetupDiag.exe may not exist on the failed device. Microsoft is explicit that on a normal upgrade "the Sources directory including SetupDiag.exe is moved under %SystemDrive%\Windows.Old for cleanup", and "if the Windows.old directory is deleted later, SetupDiag.exe is also removed". The lab device proves the outcome: Windows.old is gone, and SetupDiag.exe is present in neither System32 nor the surviving $WINDOWS.~BT\Sources. Download the current build from Microsoft rather than hunting for a local copy.

How long you actually have

This is where documentation and folklore diverge, so it is worth being precise about which is which.

Documented. The rollback capability is time-boxed. DISM exposes it directly with /Get-OSUninstallWindow, /Set-OSUninstallWindow /Value:<days>, /Initiate-OSUninstall and /Remove-OSUninstall. The stated behaviour: "if you specify a value less than two or greater than 60, the system uses the default value of 10", with the warning "if days elapsed since installation is greater than this value, you cannot go back to the old version of Windows". The same numbers appear in the MDM policy Update/ConfigureFeatureUpdateUninstallPeriod: allowed range [2-60], default value 10.

Not documented. Microsoft publishes no retention period for $Windows.~BT, $Windows.~WS or C:\Windows\Panther. There is no stated number of days, no documented scheduled task that removes them on a timer, and no supported setting that extends their life. Anyone quoting a figure for those three is guessing.

The lab device is a data point rather than a rule, and it points the reassuring way: the C:\Windows\Panther generation dated 15 March 2025 and the $WINDOWS.~BT and $Windows.~WS residue dated 14 May 2025 were all still present when this was written in August 2026. Seventeen and fifteen months, untouched, on a managed corporate build. What is gone is Windows.old — which is exactly the thing the documented 10-day window governs.

Elevated command prompt - what an expired window looks like
dism.exe /Online /Get-OSUninstallWindow Deployment Image Servicing and Management tool Image Version: 10.0.26200.9168 Error: 1168 Element not found. The DISM log file can be found at C:\WINDOWS\Logs\DISM\dism.log # net helpmsg 1168 -> "Element not found." # There is no uninstall window because there is no uninstall data: # C:\Windows.old is absent on this device. Rollback is off the table. # The Panther logs, however, are all still present. Different lifecycles. # A device still inside the window returns a number of days instead of 1168. # Run this BEFORE you promise anyone a rollback.

Two more honest notes on cleanup mechanics. On the lab device the scheduled tasks present under \Microsoft\Windows\Setup\ were PITRTask and SetupRecoveryDataTask, both Ready. Neither is documented in Microsoft's upgrade-logs articles, so do not build a retention story on either. And C:\Windows\Panther\UnattendGC\setupact.log carried that day's timestamp, seventeen months after the upgrade, so Panther is not a frozen archive. Check each file's modified time individually rather than assuming the whole tree belongs to one event.

Gotcha: the 10-day clock and the log directories are on different lifecycles, and conflating them causes real damage. The clock decides whether you can still roll the device back. It says nothing about whether the logs survive. So "we are past 10 days, the evidence is gone" is wrong, and "the logs are still there, so we can still roll back" is also wrong. Query the window with DISM; check the directories with Test-Path. They are separate questions with separate answers.

The binaries, and why the diagnostic tooling disappears

One structural fact explains a lot of frustration: almost none of the upgrade tooling is part of the installed operating system. It ships inside the Setup payload, lives in the working directory, and goes away with it.

FileWhat it doesWhere it lives - checked on the lab device
SetupHost.exeThe down-level setup host. Writes every MOUPG-tagged line, including the SetupHost::Initialize header with the paths.Not OS-resident. Absent from System32 and absent from the surviving $WINDOWS.~BT\Sources. Present only during a run.
SetupPlatform.exeThe setup platform. Source of the SP-tagged lines and of the SETUPPLATFORMEXE entries in setuperr.log.Not OS-resident. Its output is all over the real Panther logs; the binary itself is gone.
SetupDiag.exeParses the logs against a rule set and names the failure. Setup runs it automatically when an upgrade fails.Documented as extracted to %SystemDrive%\$Windows.~bt\Sources, then moved to Windows.old on success. Absent here, because Windows.old is absent.
wimgapi.dllWindows Imaging Library. The API that reads and applies install.wim.OS-resident: C:\Windows\System32\wimgapi.dll, version 10.0.26100.8457.
wimmount.sys"Wim file system Driver". Mounts the image so Setup can apply it. The target of SetupDiag's WimMountFailure and WimMountDriverIssue rules.OS-resident: C:\Windows\System32\drivers\wimmount.sys, version 10.0.26100.8972.
sysprep.exeSystem Preparation Tool. Has its own documented Panther log directory at %WINDIR%\System32\Sysprep\Panther.OS-resident: C:\Windows\System32\Sysprep\sysprep.exe, version 10.0.26100.1. The Panther subdirectory does not exist on a device that was never sysprepped.

There is one more artefact worth flagging honestly. C:\Windows\Panther contains WinSetupMon.log at 11,924,452 bytes, and Panther\Rollback\WinSetupMon.DAT at 19,448 bytes. Whatever produced them is not resident: there is no WinSetupMon.sys in System32\drivers and no WinSetupMon service key on the device. Collect the two files; do not theorise about the producer.

Proof it worked: one failed run rebuilt from four directories

Here is the whole method applied to a single real incident, reconstructed on a live machine fifteen months after the fact, entirely from files nobody had touched.

Reconstruction from on-disk evidence - real device, four directories
# [1] Windows\Logs\Mosetup\BlueBox.log - what launched it 2025-05-13 12:22:45: BuildInfo: [10.0.26100.1 (ge_release.240331-1435)] 2025-05-13 12:22:45: CommandLine: ["C:\Temp\mediacreationtool.exe" ] 2025-05-13 12:22:45: Opening Box: [C:\Temp\mediacreationtool.exe] # -> not Windows Update. A hand-run Media Creation Tool. # [2] C:\$Windows.~WS\Sources\Panther - the download pass, 08:25-08:28 next day 08:26:47, Error MOUPG Cancelling BITS job due to error: 0x80070006 08:26:47, Error MOUPG CSetupManager::ExecuteDownloadMode(10934): Result = 0x80070006 08:26:50, Error MOUPG SetupHost: Diagnostic tool does not exist [C:\$Windows.~WS\Sources\SetupDiag.exe] # -> download mode failed. net helpmsg 6 = "The handle is invalid." # [3] C:\$WINDOWS.~BT\Sources\Panther - the install pass, 11:24:05-11:24:42 11:24:05, Info MOUPG SetupHost::Initialize: CmdLine = [/Install /Media ... Install.wim] 11:24:17, Error MOUPG CSetupResponseTemplate<class IDlpResponse>::OnCancel(240): 0x800704C7 11:24:17, Error MOUPG CDlpActionDU::ExecuteDUSetup(2391): Result = 0x800704C7 11:24:32, Error MOUPG CSetupManager::ExecuteDownlevelMode(610): Result = 0x800704C7 11:24:42, Info MOUPG **************** SetupHost Logging End **************** # -> media-based retry, stopped 12 seconds in, during Dynamic Update setup. # [4] HKLM\SYSTEM\Setup\SetupDiag\Results - Setup's own verdict, 11:24:41 ProfileName : FindAbruptDownlevelFailure FailureDetails : ErrorCode = 0x800704C7, ExCode = 0x40004 HostOSVersion : 10.0.26100 TargetOSVersion : 10.0.26100.3624 (ge_release_svc_prod3.250321-2034) UpgradeElapsedTime : 00:00:27 RollbackStartTime : 01/01/0001 00:00:00 # -> 27 seconds. No rollback ran. Same build family, so this was never # a version upgrade - it was a media re-install of 26100. # net helpmsg 1223 -> "The operation was canceled by the user." # Verdict: nothing was broken. Someone started it and stopped it. Twice.

Five facts fell out of that, none of which were available from Windows Update, the Application event log or any dashboard: the trigger was a manual tool rather than policy; the first attempt died in transport; the second attempt was media-based; it was cancelled 12 seconds in and the whole run lasted 27 seconds; and no rollback ever executed, so nothing on the device was left half-applied. All of it read-only, in under five minutes.

The RollbackStartTime of 01/01/0001 00:00:00 is the check to keep in your head. A zero there means no uninstall phase ran, which means there is no Sources\Rollback to read and no partially-reverted state to worry about — and the absence of that directory on the device matched, exactly as it should.

One wrinkle that looks like a problem and is not

The lab device reports DisplayVersion 25H2 on build 26200.9168, with a servicing stack at 10.0.26100.9156. Yet the newest full Panther generation on disk is from March 2025 and Windows.old is absent entirely. On the face of it, a version change with no upgrade evidence.

The explanation is the shape of that release, not missing logs. A 25H2 build sitting on a 26100 servicing base arrived through an enablement package rather than a Setup-driven in-place upgrade, so there was no down-level phase, no image apply and no migration — and consequently no new Panther generation and no Windows.old to create.

Context: this changes what "no evidence" means. If a device's DisplayVersion moved and there is no fresh Panther generation, that is consistent with an enablement-package release and is not a sign that logs were deleted. If a device's DisplayVersion did not move and there is a fresh $Windows.~BT with a Sources\Rollback subdirectory, that is a failed in-place upgrade and the evidence is right there. Check both before you conclude anything about retention.

What good looks like, then, is unglamorous. On a device that upgraded cleanly: a C:\Windows\Panther generation whose timestamps match the upgrade date, a setuperr.log of a few kilobytes containing migration warnings you can safely ignore, no $Windows.~BT\Sources\Rollback at all, a SetupDiag profile of FindSuccessfulUpgrade, and — for as long as the uninstall window lasts — a Windows.old plus a DISM query that returns a number of days instead of error 1168.

And on the device that started the disk-space alert: 417 GiB free, 2.12 GiB of it Panther. The folders that looked like corruption were the cheapest insurance on the machine.

References

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

More from EndpointWeekly

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
"We couldn't complete the updates, undoing changes":…
The user sees a friendly message and the device reverts; the ticket arrives with no error…
Windows Update
SetupDiag already named your upgrade failure: reading the report…
Windows Setup runs SetupDiag automatically when an upgrade fails, writing the matched…