STATUS_INVALID_IMAGE_WIN_16 (0XC0000131) Fix on Windows 10/11
This 16-bit app error means you're trying to run a DOS/Win16 program on 64-bit Windows. The fix is either enabling NTVDM or finding a 32/64-bit replacement.
1. The most common cause: 64-bit Windows can't run 16-bit executables natively
You're seeing 0XC0000131 - STATUS_INVALID_IMAGE_WIN_16 because Windows 10 or 11 64-bit dropped the Windows 16-bit subsystem (NTVDM) by default. The old DOS/Win16 app you're trying to launch — think a late-90s accounting tool, a legacy industrial controller software, or a custom compiled Visual Basic 4.0 program — has a .exe header that says "I'm a 16-bit Windows app," and Windows 10/11 64-bit says "nope."
The fix here is straightforward: enable the NTVDM feature. It's usually disabled to reduce attack surface, but it's still available in most Windows 10/11 versions (except Windows 10 on ARM).
- Open Control Panel → Programs → Turn Windows features on or off.
- Scroll down to Legacy Components and expand it.
- Check NTVDM - Windows 16-bit Subsystem.
- Click OK and let it install (you might need a reboot).
After that reboot, try running your app again. If it still fails, double-check the executable's format with a tool like dumpbin /headers yourapp.exe from a Visual Studio command prompt — look for machine (x86) in the output. If you see machine (x86) or machine (x64) instead of machine (I386) or machine (MIPS), it's actually a 32-bit or 64-bit app with a corrupted header, and the fix below in section 2 might help.
2. Second cause: Corrupted or misidentified executable header
Sometimes the error pops up on a file that should be 32-bit. I've seen this happen after a botched update, a partial download, or when someone renamed a .dll to .exe to bypass group policy. The file's PE header gets mangled, and Windows reads it as 16-bit.
Here's how to check and fix:
- Run
cmd.exeas Administrator. - Use
certutil -hashfile "C:\Path\To\YourApp.exe" SHA256and compare the hash with the original vendor's hash. No match means the file is corrupt — re-download it. - If the hash matches, run
sfc /scannowto check system files. A corruptedkernel32.dllorntdll.dllcan cause misreads. - Also check the file's actual bitness with
dumpbin /headersif you have Visual Studio tools, or use a free tool like PE Studio. If the header saysmachine (x86)but the file still triggers 0xC0000131, the file's really corrupt.
Replacing the file with a clean copy from the vendor's website is the only reliable fix here. Don't waste time patching the header — it rarely works and can break the app further.
3. Third cause: 32-bit Windows XP/Vista compatibility mode conflict
I've seen this on legacy apps that were compiled for Windows 95/98 but shipped with a compatibility shim that accidentally sets the 16-bit flag. The app is actually a 32-bit executable, but the compatibility settings force Windows to treat it as 16-bit.
- Right-click the problematic
.exe→ Properties → Compatibility tab. - Uncheck Run this program in compatibility mode for and all other checkboxes.
- Click Change high DPI settings and uncheck Override high DPI scaling behavior.
- Click OK, then run the app again.
If it works, re-enable compatibility mode one setting at a time to find the culprit. Usually it's the "Windows 95" or "Windows 98" mode selection that triggers the 16-bit subsystem detection.
Quick-reference summary table
| Cause | Fix | When to try |
|---|---|---|
| 64-bit Windows missing NTVDM | Enable NTVDM in Windows Features | App is a known 16-bit program (DOS, Win16) |
| Corrupted executable header | Re-download original file or replace from vendor | Hash mismatch or dumpbin shows garbage header |
| Compatibility mode conflict | Disable all compatibility settings in Properties | App worked before on same OS, or is 32-bit but error persists |
Was this solution helpful?