Why does explorer.exe crash with a "stack-based buffer overrun" error and leave a black screen after a Windows update, and how do I fix it?
Some users on Windows 11 24H2 and 25H2 VDI/RDS sessions got stuck at a blank desktop after logon — the wallpaper and taskbar never appear — after installing Windows cumulative updates released from late August 2026 onward. Microsoft has fixed this in the October 13, 2026 cumulative update KB5127648. This article covers the fix, how to remove the interim mitigations once you have it, and the interim options for hosts that can’t be patched yet.
Fixed in OS builds 26100.9711 (24H2), 26200.9711 (25H2) and 26300.9711 (26H2) and later. Affected: Windows 11 24H2 and 25H2 after KB5120998 (August 2026 preview) / KB5124008 (September 2026). Reported against ProfileUnity, FSLogix, Citrix UPM, and Omnissa DEM.
ProfileUnity 6.9.5 HF4 (build 6.9.5.9783, October 19, 2026) adds a client-side fix for an Explorer crash at logon on Windows 11 25H2 for users with an existing ProfileDisk. ProfileDisk users on 6.9.5 should apply both KB5127648 and HF4.
📄 Contents
- › Resolution: Install KB5127648
- › Removing Interim Mitigations
- › Error Message
- › Why It's Intermittent
- › Cause
- › Interim Mitigations (Unpatched Hosts Only)
- ›› Interim #1: Microsoft's Known Issue Rollback
- ›› Interim #2: Shell Package Re-Registration
- ›› Interim #3: Watchdog-Only Script
- › Recovering a Stuck Session
- › Related Articles
- › Revision History
Resolution: Install KB5127648
Microsoft lists this in KB5127648 as “[Windows Explorer (Known issue)] Fixed”: the update “fixes an issue that affects Windows Explorer in multi-user environments”, where after sign-in “Explorer.exe might fail to start or repeatedly crash, causing a black screen.” Microsoft names Azure Virtual Desktop and FSLogix as examples; the same fix applies to the ProfileUnity, Citrix UPM, and Omnissa DEM reports. Microsoft’s release health entry says the issue was resolved by Windows updates released October 13, 2026 and later, and that devices on those updates don’t need a workaround.
| Windows 11 version | Fixed in OS build | Update (Oct 13, 2026) | Status |
|---|---|---|---|
| 24H2 | 26100.9711 | KB5127648 | ✓ Fixed |
| 25H2 | 26200.9711 | KB5127648 | ✓ Fixed |
| 26H2 | 26300.9711 | KB5127648 | ✓ Fixed |
KB5127648 is cumulative. It also contains KB5124008, the KB5129195 out-of-band update, and the KB5124010 September preview, so any later monthly cumulative update also includes the fix.
1. Install the update on the golden image
Install KB5127648 (or any later cumulative update) on the golden image, then seal and publish it to the pool the way you normally do (recompose, image update, or MCS/PVS update). For persistent desktops and RDS hosts, install it through your normal patching tool.
2. Confirm the build
On a session host built from the new image, confirm UBR is 9711 or higher:
Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion' |
Select-Object CurrentBuild, UBR3. Validate on a pilot pool
Log on with test users who were affected before (large or complex Start/shell state reproduces it best), and confirm the desktop loads every time. Then confirm no new Application Popup (Event ID 26) entries for explorer.exe have been logged since the update:
$f = @{LogName='System'; ProviderName='Application Popup'; Id=26}
Get-WinEvent -FilterHashtable $f -MaxEvents 50 |
Where-Object Message -like '*explorer.exe*' |
Format-List TimeCreated, Message4. Roll out, then remove the interim mitigations
Once the pilot is clean, roll the image out to the remaining pools, then follow Removing Interim Mitigations below.
Microsoft’s fix text describes the crash but doesn’t mention Event ID 26 or the stack-based buffer overrun message specifically. If the affected user has a ProfileDisk and the host runs a 6.9.5 client earlier than HF4 (6.9.5.9783), apply HF4 first. If an explorer.exe Event ID 26 still appears on a host that is confirmed on build .9711 or later with HF4 in place, capture a dump (see Enabling User-Mode Dumps in a ProfileUnity Configuration), collect logs with the Diagnostic Tool, and contact Liquidware Support. Keep the interim mitigations in place on those hosts until the case is resolved.
Removing Interim Mitigations
After every host in a pool is on the fixed build, remove whatever interim mitigations you deployed for that pool:
- Repair-ShellXamlPackages.ps1 (Interim #2): disable or delete the Application Launcher (or User Defined Script) rule and redeploy the configuration. This script re-registers three AppX packages on every logon, which adds logon time and does nothing on a fixed host, so it should not stay in place.
- Watch-ExplorerShell.ps1 (Interim #3): optional. It’s harmless to leave running through the pilot as a safety net, but disable the rule once you’re satisfied, so it doesn’t hide a future, unrelated shell problem.
- Known Issue Rollback (Interim #1): the KIR only disables the change that caused the issue until a permanent fix is installed, and that fix is now in KB5127648. Microsoft hasn’t published specific removal steps for this KIR. Once every host the policy targets is on the fixed build, set the KIR policy to Not Configured at your next change window, then remove the ADMX/MSI. If the policy also targets Windows Server 2025 hosts, confirm they have the matching October 2026 Server cumulative update first.
KB5127648 is the Windows fix. Separately, ProfileUnity 6.9.5 HF4 (build 6.9.5.9783) resolves an issue on Windows 11 25H2 where Explorer could crash at logon, leaving the Start menu and taskbar unusable, for users with an existing ProfileDisk. If your 6.9.5 configurations use ProfileDisk, update the client tools in your deployment share to HF4 along with installing KB5127648. Downloads and checksums are in the ProfileUnity Hot Fix List. Environments that don’t use ProfileDisk need no ProfileUnity update beyond removing the interim rules above.
Error Message
Affected sessions log an Application Popup event (Event ID 26) at logon, at or near the moment the desktop should appear:
explorer.exe - System Error The system detected an overrun of a stack-based buffer in this application. This overrun could potentially allow a malicious user to gain control of this application.
It is Windows' standard message for a stack-cookie (/GS) protection check tripping inside explorer.exe itself. Explorer terminates and the desktop shell (wallpaper, taskbar, Start) never loads. Users can reach the desktop by manually starting
explorer.exe from Task Manager, but the issue recurs on the next logon for that profile.Why It's Intermittent
Reports vary from "every logon fails" to "most logons are fine, a few aren't" — both are consistent with the same underlying condition. Liquidware's crash-dump analysis of an affected session traced the fault to a stack buffer inside explorer.exe's own code, not to any Liquidware component. A stack buffer overrun of this kind typically fires only when the data being copied into that buffer exceeds a fixed size — so sessions are affected only when something in the user's shell/profile state (Start layout, pinned items, jump lists, and similar per-user shell data) is large or complex enough to cross that threshold.
That also explains why this shows up disproportionately in VDI/RDS environments running profile management software — ProfileUnity, FSLogix, Citrix UPM, and Omnissa DEM are all reported hitting this — the software isn't at fault, but roaming or rehydrating that same class of per-user shell state makes crossing the threshold more likely. It is not limited to Windows 11 25H2: 25H2 ships as an enablement package on top of the 24H2 servicing branch, so the same explorer.exe code — and the same regression — is present on updated 24H2 systems as well.
Cause
Windows cumulative updates released from late August 2026 onward appear to have introduced a regression in how explorer.exe consumes the modern shell/Start UI framework — the WinUI3/XAML packages MicrosoftWindows.Client.CBS, Microsoft.UI.Xaml.CBS, and MicrosoftWindows.Client.Core. This is the same package family behind the separate, generally self-recovering ShellHost.exe framework-loading failure documented in the related article below. In explorer.exe's case, a mismatch or stale registration state for those packages after the update appears to drive Explorer into a code path that overflows a stack buffer instead of failing gracefully.
Microsoft confirmed the regression and fixed it in KB5127648, but hasn’t published the exact function or change involved. The package-registration explanation above is still Liquidware’s working theory, based on our dump analysis.
Interim Mitigations (Unpatched Hosts Only)
The three options below were published while Microsoft’s fix was pending. They are kept here only for hosts that can’t install KB5127648 yet, such as an image frozen for a change freeze. Installing the update is the fix; these options only reduce the impact.
Interim #1: Microsoft’s Known Issue Rollback
Use this only on hosts that can’t install KB5127648 (or a later cumulative update) yet. Once a host is on OS build .9711 or later, remove it — see Removing Interim Mitigations.
Microsoft acknowledged the issue and released a Known Issue Rollback (KIR) — an official Group Policy–based mitigation, distributed as an MSI that registers ADMX templates you enable via Group Policy. Citrix documents this specifically for Desktop OS VDAs in CTX697101 — Issues with Microsoft Windows September 2026 Update, under "Black Screens on Login after installing KB5124008 / KB5120998 on Desktop OS VDAs." The relevant packages Citrix references are Windows 11 24H2, Windows 11 25H2 and Windows Server 2025 — KB5124008 260912_00472 Group Policy, and Windows 11 22H2 — KB5122880 260912_00473 Group Policy.
Microsoft’s release health entry also offered KIR Group Policies for enterprise-managed devices. A restart is required after the policy is applied. See Citrix’s article (linked above) or Microsoft’s Known Issue Rollback documentation for the MSI download and Group Policy steps for your OS version.
The September 14 out-of-band update KB5129195 named File Explorer among tools that might stop responding after the September update. It wasn’t the fix for this crash. The fix is in KB5127648, which also includes KB5129195.
Interim #2: Shell Package Re-Registration
Use this only on hosts that can’t install KB5127648 (or a later cumulative update) yet. Once a host is on OS build .9711 or later, remove it — see Removing Interim Mitigations.
Re-registering the three shell UI packages at logon, before Explorer starts, reduced the issue on unpatched hosts. Deploy it as a ProfileUnity Application Launcher (or User Defined Script) rule with Timing set to After Configuration Execution, ahead of shell startup.
This was never confirmed to fully resolve the issue. Test it in a pilot pool before rolling it out, and plan to remove it once the host can take KB5127648.
ProfileUnity's Application Launcher and User Defined Scripts can run elevated — under the logged-on user's own UAC-elevated (admin) token, not a plain standard-user token. If a script simply calls
Start-Process to relaunch the shell in that state, the child process inherits that same elevated token — silently handing the user an elevated Explorer with no UAC prompt. That's a privilege-escalation and compliance concern, not a cosmetic one, especially in regulated environments. Preferred fix: check "Execute without Elevation" on the Application Launcher rule itself (see step 2 below). With that checked, ProfileUnity runs the script as the user's normal, non-elevated token from the start, so there's nothing to strip out afterward.
Built-in safety net: the script also checks its own elevation at runtime and only de-elevates when it detects it's actually needed — e.g. the checkbox was missed, or a User Defined Script trigger that doesn't expose the option. In that case it de-elevates itself before relaunching the shell (see
Start-AsStandardUser in the code) using a one-shot Scheduled Task registered with /RL LIMITED, which Task Scheduler always runs at the user's normal (non-elevated) integrity level regardless of the creating process's own elevation. When the launcher is already non-elevated (checkbox set correctly), this step is skipped entirely and the shell is relaunched directly. Confirm your own environment's launcher context matches (the script logs identity, elevation state, and session ID on every run) and validate this behavior in a controlled, isolated test environment before deployment — log on as a standard (non-admin) test user, run the script, and confirm in the log and in Task Manager that the relaunched Explorer is running at the user's normal integrity level, not elevated, before rolling out to any pilot pool.
1. Get the script. Alongside the package re-registration, this version watches for explorer.exe with a sustained-alive check (so a brief flash-then-crash isn't mistaken for success), guards against overlapping runs, logs identity and elevation state, can log to a central share for easier fleet-wide troubleshooting, and de-elevates before relaunching the shell so the user doesn't end up with an elevated Explorer:
Download the script from the attachment at the bottom of this article and save it as
Repair-ShellXamlPackages.ps1. Distributing it as a file (rather than copy-pasted from this page) avoids the character-loss issues that can happen when code is copied out of a rendered web page or PDF.What the script does, in order:
- Logs identity and elevation state, then re-registers the three shell UI/XAML packages (
MicrosoftWindows.Client.CBS,Microsoft.UI.Xaml.CBS,MicrosoftWindows.Client.Core). - Watches for
explorer.exe, distinguishing never-started, started-then-died, and stayed-running (so a brief flash-then-crash isn't mistaken for success). - If explorer isn't confirmed alive, relaunches it, de-elevating first if the script itself is running elevated.
- Confirms explorer came up and logs the result.
2. Add it as a New Application Launcher Setting
-
Before adding the Application Launcher rule, open the script and adjust its
param()defaults to match your environment —$LogShare(set it to a central log share, e.g."\\yourserver\yourshare\dumps", or leave$nullfor local%TEMP%),$WaitSeconds, and$AliveConfirmSeconds. Since every session runs the same shared copy, editing the defaults once here covers everyone and keeps the Arguments field in the rule below simple — no long list of extra flags to type (and possibly mis-quote) in the console. You can still override any of them per-rule by appending flags after-File "..."if you ever need a different rule to behave differently. - In the ProfileUnity Management Console, open the applicable configuration, go to Application Launcher, and add a New Application Launcher Setting.
- Set Filespec to
C:\Windows\System32\cmd.exeand Arguments to/c powershell.exe -ExecutionPolicy Bypass -WindowStyle Hidden -NonInteractive -File "\\yourserver\yourshare\scripts\Repair-ShellXamlPackages.ps1"— running PowerShell throughcmd.exe /cthis way is the general pattern for Application Launcher script rules. Point-Fileat the full UNC path to the script on a share reachable at logon, rather than a bare filename — that way there's nothing to separately stage locally (see the note on file distribution below). - Set Timing to After Configuration Execution and Frequency to Every Logon.
- Check Run Asynchronously. By default ProfileUnity waits for the application to terminate before continuing; this script can run for up to
WaitSecondsand would otherwise hold up logon while ProfileUnity waits on it. - Check Execute without Elevation — the preferred fix for the elevation warning above. Without it, the script's own built-in safety net still de-elevates before relaunching the shell, but checking this box avoids that extra step entirely.
- Either reference the script directly from a network share (as in the
-Filepath above — make sure that share is reachable and read-accessible for the user before shell startup, and use a highly-available path), or deploy the script itself via the configuration's file/module distribution and reference it by local filename instead. - Save and apply the configuration to a pilot desktop pool only first.
Check
XamlFix.log (in %TEMP% or your -LogShare path) on a test session after logon to confirm the packages registered successfully, and whether explorer was seen starting, dying, or never appearing at all — before expanding to more pools.Interim #3: Watchdog-Only Script (No Re-Registration)
Use this only on hosts that can’t install KB5127648 (or a later cumulative update) yet. Once a host is on OS build .9711 or later, remove it — see Removing Interim Mitigations.
If you'd rather not re-register the AppX shell packages — for example, you're relying on the KIR above and just want a safety net, or package re-registration isn't necessary/desired in your environment — the same detection-and-relaunch logic is available on its own, without the package-registration step. Everything else (sustained-alive detection, re-entrancy guard, logging, and the same de-elevated relaunch described in the elevation warning above) works the same way.
Its log location is a plain parameter rather than a fixed path — point it at a local folder such as C:\Temp (the default) or a UNC share of your choice, as long as the account running the script has write rights there:
Download the script from the attachment at the bottom of this article and save it as
Watch-ExplorerShell.ps1. Distributing it as a file (rather than copy-pasted from this page) avoids the character-loss issues that can happen when code is copied out of a rendered web page or PDF.What the script does, in order:
- Logs identity and elevation state (no package re-registration here — that's the difference from
Repair-ShellXamlPackages.ps1above). - Watches for
explorer.exe, distinguishing never-started, started-then-died, and stayed-running (so a brief flash-then-crash isn't mistaken for success). - If explorer isn't confirmed alive, relaunches it, de-elevating first if the script itself is running elevated.
- Confirms explorer came up and logs the result.
Deploy it the same way as Repair-ShellXamlPackages.ps1 above: before creating the rule, adjust the script's own param() defaults ($LogDir for central logging, $WaitSeconds, $AliveConfirmSeconds) rather than passing them as extra arguments — then set Filespec C:\Windows\System32\cmd.exe, Timing After Configuration Execution, Frequency Every Logon, with Run Asynchronously and Execute without Elevation both checked, and Arguments /c powershell.exe -ExecutionPolicy Bypass -WindowStyle Hidden -NonInteractive -File "\\yourserver\yourshare\scripts\Watch-ExplorerShell.ps1".
Recovering a Stuck Session
If a user is already stuck at a blank desktop:
- Press Ctrl+Alt+Delete and open Task Manager.
- Select File > Run new task, enter
explorer.exe, and confirm. - The desktop should load normally for the remainder of that session.
This does not prevent recurrence on the user's next logon. The Repair-ShellXamlPackages.ps1 script above already includes this recovery step (it waits and force-launches explorer.exe if needed), so sites running it as an Application Launcher rule get this fallback automatically. On a host with KB5127648 installed this should no longer recur; if it does, see Still seeing the black screen.
Related Articles
- Microsoft KB5127648 — October 13, 2026 security update (OS Builds 26100.9711/26200.9711/26300.9711) (the fix)
- Citrix CTX697101 — Issues with Microsoft Windows September 2026 Update (the same black-screen-on-login issue on Desktop OS VDAs, and the Microsoft KIR)
- Microsoft KB5129195 — September 14, 2026 out-of-band update (OS Builds 26100.9457/26200.9457) (historical; superseded by KB5127648)
- ShellHost.exe System Error — "Overrun of a Stack-Based Buffer" Popup at Logon (the related, generally self-recovering variant of this same shell-package issue)
- ProfileUnity: How to Enable Debug Logging
- How to Collect Logs Using the Diagnostic Tool
- Enabling User-Mode Dumps in a ProfileUnity Configuration
Revision History
| Date | Update |
|---|---|
| 9-14-26 | Initial publication: shell UI package re-registration workaround. Added Microsoft/Citrix acknowledgment (CTX697101) and the Known Issue Rollback (KIR) as a second candidate mitigation. Both remain unconfirmed as complete fixes. |
| 9-15-26 | Added a watchdog-only alternative script (Watch-ExplorerShell.ps1). Both scripts now de-elevate before relaunching the shell, since ProfileUnity's Application Launcher runs under the user's UAC-elevated token; deployment steps updated to use the Execute without Elevation/Run Asynchronously checkboxes, the correct cmd.exe /c powershell.exe ... Filespec/Arguments pattern, and full UNC paths. Reviewed Microsoft's out-of-band updates KB5129195/KB5129194: they name File Explorer as an affected tool, but describe a hang, not our confirmed crash — relationship unconfirmed, worth testing on the repro pool. Bug fix (customer-reported): the de-elevation helper in both scripts could throw a PowerShell parser error (AmpersandNotAllowed) when run via -File from a UNC path, caused by a backtick line-continuation next to 2>&1 redirection; fixed by removing the continuation and using *> $null instead. If you deployed either script before this date, re-download and redeploy it. Both scripts are now provided only as file attachments on this article (not as copy-pasteable code blocks), to eliminate copy/paste corruption as a source of errors going forward. |
| 10-19-26 | Resolved. Microsoft fixed the issue in KB5127648 (October 13, 2026; OS builds 26100.9711 / 26200.9711 / 26300.9711). Status changed to Resolved. Added Resolution and Removing Interim Mitigations sections. The KIR, re-registration script, and watchdog script are now interim options for unpatched hosts only. Added Windows 11 26H2 and the August preview KB5120998 to the affected/fixed scope. KB5129195 note shortened to a historical reference. Added ProfileUnity 6.9.5 HF4 (6.9.5.9783), which fixes an Explorer crash at logon on Windows 11 25H2 for users with an existing ProfileDisk, as a companion to KB5127648 for ProfileDisk environments. |
| Product | Liquidware ProfileUnity with FlexApp |
| Applies To | Windows 11 24H2 / 25H2 VDI or RDS sessions before OS build .9711 (fixed by KB5127648), ProfileUnity 6.8.7.x and later; ProfileDisk on 6.9.5: HF4 (6.9.5.9783) |
| Updated | October 19, 2026 |