Hello @goetterbote2342, we're using one issue report per unofficially supported game title, and usually I'd transfer this issue report to #10268, however, your choice to use AI tools has resulted in an excessively wordy mess. Feel free to add a note to that issue report, using your own words and a Proton log from a mainline build for a Proton dev to ponder.
ge-proton11-9x1 2026-10proton 11.0x1 2026-10proton experimentalx1 2026-10PROTON_NO_NTSYNC=1x1 2026-10PROTON_USE_XALIA=0x1 2026-10PROTON_VERB=runinprefixx1 2026-10STEAM_COMPAT_CLIENT_INSTALL_PATHx1 2026-10WINEDEBUG=+loaddll,+relayx1 2026-10WINEDEBUG=+win,+msgx1 2026-10WINEDLLOVERRIDESx1 2026-10WINEDLLOVERRIDES="lsteamclient=d;steamclient64=n;steamclient=n"x1 2026-10WINEPREFIX="$PWD/../proton-prefix"x1 2026-10steamclient.dllx1 2026-10steamclient64.dllx1 2026-10
Report produced while fixing a self-hosted Enshrouded dedicated-server deployment (ensmanager.sh). Everything quoted below was observed on the machine described in §2; the same setup on Debian x86_64 shows the same abort.
Compatibility report fields
steamrt4Upstream report — Proton/umu: Windows dedicated server aborts because Valve's
steamclient64.dlltakes an execute fault inDllMainunder the shipped Wine (11.0-based), while Wine's development branch (11.20) runs the very same binaryStatus: ready to file. No account/credentials were available on the machine where this was
written, so it was not posted yet — see "Where to file" at the bottom for the exact
trackers, titles and which sections to paste where.
1. Summary
Subject: Enshrouded dedicated server, Steam app 2278520 (Windows x86_64), started with
umu-launcher 1.4.4 + GE-Proton 11-9 (bundles wine 11.0 Staging).
Symptom: the server starts, then aborts within ~200 ms of its own start:
[steam] Failed to initialize Steamworks system...Generic Error,Message from Steam: Failed to load module 'C:\Program Files (x86)\Steam\steamclient64.dll',[app] Failed to create Steamworks.→ process exits, so it never reaches[Session] 'HostOnline' (up)!and never binds query port 15637.Cause (measured): Wine's loader releases Valve's
steamclient64.dllagain because the DLL'sDllMain(PROCESS_ATTACH) takes an access violation:With Wine's default debug channels the same run prints
wine: Unhandled page fault on execute access to 00006FFFFB24DC74.<base>+0x1930000is the DLL's.fptablesection (SizeOfImage0x197D000, ImageBase0x138000000,
.textisCODE,.fptableat 0x1930000 size 0x100 isDATA/RW); the faultaddress is inside the DLL's own
.text— i.e. the DLL patches code and then jumps into it,and the page is not executable any more.
Control: the same prefix, the same exe and the same
steamclient64.dll(sha256caba4826aa3501039d095aee1843a6bfb270fb43a3ab4455b2d6733223579fee, byte-identical to theSteamworks redistributable from app 1007) run fine under wine-11.20 (Wine development branch):
the module stays loaded (
build_module Loaded ... steamclient64.dll : native, nofree_modref),Steamworks initialises offline (
[API loaded no]) and the server comes up(
[online] Server connected to Steam successfully,[Session] 'HostOnline' (up)!, UDP 15637 listening).Scope of the problem: every Proton/Wine build we could obtain is based on wine 11.0:
GE-Proton 11-9 (newest GE release, 2026-10-14),
proton-cachyos-slr1:11.0.20261014(rebased on Valve's
experimental-wine-bleeding-edge-11.0-453249-20261016, published 2026-10-17)and Valve's Proton Experimental
11.0-20261014— all three fail (the CachyOS one was testeddirectly, the other two are the same wine base). So currently no released Proton can run this
server; the fix exists in Wine's development branch only.
2. Environment
7.2.9-2-cachyosumu/umu/umu-run), runtimesteamrt4GE-Proton11-9(newest GE release 2026-10-14);proton/GE-Proton11-9/version→GE-Proton11-9; wine:wine-11.0 (Staging)(files/lib/wine/x86_64-unix/ntdll.so)proton-prefix(created by Proton for GE-Proton11-9: "Upgrading prefix from None to GE-Proton11-9")wine-11.20(Wine development release, same prefix)proton-cachyos-slr1:11.0.20261014-1 (/usr/share/steam/compatibilitytools.d/…, wine11.0 (CachyOS), rebased onValveSoftware/wine@experimental-wine-bleeding-edge-11.0-453249-20261016-pf413b3-wc53678a-d6689ca-v0bb64c) → same failureThe failure was first hit while fixing a Debian x86_64 deployment of the same setup (
ensmanager.sh,same umu/GE-Proton versions); the machine above is where it was reproduced and traced.
3. Reproduction
3.1 Minimal (umu + GE-Proton)
Notes that matter for the repro:
Z:…). With a unix path, Proton wraps it inits
umu.exeshim and the server deadlocks before it even writes its log (see §6, secondary finding).HKCU\Software\Valve\Steam\ActiveProcess\SteamClientDll64 = C:\Program Files (x86)\Steam\steamclient64.dll, but a prefix created without a Steam client doesnot contain that file. Copy the DLL the server ships into place (otherwise the load fails one step
earlier, for a missing file):
mkdir -p "proton-prefix/drive_c/Program Files (x86)/Steam" && cp enshrouded-server/steamclient64.dll "proton-prefix/drive_c/Program Files (x86)/Steam/"3.2 With logs
Server's own log appears in
enshrouded-server/logs/enshrouded_server.log.4. Observed evidence (verbatim)
Server log (
logs/enshrouded_server.log):WINEDEBUG=+loaddll,+relay(the module is loaded, itsDllMainruns, then the loader releases it):With default debug channels:
(The DLL is loaded at a Wine-chosen base around
0x6FFFFA2E0000;0x6FFFFB24DC74 - base = 0xF6DC74is insideSizeOfImage0x197D000, i.e. in.text. TheVirtualProtectpair targets.fptableat+0x1930000, size 0x100.)5. Control: wine-11.20 with the identical inputs
Result:
build_module Loaded ... enshrouded-server\steamclient64.dll : native— and nofree_modref; the server continues:The client DLL's own call sequence (extracted from both
+relaytraces, filtered to calls madefrom inside the module) is identical up to the fault — same
FlsGetValue2→ NULL, sameVirtualProtectpair, sameGetLastErrorprobes. wine-11.20 continues (moreInitializeCriticalSectionEx), wine-11.0 faults. So the difference is Wine's handling, not theDLL's logic.
6. Secondary finding (same class of environment, worth fixing too)
umu-runis normally called with a unix path. In that case GE-Proton'sprotonscript(
proton:2857) wraps the executable in itsumu.exeshim(
Proton: Executable is a unix path, launching with 'umu.exe'.) and this dedicated server thendeadlocks before writing its log:
wchan=ntsync_schedule, 0 CPU;ioctl → linux_wait_objs → inproc_wait → NtWaitForMultipleObjects → wait_message → wait_message_reply(win32u);WINEDEBUG=+win,+msgends withNtUserWaitForInputIdle timeout or errorand repeatedmsg:send_inter_thread_message hwnd 0x10020 msg 0 (WM_NULL)— the game waits for a reply to amessage sent to the desktop window owned by the shim, while the shim waits for the child.
Passing the Windows path (Proton logs
Executable is inside wine prefix, launching normally)starts the server directly; that is what §3.1 uses. (Not the main subject of this report, but it is
a real deadlock for any headless server launched through umu with a unix path.)
7. Analysis / what we ruled out
All of the following were tried against GE-Proton 11-9 with the same server and produce the same abort
(or a different abort for a missing file); none of them changes the fault:
steamclient64.dll+steamclient.dll);SteamClientDll/SteamClientDll64removed (Could not determine Steam client install directory.);Failed to load module …);WINEDLLOVERRIDESlsteamclient=d|n|b,steamclient64=n,steamclient=n;lsteamclientbridge withSTEAM_COMPAT_CLIENT_INSTALL_PATH/LD_LIBRARY_PATHpointing at a Steam client library (
No SteamClient023— the bridge needs a running Steam client);WINEDLLPATH=<game dir>,PROTON_VERB=runinprefix,UMU_USE_STEAM=1,GAMEID=umu-2278520,SteamAppId/SteamGameId=2278520;PROTON_NO_NTSYNC=1(fsync),WINENTSYNC=1,WINELOADERNOEXEC=1;setarch -X(READ_IMPLIES_EXEC) and anLD_PRELOADshim that ORsPROT_EXECintomprotect(the fault survives, i.e. the page does not merely lose its read-only-exec bit);
winebinary directly (no umu/container, no Proton environment) — same fault,so it is not a Proton environment issue;
proton-cachyos-slr(bleeding-edge 2026-10-16 base) — same fault.Also checked: the Steamworks redistributable (app 1007) ships a byte-identical
steamclient64.dll(sha256caba4826…), so this is not about the server shipping an odd DLL.8. Likely upstream cause (inference, marked as such)
Wine's development branch reworked exactly the address-space reservation and page-protection
bookkeeping in
dlls/ntdll/unix/virtual.cbetween the stable 11.0 release (January 2026) and11.20 (October 2026). The commits present in that window include (dates as of Wine master):
Valve's Proton wine branch does not contain them: on
ValveSoftware/[email protected]…the newest commitstouching
dlls/ntdll/unix/virtual.care Proton HACK reverts dated 2026-10-14, then commits from2026-09-15 / 2026-09-05 — the series above is missing. Consistently, GE-Proton 11-9 and
proton-cachyos(that very bleeding-edge tree) fail, while wine-11.20 (contains the series) works.Caveat: we could not isolate the single fixing commit by bisecting free-running Wine builds; the
statement "this series is what fixes it" is an inference from (a) the behavioural difference
between 11.0 and 11.20 with identical inputs, (b) the fault pattern (page inside a mapped image
becomes non-executable right after the DLL re-protects a neighbouring image page), and (c) the
commit series touching exactly that bookkeeping. Wine developers can confirm/deny this quickly.
9. Impact
Any Windows application under Proton that loads a current Valve Steam client module
(
steamclient64.dll, e.g. shipped with a game/server or the Steamworks redistributable) andself-patches code in
DllMainwill abort under wine-11.0-based Proton builds. Dedicated serversstarted with umu (no Steam client present) are a typical case: Steamworks init cannot succeed, and
some titles treat that as fatal and exit.
10. Suggested actions for the projects
proton_11.0/bleeding-edge onto the current Wine master (or backportthe
dlls/ntdll/unix/virtual.creservation/protection series) so that Wine's page-protectionbookkeeping matches the development branch. After that, no application-side workaround should be
needed for this case.
bleeding-edge tree, which lacks them) — or document the limitation until then.
umu.exeshim whenthe target is a console/headless executable (see §6); the
NtUserWaitForInputIdle+inter-thread
WM_NULLdeadlock is reproducible and makes such servers hang before they log anything.