Moving Windows 2000 from a uniprocessor HAL to multiprocessor (Asus CUV4X-D)

Windows 2000 Setup on my dual Pentium III board (Asus CUV4X-D, VIA 694X / 686B) would only finish with the uniprocessor “Standard PC” HAL. Getting from there to both CPUs took three separate fixes, and each one only revealed the next problem. Here’s the sequence that worked, plus a way to test the multiprocessor kernel without risking the working install.

How it started

  • With Setup’s default HAL it hung at “Starting Windows 2000.”
  • Choosing MPS Multiprocessor PC with F5 gave STOP 0x000000C5 (0x4, 0x2, 0x1, ...) DRIVER_CORRUPTED_EXPOOL.
  • Choosing Standard PC with F5 worked.

A side lesson: I spent a while testing RAM because of that 0xC5. What settled it was getting the identical STOP, with the same parameters down to the address, with a different single DIMM that had passed Memtest86+. Flaky RAM doesn’t fail at exactly the same place each time. A deterministic crash points at software or configuration.

The plan was to install on Standard PC, add SP4 and the VIA 4in1 drivers, then switch to the multiprocessor HAL. OS/2 Warp Server (on the same machine) ran SMP fine, so I knew the second CPU and its socket were good.

Step 1: test the MP kernel from boot.ini first

Rather than switching HALs in Device Manager and hoping, I added a second boot entry that loads the MP HAL and kernel by name. Extract SP4 (W2KSP4.EXE -x), copy halmps.dll and ntkrnlmp.exe from its i386 folder into %windir%\system32 (they’re compressed as halmps.dl_ and ntkrnlmp.ex_, so unpack them with expand, e.g. expand halmps.dl_ halmps.dll), and duplicate your existing boot.ini line with two extra switches:

multi(0)disk(0)rdisk(0)partition(N)\WINNT="Windows 2000 MP test" /fastdetect /HAL=halmps.dll /KERNEL=ntkrnlmp.exe

(Use your own partition(N), copied from the existing line.) If the test entry crashes, the normal entry still boots the untouched uniprocessor setup.

My first try crashed with STOP 0x0000001E (0xC0000005, 0x00000001, 0x00000000, 0x00000001), an access violation at address 1, which means execution jumped somewhere wild.

Step 2: disable MPS 1.4 in the BIOS

The CUV4X-D BIOS has an MPS 1.4 support option. With it Disabled, the 0x1E went away. I can’t tell you exactly why. My guess is that the BIOS’s MPS 1.4 tables and Windows 2000’s MPS HAL don’t agree on this board. Leave it disabled. OS/2’s SMP kernel is happy either way.

That got further, to a new error:

STOP: c0000249 {UP/MP Image Mismatch}
The image ntdll.dll has been modified for use on a uniprocessor system...

Step 3: swap in the MP versions of three files

When SP4 is installed on a uniprocessor HAL, it installs uniprocessor builds of a few user-mode and win32k files, from the i386\UNIPROC folder in the service pack. In those copies the x86 LOCK prefixes (0xF0) have been patched to NOP (0x90), which saves a little time on one CPU but is unsafe with two. The MP kernel checks for this and refuses to run them.

SP4’s update.inf lists which files these are, in [Uniprocessor.Kernel.Files] versus [Multiprocessor.Kernel.Files]. For SP4 the set is:

  • kernel32.dll
  • ntdll.dll
  • win32k.sys
  • winsrv.dll, which is also listed, but SP4’s UP and MP copies are identical, so it doesn’t need replacing

Take the MP versions from the extracted SP4: the regular i386 copies, not i386\uniproc. ntdll.dll is stored as is; kernel32.dl_ and win32k.sy_ need expand. The MP versions also run fine under the uniprocessor kernel, so swapping them doesn’t break your normal boot entry. They’re in use while Windows runs, so the swap has to happen from the Recovery Console. I staged them from Windows first:

  1. From Windows, copy the three MP files to %windir%\MPFILES, and back up the current ones to %windir%\UPBAK.
  2. Boot the Recovery Console and copy each file from MPFILES over the one in system32.
  3. Reboot into the MP test entry.

That did it. Windows 2000 came up with two CPUs in Task Manager.

Step 4: make it permanent

After a soak test on the boot.ini entry:

  1. In Device Manager, open Computer, choose Update Driver, show all hardware, and pick MPS Multiprocessor PC.
  2. Reboot, then reinstall SP4 so every file matches the new HAL.
  3. Remove the test line from boot.ini, and the extra halmps.dll/ntkrnlmp.exe copies from system32.

Summary

To take a uniprocessor Windows 2000 SP4 install to multiprocessor on this board: MPS 1.4 disabled in the BIOS, then the MP kernel32/ntdll/win32k from SP4, then the HAL switch, then reapply SP4. The boot.ini test entry makes each step safe to try.

A dual-boot warning: installing the Recovery Console (winnt32 /cmdcons) made the Windows partition the active one, which disabled OS/2’s Boot Manager. If you dual-boot with OS/2, expect to set Boot Manager startable again in LVM afterwards. See Dual-booting OS/2 Warp Server for e-Business and Windows 2000 with LVM and Boot Manager for how.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.