Remove the "Evaluation copy / Insider Preview" desktop watermark on Windows 11.
A rebuild of Universal Watermark Disabler (UWD), reworked for current Windows 11 builds (24H2 / 25H2 / 26xxx, including Insider and beta builds) where the original silently stopped working.
Grab wd11.exe from the latest release. It's a single self-contained file — no installer, no runtime to download, no dependencies. Just run it.
Requirements: Windows 10 1809+ or Windows 11, 64-bit. Administrator rights are needed to install/uninstall (it changes a system registry key).
WD11 isn't code-signed (a certificate costs money), and it uses a legitimate but AV-sensitive technique, so SmartScreen will show a blue warning the first time you run it:
- Click More info
- Click Run anyway
Some antivirus engines may also flag it heuristically because of how it works (a COM proxy injected into Explorer) — this is the same mechanism the original UWD uses. The full source is in this repo if you want to review or build it yourself.
- Run
wd11.exe. - It shows your Windows edition/build and whether WD11 is currently installed.
- Click Install → approve the UAC prompt → Explorer restarts → the watermark is gone.
- To revert, run it again and click Uninstall.
The change survives reboots and Windows updates — it registers a proxy rather than editing any Windows file, so cumulative updates don't wipe it.
The desktop watermark text is drawn by Explorer. WD11:
- Delivery — COM proxy. It points the
CLSID_ExplorerHostCreatorin-proc server at its own DLL, which forwards the real interface toExplorerFrame.dll— so Explorer loads WD11's DLL and keeps working normally. No Windows binary is modified. - Suppression — API hooks. Inside Explorer it patches the import tables (by resolved function address, across every descriptor including delay-load) for
LoadStringW,ExtTextOutW,TextOutW,DrawTextWandDrawTextExW, and drops the watermark strings before they're drawn. - Language-independent. The watermark strings are read from the live localized resources at runtime, so it works on any UI language and survives resource-ID changes between builds.
UWD hooks LoadStringW by matching the import that comes from user32.dll. On modern builds that import arrives through an API-set stub (api-ms-win-core-libraryloader-*.dll), so UWD's name match finds nothing and silently does nothing. WD11 matches by function address instead, which is immune to that redirection. Full write-up in docs/FINDINGS.md.
Prerequisites: Visual Studio 2022 (Community is fine) with:
- Desktop development with C++ (MSVC x64 toolset + Windows 11 SDK)
- .NET desktop development workload
- Windows App SDK C# Templates component
Then, from the repo root:
build_app.cmdThis builds, in order:
wd11.dll— the injected proxy/hook DLL (src/)wd11ctl.exe— the native installer/controller, withwd11.dllembedded (installer/)wd11.exe— the WinUI 3 GUI, withwd11ctl.exeembedded, published as one self-contained file →dist\wd11.exe
To build just the native pieces (no GUI), run build_installer.cmd.
| Path | What |
|---|---|
src/ |
The proxy/hook DLL (C++) — IAT patching, text-draw hooks, string harvesting |
installer/ |
wd11ctl.exe (C++) — takes ownership of the CLSID key, installs/uninstalls, self-elevates. own_test.cpp proves the take-ownership primitive. |
app/ |
The WinUI 3 GUI (C#) |
docs/FINDINGS.md |
The reverse-engineering write-up |
- Based on the technique and original work of PainteR — Universal Watermark Disabler.
- WD11 is an independent reimplementation for modern Windows 11 builds by WRSTT, standing on the shoulders of PainteR's work.
MIT. Provided as-is, with no warranty. It modifies system state on Windows Insider/evaluation installs — use at your own risk.
