0XC0000131

STATUS_INVALID_IMAGE_WIN_16 (0XC0000131) Fix on Windows 10/11

Windows Errors Intermediate 👁 0 views 📅 May 27, 2026

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

  1. Open Control PanelProgramsTurn Windows features on or off.
  2. Scroll down to Legacy Components and expand it.
  3. Check NTVDM - Windows 16-bit Subsystem.
  4. 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:

  1. Run cmd.exe as Administrator.
  2. Use certutil -hashfile "C:\Path\To\YourApp.exe" SHA256 and compare the hash with the original vendor's hash. No match means the file is corrupt — re-download it.
  3. If the hash matches, run sfc /scannow to check system files. A corrupted kernel32.dll or ntdll.dll can cause misreads.
  4. Also check the file's actual bitness with dumpbin /headers if you have Visual Studio tools, or use a free tool like PE Studio. If the header says machine (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.

  1. Right-click the problematic .exePropertiesCompatibility tab.
  2. Uncheck Run this program in compatibility mode for and all other checkboxes.
  3. Click Change high DPI settings and uncheck Override high DPI scaling behavior.
  4. 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

CauseFixWhen to try
64-bit Windows missing NTVDMEnable NTVDM in Windows FeaturesApp is a known 16-bit program (DOS, Win16)
Corrupted executable headerRe-download original file or replace from vendorHash mismatch or dumpbin shows garbage header
Compatibility mode conflictDisable all compatibility settings in PropertiesApp worked before on same OS, or is 32-bit but error persists

Was this solution helpful?