Skip to content
Abdelrhman-AK edited this page Oct 22, 2026 · 7 revisions

Running WinPaletter on Windows 9x

Tip

This is for fun and experimentation. It is an unsupported, experimental setup. Do not use it on a machine you care about.

WinPaletter is a .NET Framework 4.8 application. Windows 98 SE can run .NET Framework 4.8 programs through the community project dotnet48-win98, which patches the CLR and wraps missing Win32 APIs (on top of KernelEx). This guide covers getting WinPaletter running on top of it, and the problems you should expect.

alt text


⚠️ Read this first

  • Use a virtual machine, and take a snapshot before you start. Expect Windows misconfigurations, and keep the snapshot to roll back to.
  • Use it for fun. It is not stable and not meant for real use.

Requirements

Item Details
WinPaletter Version 1.1.0.0 and higher
OS Windows 98 SE or Millenium Edition (in a VM). Windows 95 is not supported.
Compatibility layer KernelEx 4.5.2 or later (included in the dotnet48-win98 release, third_party\kernelex-4.5.2)
CPU SSE2-capable (set the VM's CPU accordingly)
RAM 512 MB minimum. 1 GB or more is recommended, together with the RAM patches.
Disk About 1 GB free on the drive that runs the installer, plus about 300 MB on C:
.NET runtime .NET Framework 4.8 via dotnet48-win98
GDI+ gdiplus_dnld.exe (mandatory, see below)
mscoree.dll 32-bit .NET 4.x-era copy from a Windows 10/11 PC (C:\Windows\SysWOW64\mscoree.dll)
Extraction tool 7-Zip 9.20, the last version that runs on Windows 98

Why Windows 95 is not supported

Windows 95 is not supported because none of the layers WinPaletter depends on target it, and running it there did not work in testing.

  • dotnet48-win98 is built for Windows 98 SE only. Windows 95 is not in its requirements.
  • KernelEx targets Windows 98 and Millennium. Windows 95 is not among its listed targets.
  • The compatibility shims are written around Windows 98 behavior (version spoofing, SEC_IMAGE mapping, VirtualAlloc and TLS workarounds). Windows 95 is an older codebase and is missing KERNEL32 functions that Windows 98 added.

Suggested wording for the guide:

Windows 95 is not supported. dotnet48-win98 targets Windows 98 SE, KernelEx does not list Windows 95, and WinPaletter did not work on it in testing.


Installation

1. Prepare the VM

  1. Create a Windows 98 SE virtual machine with 512 MB of RAM or more (see RAM).
  2. Install Windows 98 SE and make sure it boots reliably.
  3. Take a snapshot of the clean install. Take another one after each major step below.

2. Install KernelEx

  1. Copy the dotnet48-win98 release to the VM (see step 3).
  2. Run the KernelEx 4.5.2 installer from third_party\kernelex-4.5.2.
  3. Restart.

3. Install .NET Framework 4.8 (dotnet48-win98)

  1. Download the latest release zip, dotnet48-win98-x.y.z.zip, from the Releases page.
  2. Copy it into the VM and extract it inside Windows 98 itself with 7-Zip 9.20. This keeps long file names. If you see short names such as WIN98S~1.BAT, the install will fail.
  3. Copy the 32-bit mscoree.dll from a Windows 10/11 PC into the extracted folder, beside WIN98SETUP.BAT.
  4. Open an MS-DOS Prompt inside Windows (not real-mode DOS), change to the extracted folder and run:
    WIN98SETUP.BAT
    
    The VM needs internet access for this step, unless you place NDP48-x86-x64-AllOS-ENU.exe and gdiplus.dll beside the batch file for an offline install.
  5. Restart.
  6. After the restart, Notepad opens with the result of a quick check. HELLO48 OK means .NET 4.8 works. You can re-run the check later with C:\DOTNET48\VERIFY.BAT.
  7. Take a snapshot.

4. Install GDI+ (gdiplus_dnld.exe) — required

You must install GDI+ before running WinPaletter. Without it you will get GDI+ exceptions (for example "A generic error occurred in GDI+" or TypeInitializationException errors from System.Drawing).

  1. Get Microsoft's GDI+ redistributable, gdiplus_dnld.exe (version 5.1.3102.1360 was used for testing). It is archived on the Internet Archive: gdiplus_dnld.exe
  2. Install it, or open it with 7-Zip and use the gdiplus.exe inside to obtain gdiplus.dll.
  3. Make sure gdiplus.dll ends up in C:\WINDOWS\SYSTEM.
  4. Restart.
  5. Take a snapshot.

The dotnet48-win98 setup also downloads GDI+ itself when the VM is online. Doing this step explicitly makes sure the DLL is present and is the right version.

5. Run WinPaletter

  1. Download a WinPaletter release that has a version of 1.1.0.0 or higher within WinPaletter repository and copy it into the VM.
  2. Double-click WinPaletter.exe.
  3. If it does not start, set NETSHIM_LOG=1 and run it again. Then check NETSHIM_EXCEPTIONS.LOG (next to NETSHIM.DLL in C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319) for the original exception.

Known limitations

RAM usage

  • Always expect OutOfMemoryException errors, both in WinPaletter itself and in other Windows applications.
  • WinPaletter's RAM usage is high relative to what Windows 9x can handle.
  • Use 512 MB of RAM or more. 1 GB or more works better with RAM patches.

Stability

  • Random crashes can happen at any time.
  • UIAutomationCore.dll crashes when you close forms.
  • Random crashes when applying themes and when closing WinPaletter.
  • WinPaletter will most likely fail to run on the 3rd relaunch (or later).
  • Windows Restart will hang after a few WinPaletter runs. Do a forced reboot (VM reset or power off) instead of using Windows Restart.

Missing features

  • No network access from WinPaletter. This means:
    • no in-app updates
    • no Themes Store
    • no GitHub manager
  • Cannot log off or restart Explorer from WinPaletter.
  • Windows restore points do not work. Your VM snapshot is the only safety net.
  • Application logging (Which is implemented by SeriLog) does not work.
  • Multiple users targeting.
  • Installing and running services (WinPaletter System Events Sounds Service).

MS Sans Serif issue

  • On Windows 9x the system UI font is MS Sans Serif, a bitmap (.FON) font.
  • GDI+ and .NET Font objects support only TrueType/OpenType fonts, so MS Sans Serif cannot be loaded as a Font. It will not appear in the font dialog, in FontFamily.Families or in the installed fonts list.
  • WinPaletter therefore cannot display or edit this font correctly and may substitute another one. Expect wrong previews and incorrect font names for system fonts.
  • Fonts applied to the system should keep their original LOGFONT data to avoid corrupting the setting.

Usage tip: apply one aspect, not a full theme

Applying a full Windows theme changes many settings at once, which makes crashes, hangs and misconfigurations more likely. It is better to open a single aspect (for example colors, or metrics and fonts) and apply only that. Take a snapshot before applying, and apply aspects one at a time.


Troubleshooting

Problem What to try
GDI+ exceptions when drawing Install gdiplus_dnld.exe (step 4), make sure gdiplus.dll is in C:\WINDOWS\SYSTEM, and restart
OutOfMemoryException Increase VM RAM to 1 GB or more, close other programs and restart the VM
WinPaletter will not launch (3rd or later relaunch) Force a reboot of the VM, then launch it again
Windows hangs on Restart Use a forced reboot or VM reset instead
Vague errors such as TypeInitializationException Set NETSHIM_LOG=1, rerun, and read NETSHIM_EXCEPTIONS.LOG
Assembly fails to load with 0x8007001F Delete old copies of DNADVAPI.DLL, DNKERNEL.DLL, CORADV32.DLL, BCRYPT.DLL, W2_32W.DLL or TLS98.DLL found beside the app
Windows behaves strangely after applying a theme Restore the VM snapshot (restore points don't work). Next time apply a single aspect instead of a full theme

Uninstalling

To remove .NET 4.8 from Windows 98, run UNINSTALL.BAT from the dotnet48-win98 folder and restart. Or restore your clean snapshot. It leaves gdiplus.dll and dbghelp.dll in place.


Credits

Clone this wiki locally