Repository navigation
Compatibility 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.

- 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.
| 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 |
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_IMAGEmapping,VirtualAllocand TLS workarounds). Windows 95 is an older codebase and is missingKERNEL32functions 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.
- Create a Windows 98 SE virtual machine with 512 MB of RAM or more (see RAM).
- Install Windows 98 SE and make sure it boots reliably.
- Take a snapshot of the clean install. Take another one after each major step below.
- Copy the dotnet48-win98 release to the VM (see step 3).
- Run the KernelEx 4.5.2 installer from
third_party\kernelex-4.5.2. - Restart.
- Download the latest release zip,
dotnet48-win98-x.y.z.zip, from the Releases page. - 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. - Copy the 32-bit
mscoree.dllfrom a Windows 10/11 PC into the extracted folder, besideWIN98SETUP.BAT. - Open an MS-DOS Prompt inside Windows (not real-mode DOS), change to the extracted folder and run:
The VM needs internet access for this step, unless you place
WIN98SETUP.BATNDP48-x86-x64-AllOS-ENU.exeandgdiplus.dllbeside the batch file for an offline install. - Restart.
- After the restart, Notepad opens with the result of a quick check.
HELLO48 OKmeans .NET 4.8 works. You can re-run the check later withC:\DOTNET48\VERIFY.BAT. - Take a snapshot.
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).
- 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 - Install it, or open it with 7-Zip and use the
gdiplus.exeinside to obtaingdiplus.dll. - Make sure
gdiplus.dllends up inC:\WINDOWS\SYSTEM. - Restart.
- 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.
- Download a WinPaletter release that has a version of
1.1.0.0or higher within WinPaletter repository and copy it into the VM. - Double-click
WinPaletter.exe. - If it does not start, set
NETSHIM_LOG=1and run it again. Then checkNETSHIM_EXCEPTIONS.LOG(next toNETSHIM.DLLinC:\WINDOWS\Microsoft.NET\Framework\v4.0.30319) for the original exception.
-
Always expect
OutOfMemoryExceptionerrors, 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.
- Random crashes can happen at any time.
-
UIAutomationCore.dllcrashes 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.
-
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).
- On Windows 9x the system UI font is MS Sans Serif, a bitmap (
.FON) font. - GDI+ and .NET
Fontobjects support only TrueType/OpenType fonts, so MS Sans Serif cannot be loaded as aFont. It will not appear in the font dialog, inFontFamily.Familiesor 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
LOGFONTdata to avoid corrupting the setting.
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.
| 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 |
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.
- dotnet48-win98 by 11EJDE11
- dotnet9x by itsmattkc
- KernelEx
- WinPaletter
- Main form parts
- Color picker
- WallStudio; Generate a WinPaletter theme from an image
- Palette generator
- Skeleton of a feature modification
- How to design and apply a theme
- Theme info
- Windows colors and theme
- LogonUI screen
- Classic colors
- Cursors
- Consoles (Command Prompt and PowerShell)
- Windows Terminal
- Metrics and fonts
- Wallpaper
- Windows Effects
- Windows switcher (Alt+Tab appearance)
- Screen Saver
- Sounds
- WinPaletter application theme
- Basics
- Design themes to be uploaded to servers\GitHub repositories
- Use GitHub manager to upload and publish themes
- For Developers
- Introduction
- Sign in\out GitHub using WinPaletter
- Use GitHub manager to manage and upload themes
- GitHub Manager and security analysis
- Disable Explorer restart
- Advanced options to patch PE files
- Theme log verbose level
- Synchronize ExplorerPatcher settings with WinPaletter preview
- Apply preferences to all users and LogonUI screen