You hit Check for updates, the spinner spins, and the percentage sits at 0% like it's waiting for a signal from Mars. I've seen this on Windows 10 21H2 and Windows 11 23H2, usually right after a fresh install or when the machine has been offline for a month. The cause is rarely one thing—it's a broken service state, a corrupted cache, or a component store that's given up. The fixes below go from least invasive to nuclear reset. Stop when it works.
The 30-Second Fix: Restart the Update Services
What's actually happening here is that the Windows Update service (wuauserv) and the Background Intelligent Transfer Service (BITS) can stop responding without crashing. They hang, and the update client just waits forever. A quick restart resets their state and often kick-starts a stuck download. You don't need admin for this if you use the GUI, but for the command line you do.
- Press
Win + R, typeservices.msc, hit Enter. - Scroll to Windows Update. Right-click and select Restart.
- Do the same for Background Intelligent Transfer Service.
- Go back to Settings > Windows Update and try again.
If the service won't restart and throws an error, you're dealing with something deeper. Skip to the advanced fix. But in maybe half the cases, this is all it takes.
The 5-Minute Fix: Clear the Download Cache
If the service restart didn't work, the corruption is likely in the C:\Windows\SoftwareDistribution folder. That's where Windows stores downloaded update files. When it gets filled with half-finished or corrupted files, the update client gets stuck trying to read them, and the percentage stays at 0 because it's actually hung on I/O, not on the network.
The reason step 3 works is that you're forcing the service to stop touching those files, then deleting them, then letting the service recreate a clean folder on next start. Don't skip the stop—deleting files while the service is running will give you a file-in-use error or, worse, a partial delete that makes things worse.
- Open an elevated Command Prompt (right-click Start > Terminal (Admin)).
- Run these commands one at a time:
net stop wuauserv
net stop bits
ren C:\Windows\SoftwareDistribution SoftwareDistribution.old
net start wuauserv
net start bits
The ren command renames the folder instead of deleting it. That's intentional—if something goes wrong, you can roll back by deleting the old folder and renaming it back. After the services restart, Windows will create a fresh SoftwareDistribution folder automatically. Try the update again.
The 15-Minute Fix: Reset Windows Update Components
If you're still staring at 0%, the problem is deeper. The update components themselves—the service configuration, the registry entries, the security identifiers—are corrupted. This is common after a botched antivirus uninstall or a forced shutdown during an update. The built-in Windows Update Troubleshooter (Settings > System > Troubleshoot > Other troubleshooters) can fix some of this, but it's hit-or-miss. I've seen it fail on machines where the Cryptographic Services (CryptSvc) is disabled by a stubborn third-party tool.
The real fix is a manual reset. This resets the Windows Update service descriptions and re-registers the DLLs that handle update functionality. It's safe—you're not touching your personal files or installed apps—but it takes a few minutes and requires admin rights.
Step-by-Step Component Reset
- Open an elevated Command Prompt or PowerShell.
- Stop the services and rename the folders like before, but this time also stop CryptSvc and MSI Installer:
net stop wuauserv
net stop cryptSvc
net stop bits
net stop msiserver
ren C:\Windows\SoftwareDistribution SoftwareDistribution.old
ren C:\Windows\System32\catroot2 Catroot2.old
net start wuauserv
net start cryptSvc
net start bits
net start msiserver
Why rename catroot2? That's the catalog for signed drivers and update signatures. If it's corrupted, Windows can't validate any downloaded update, so it stalls at 0%. Renaming it forces a rebuild from scratch.
Re-register the Update DLLs
This is the part that actually fixes the deep corruption. Run these one by one. Some will say "module not found"—that's normal, ignore it.
regsvr32 /s atl.dll
regsvr32 /s urlmon.dll
regsvr32 /s mshtml.dll
regsvr32 /s shdocvw.dll
regsvr32 /s browseui.dll
regsvr32 /s jscript.dll
regsvr32 /s vbscript.dll
regsvr32 /s scrrun.dll
regsvr32 /s msxml.dll
regsvr32 /s msxml3.dll
regsvr32 /s msxml6.dll
regsvr32 /s actxprxy.dll
regsvr32 /s softpub.dll
regsvr32 /s wintrust.dll
regsvr32 /s dssenh.dll
regsvr32 /s rsaenh.dll
regsvr32 /s gpkcsp.dll
regsvr32 /s sccbase.dll
regsvr32 /s slbcsp.dll
regsvr32 /s cryptdlg.dll
Reset the Winsock and Proxy Settings
A broken network stack can also cause a permanent 0% because the update client can't reach Microsoft's servers. Even if regular browsing works, the update service uses a different path. Run:
netsh winsock reset
netsh winhttp reset proxy
Then reboot. The netsh winhttp reset proxy is the one people forget. If you've ever used a VPN or a proxy tool that left a stale proxy config, this is what clears it.
When None of This Works
If you've gone through all three and the update still sits at 0%, the problem is likely a corrupted system image. I'd run SFC and DISM before considering a repair install:
sfc /scannow
dism /online /cleanup-image /restorehealth
These take 10–20 minutes each, so that's why they're not in the main flow. If those come up clean and updates still fail, a repair install using the Windows Media Creation Tool is the last resort. Back up your files first—you're reinstalling Windows, just keeping your apps and settings.
One last thing: if this happens immediately after you've installed a fresh copy of Windows and you're on a corporate network, check with your IT admin. Some organizations push a GPO that points Windows Update to an internal WSUS server that's down. That'll show 0% every time, and no amount of local fixing will help.