1. Corrupted or Incompatible EMM386 Memory Manager
This is the one I see most often. The error ERROR_RING2SEG_MUST_BE_MOVABLE (0x000000C8) pops up when you try to run an old 16-bit DOS program — think an accounting app from 1992 or a CNC machine controller — on a modern 64-bit version of Windows. The core issue: the program's code segment exceeded 64KB while running in Ring 2 (privilege level 2), and Windows' NTVDM (NT Virtual DOS Machine) can't stretch the segment to fit.
But 9 times out of 10, the culprit is EMM386.EXE. That's the expanded memory manager that DOS and early Windows used to cram more than 640KB of memory. On modern systems, EMM386 often gets loaded automatically via an old CONFIG.SYS or AUTOEXEC.BAT file left behind. The memory mapping it does conflicts with NTVDM's own memory handling, throwing the 0x000000C8 error.
The Fix: Disable EMM386 manaully
- Open Notepad as Administrator. Go to
C:\Windows\System32\and openCONFIG.NT. Also checkAUTOEXEC.NTin the same folder. - Look for any line with
EMM386.EXEorDEVICE=C:\...\EMM386.EXE. If you find one, comment it out by puttingREMat the start of the line. - Save the file. Reboot the computer.
Had a client last month whose entire print queue died because this error kept crashing the 16-bit label printing software. Commenting out EMM386 fixed it instantly. If your software actually needs expanded memory, you'll see a different error about not enough memory — then you can try the DOSBox route instead (covered below).
2. NTVDM Corruption or Missing System Files
Sometimes the error isn't about the app at all — it's about Windows' own 16-bit subsystem being broken. NTVDM relies on a handful of files: NTVDM.EXE, NTIO.SYS, NTDOS.SYS, CONFIG.NT, and AUTOEXEC.NT. If any of these are missing, corrupted, or overwritten by a third-party installer, you'll get 0x000000C8 when trying to launch a 16-bit program.
A common trigger: installing something like Windows 3.1 SDK tools that replace system files with older versions. Another trigger: running an antivirus scan that quarantines NTVDM.EXE as a false positive.
How to Repair NTVDM
- Open Command Prompt as Administrator.
- Run
sfc /scannow. Wait for it to finish — it'll replace any corrupted system files. - If that doesn't help, run
DISM /Online /Cleanup-Image /RestoreHealth. Takes 10-15 minutes. - Restart and test your app.
If the error persists, check if 16-bit support is actually enabled. On 64-bit Windows 10 or 11, NTVDM is not installed by default. You have to enable it manually:
- Go to Control Panel > Programs and Features > Turn Windows features on or off.
- Check the box for NTVDM (under Legacy Components). Click OK, restart.
3. Program Code Segment Actually Exceeds 64KB (Legacy App Limits)
This is the less common but harder to fix case. Some DOS programs, especially badly written ones that use __far pointers or huge memory models in Borland C/C++, can create code segments that legitimately go beyond 64KB. When they run under NTVDM, Windows enforces the Intel 286/386 segmentation limit — and if the segment descriptor says it's over 64KB, NTVDM throws 0x000000C8.
A real-world scenario: I once dealt with a medical records app from 1989 that had a monolithic executable over 200KB. The developer had compiled it with a compact memory model, which tried to fit the whole text segment into one 64KB block. It worked on real MS-DOS 5.0 but crashed on every modern Windows version.
Real Fix: Switch to DOSBox
Stop fighting NTVDM. DOSBox emulates an entire 386 PC, complete with its own memory manager that handles large segments correctly. It's free, stable, and doesn't care about segment limits the same way. Here's the quick way to get your app running:
- Download and install DOSBox 0.74-3.
- Create a folder for your old app, say
C:\DOSAPPS\. Copy the program files into it. - Edit
dosbox.conf(found in your user's AppData folder). Under[autoexec], add:mount c: c:\dosapps\ c: myapp.exe - Run DOSBox. It'll mount the folder as drive C: and execute your app.
DOSBox handles memory mapping far more gracefully than NTVDM. For most old business or industrial software, it's the bulletproof fix. The only downside: it doesn't integrate with Windows printers or network shares directly, but you can work around that with net use commands inside DOSBox.
Quick-Reference Summary Table
| Cause | Fix | Difficulty |
|---|---|---|
| EMM386 conflicting with NTVDM | Comment out EMM386.EXE in CONFIG.NT |
Intermediate |
| Corrupted NTVDM files | Run sfc /scannow or enable NTVDM in Windows Features |
Beginner |
| Code segment over 64KB | Use DOSBox instead of NTVDM | Intermediate |