these are logs found in the TEMP folder, don't know if that will help find the issue.
Elytra_Anti-Cheat_Framework_20260902144207.elevated.log
Elytra_Anti-Cheat_Framework_20260902144203_000_Elytra_Setup.msi.log
Can confirm — same error reproduces here (App 4809930).
service.exe/control.exe timestamps stay from the original build even after re-running the MSI, only the empty Content folder gets recreated each time.Worth noting for context: previous WARDOGS playtest builds used Easy Anti-Cheat, this is the first build shipping Elytra. Game is scheduled to release 2026-09-10, so hoping this gets prioritized before then.
After working around the Volume GUID path failure in this issue, I reached a second blocker: Elytra's service crashes when its heartbeat.dll calls the missing ntdll.dll.RtlStringFromGUIDEx function.
Could support for RtlStringFromGUIDEx be tracked and considered for implementation in Wine/Proton? Please let me know if a separate upstream Wine report would be more appropriate.
The launcher now reports:
Session prime failed: Pipe closed while reading RPC header
The Proton log identifies the service crash:
Unhandled exception: unimplemented function ntdll.dll.RtlStringFromGUIDEx called in 64-bit code (0x006ffffff5c8c0).
Backtrace:
=>0 0x006ffffff5c8c0 in ntdll (+0x6c8c0)
1 0x006ffffc191136 in heartbeat (+0x1136)
2 0x006ffffc1ad62a in heartbeat (+0x1d62a)
3 0x006ffffc1d6059 in heartbeat (+0x46059)
4 0x006fffffe81669 in kernel32 (+0x11669)
5 0x006ffffff00e0f in ntdll (+0x10e0f)
00000180 (D) C:\Program Files\Elytra\service.exe
In this game's existing prefix, I added these filesystem aliases under pfx/dosdevices:
volume{00000000-0000-0000-0000-000000000043} -> c:
volume{00000000-0000-0000-0000-000000000053} -> s:
Here c: and s: are existing drive links, with s: pointing to the Steam library. I left those existing links unchanged. After adding the aliases, Elytra installed three module CABs into C:\Program Files\Elytra\Content and extracted their contents. The earlier InstallModule file-open failure was no longer the stopping point. The service then crashed during session setup as shown above.
4809930.GE-Proton11-6, with PROTON_LOG=+file %command%.7.2.2-1-cachyos, x86-64.0.0.3.winedump dump -j export also found no RtlStringFromGUIDEx export in the installed official experimental-11.0-20260826-x86_64, proton-11.0-2-x86_64, or proton-10.0-4b 64-bit ntdll.dll files. Their RtlStringFromGUID export is present. This was static inspection; I have not reproduced this second crash with those official builds after adding the aliases.This report concerns the missing API and the observed service crash. Implementing it has not been tested and should not be taken as confirmation that all Elytra functionality or the full game will then work.
@Evansch0 Yeah, re-linking "c:" and "s:" into those volumes, does allow the Anti-cheat to download the related files but snags at the "Session prime".
Don't know if relevant, just to "rule" out the game, if we bypass the anti-cheat we can load the game just fine, including we can do tutorial and the firing range with no problems, I did not attempt anything related to online since that can be a ban-able offense.
Managed to do the tutorial plus spent hours in the firing range.
Followed this up on my machine and got two blockers further than the report. Short version: after working around the Volume GUID issue and implementing the missing RtlStringFromGUIDEx, Elytra gets all the way to loading a kernel-mode driver, which is where Wine ends.
Setup: Nobara 44 (kernel 7.2.0-202.nobara.fc44), Proton-CachyOS 10.0-20251107 and a self-built Proton from the proton_10.0 branch. Steam library on its own mount (/mnt/spiele, NTFS), game at AppID 4809930.
Same as reported: InstallModule failed / Failed to open input file / os error 2, Program Files\Elytra\Content stays empty although the MSI installs fine (Applied execute package: Elytra_Setup.msi, result: 0x0).
Adding the alias @Evansch0 described fixes it:
$WINEPREFIX/dosdevices/volume{00000000-0000-0000-0000-000000000043} -> ../drive_c
Worth spelling out for anyone reproducing: the last byte of the GUID is the ASCII code of the drive letter (C = 0x43, S = 0x53, Z = 0x5a), so the alias needed is derivable, not guesswork. After this, Elytra downloads and installs its three module CABs into Program Files\Elytra\Content.
GetVolumeNameForVolumeMountPointW fails when the library is on its own mountNext failure, not mentioned in the thread yet — the launcher shows:
Failed to compute volume-GUID path for executable
With WINEDEBUG=+volume:
trace:volume:GetVolumePathNameW L"Z:\\mnt\\spiele\\...\\WardogsClient-Win64-Shipping.exe" -> L"Z:\\mnt\\spiele\\"
trace:volume:GetVolumeNameForVolumeMountPointW (L"Z:\\mnt\\spiele\\", ..., 32)
fixme:volume:GetVolumeNameForVolumeMountPointW Mounted Folders are not yet supported
Cause: the Steam library sits below Z: (the unix root drive) on a separate mount point, so GetVolumePathNameW correctly stops at Z:\mnt\spiele\. GetVolumeNameForVolumeMountPointW then rejects it, because it bails out on any path longer than X:\ (dlls/kernelbase/volume.c, "if length of input is > 3 then it must be a mounted folder").
Workaround: launch option
PROTON_SET_GAME_DRIVE=1 %command%
That makes Proton create dosdevices/s: pointing at the library root, so the executable resolves to S:\steamapps\common\... and the volume path becomes a plain S:\:
trace:volume:GetVolumePathNameW L"S:\\steamapps\\common\\...\\WardogsClient-Win64-Shipping.exe" -> L"S:\\"
trace:volume:GetVolumeNameForVolumeMountPointW (L"S:\\", ..., 32)
trace:volume:GetVolumeNameForVolumeMountPointW found symlink=L"\\??\\Volume{00000000-0000-0000-0000-000000000053}"
Note that without that option Proton actively deletes a manually created s: on every start (setup_dir_drive() in the proton script removes the drive when the compat option is absent), which makes hand-made aliases look like they simply don't work. The matching volume{...053} alias has to be created too.
Users whose library is on the same filesystem as / won't hit this at all, which is probably why it hasn't come up yet.
ntdll.RtlStringFromGUIDEx — patched, and it does get past "Session prime"Confirming @Evansch0's finding: the function does not exist in Wine at all (only RtlStringFromGUID, no Ex), and Elytra's heartbeat.dll imports it statically, so service.exe dies immediately:
wine: Call from ... to unimplemented function ntdll.dll.RtlStringFromGUIDEx, aborting
00000190 (D) C:\Program Files\Elytra\service.exe
which surfaces as Session prime failed: Pipe closed while reading RPC header.
I built Proton with the function added, modelled on the existing RtlStringFromGUID:
--- a/dlls/ntdll/ntdll.spec
+++ b/dlls/ntdll/ntdll.spec
@ stdcall RtlStringFromGUID(ptr ptr)
+@ stdcall RtlStringFromGUIDEx(ptr ptr long)
--- a/dlls/ntdll/rtlstr.c
+++ b/dlls/ntdll/rtlstr.c
+NTSTATUS WINAPI RtlStringFromGUIDEx(const GUID *guid, UNICODE_STRING *str, BOOLEAN allocate)
+{
+ TRACE("(%p,%p,%d)\n", guid, str, allocate);
+
+ if (allocate)
+ {
+ str->MaximumLength = (GUID_STRING_LENGTH + 1) * sizeof(WCHAR);
+ str->Buffer = RtlAllocateHeap(GetProcessHeap(), 0, str->MaximumLength);
+ if (!str->Buffer)
+ {
+ str->Length = str->MaximumLength = 0;
+ return STATUS_NO_MEMORY;
+ }
+ }
+ else if (str->MaximumLength < (GUID_STRING_LENGTH + 1) * sizeof(WCHAR))
+ {
+ str->Length = 0;
+ return STATUS_BUFFER_TOO_SMALL;
+ }
+
+ str->Length = GUID_STRING_LENGTH * sizeof(WCHAR);
+ swprintf(str->Buffer, str->MaximumLength/sizeof(WCHAR),
+ L"{%08lX-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}", guid->Data1, guid->Data2, guid->Data3,
+ guid->Data4[0], guid->Data4[1], guid->Data4[2], guid->Data4[3],
+ guid->Data4[4], guid->Data4[5], guid->Data4[6], guid->Data4[7]);
+
+ return STATUS_SUCCESS;
+}
With that build, service.exe starts, registers its event source, extracts the three modules and loads them. The "Session prime" error is gone.
Immediately after loading the modules:
fixme:ntdll:NtLoadDriver (L"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\elytra_gn03Pndpbk4PR2lT"), stub!
trace:loaddll:free_modref Unloaded module L"...\\mod.0420baa4...":
trace:loaddll:free_modref Unloaded module L"...\\mod.04207452...":
trace:loaddll:free_modref Unloaded module L"...\\mod.0420a822...":
The modules Elytra extracts to %LOCALAPPDATA%\Temp\elytra.<guid>.<rnd>\ are:
mod.04207452.../ elytraldrfs_driver.sys PE32+ executable (native), x86-64
elytraldrfs_shared.dll
module.json
mod.0420a822.../ heartbeat.dll
module.json
mod.0420baa4.../ lighthouse_driver.sys PE32+ executable (native), x86-64
lighthouse_bootstrap.dll
lighthouse_module.dll
driver.ini
module.json
Both .sys files are native subsystem, i.e. real kernel-mode drivers. NtLoadDriver is a stub in Wine's ntdll, the service gives up, unloads the modules and the launcher errors out.
So this is a kernel-level anti-cheat. Even with NtLoadDriver wired up to the service manager, Wine's ntoskrnl is a user-mode emulation and an AC driver registering process/thread callbacks and scanning other processes' memory is not going to work — and shouldn't be made to look like it does. Unless the Elytra vendor ships explicit Proton/Linux support the way EAC and BattlEye did, WARDOGS is not runnable on Linux, and the two Wine gaps below only move the failure point.
Both are real gaps independent of this game:
GetVolumeNameForVolumeMountPointW does not support mounted folders, so any application resolving a volume GUID for a file on a non-root mount fails.ntdll.RtlStringFromGUIDEx is missing entirely; patch above works if it's wanted upstream.Happy to provide full PROTON_LOG output for any of the stages.
sad times sad times.
Confirming this issue on CachyOS / KDE Wayland with NVIDIA RTX 3060 and driver 610.57.04.
Tested:
Proton-CachyOS SLR 11
Proton Experimental
Proton Experimental bleeding-edge
completely fresh compatdata prefix
All reproduce the same Elytra InstallModule failed / Failed to open input file / os error 2.
With PROTON_LOG=1 WINEDEBUG=+mountmgr,+file, Wine mountmgr creates both:
??\Volume{00000000-0000-0000-0000-000000000043}
and
\DosDevices\C:
for \Device\HarddiskVolume1.
The downloaded CAB can be opened through its normal C:\users\steamuser\AppData\Local\Temp...cab path, but Elytra subsequently attempts to access the same file through:
\?\Volume{00000000-0000-0000-0000-000000000043}\users\steamuser\AppData\Local\Temp...cab
Wine then returns c00000cb from get_nt_and_unix_names, followed by CreateFileW ... status c0000034.
So this also reproduces on current Experimental bleeding-edge.
// To thanks to my ChatGPT* lol
@Dave-1987 A new update of the playtest has landed and I ran 2 tests one with Experimental(bleeding-edge) and CachyProtonLatest.
I have the volumes linked and I'm getting this anti-cheat error:
I have also collected logs from both runs:
Hope this helps.
Elytra runs on both The Finals and Arc Raiders, which both work on Linux (CachyOS and Bazzite in my experience). Why don't those games have this issue?
EDIT - Other users have informed me that the version of Elytra that runs on Embark's games is running in a different mode that doesn't require the kernel drivers. See below!
Elytra runs on both The Finals and Arc Raiders, which both work on Linux (CachyOS and Bazzite in my experience). Why don't those games have this issue?
That doesnt run thats server side collecting data for ML
Elytra runs on both The Finals and Arc Raiders, which both work on Linux (CachyOS and Bazzite in my experience). Why don't those games have this issue?
iirc this is not ture
(the finals & arc raiders )
its disabled on both and only "runs for data collection"
Wardogs is afaik currently the only game to run it actively
also here is a good read up for it
https://www.invenglobal.com/articles/25085/the-era-of-guarding-game-files-is-over-the-shift-seen-by-embark
There is a discord user id like to quote here for visibility :
Wardogs / Elytra on Proton — diagnosed to the wall
Ran the whole chain in the game's own prefix. Three findings, in order:
1. Install failure — root cause found and fixed. Elytra passes file paths to its service as volume-GUID paths (GetFinalPathNameByHandleW, VOLUME_NAME_GUID). Wine fabricates \\?\Volume{00000000-0000-0000-0000-0000000000<hex of drive letter>} and then cannot reopen it — STATUS_OBJECT_NAME_NOT_FOUND, surfacing as your "File not found (os error 2)". Workaround: symlinks in pfx/dosdevices/ named for those fake GUIDs. Applied for C:, S:, Z:. All three modules now install (Module added successfully, cabs in C:\Program Files\Elytra\Content). The MSI, the service registration, and the RPC pipe were all fine the whole time.
2. Next blocker, soft. heartbeat.dll imports ntdll.RtlStringFromGUIDEx, unimplemented in Wine → hard abort during session prime. Absent from proton-cachyos-slr, -native, and Proton 9.0 alike, so A/B-ing Proton Experimental won't clear it. Small Wine patch.
3. Terminal blocker. Priming the driver module alone: fixme:ntdll:NtLoadDriver ... stub! → Load fails 0x80070001. Two of the three modules ship real kernel drivers (elytraldrfs_driver.sys, lighthouse_driver.sys). Wine has no kernel to load them into.
Verdict: unplayable until Embark ships a Proton path, same as EAC got. Nothing further in the prefix reaches it. The volume-GUID bug is worth a Wine bugzilla report on its own; the rest is good ProtonDB material since no data exists yet. Leftovers: 55 MB of cabs in the prefix Temp\elytra-mods — say the word and I'll clear them.
In addition to the previous comment about the Elytra download error on Proton Experimental:
After applying the volume{...0043} -> ../drive_c workaround and successfully installing, the current Proton Experimental on CachyOS runs into the subsequent errors as well.
1129356:20794.593:015c:01c0:trace:loaddll:build_module Loaded L"C:\\users\\steamuser\\AppData\\Local\\Temp\\elytra.28c7fa0f-5c9d-4ac8-884a-d17a8447733e.knqAjZ\\mod.04206c23ad67d4551cf8e94075b246a8f53049327fc677d61fd353ae6bd937b265af.lKaGEY\\heartbeat.dll" at 00006FFFFD830000: native
1129360:20794.595:015c:01c0:fixme:ntdll:NtLoadDriver (L"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\elytra_3UUXcdDVdiYhn62c"), stub!
1129362:wine: Call from 00006FFFFFF9C280 to unimplemented function ntdll.dll.RtlStringFromGUIDEx, aborting
1129423:wine: Unimplemented function ntdll.dll.RtlStringFromGUIDEx called at address 00006FFFFFF9C280 (thread 01d0), starting debugger...
1129515:Unhandled exception: unimplemented function ntdll.dll.RtlStringFromGUIDEx called in 64-bit code (0x006ffffff9c280).
1129541: 1 0x006ffffd831136 in heartbeat (+0x1136) (0000000000000000)
1129542: 2 0x006ffffd84d62a in heartbeat (+0x1d62a) (0000000000000000)
1129543: 3 0x006ffffd876059 in heartbeat (+0x46059) (0000000000000000)
Have the same error.
Independent confirmation on Gentoo with the official Proton Experimental.
Environment
Game: WARDOGS Playtest, AppID 4809930
Distro: Gentoo Linux
Kernel: 7.2.2
Proton: official Proton Experimental
Trace used: PROTON_LOG=1 WINEDEBUG=+timestamp,+pid,+tid,+winhttp,+wininet,+winsock,+file %command%
Observed sequence
Elytra successfully fetches its config from elytra.ac (HTTP/1.1 200 OK).
It downloads the anti-cheat CAB successfully (HTTP/1.1 200 OK, Content-Length: 189929).
The temporary *.cab.part file is successfully renamed to *.cab.
The CAB is readable through the normal path under C:\users\steamuser\AppData\Local\Temp....
Elytra verifies the module signature successfully.
During Installing module 1 of 3, the service attempts to reopen the same CAB through a Volume GUID path:
\?\Volume{00000000-0000-0000-0000-000000000043}\users\steamuser\AppData\Local\Temp...
Wine then fails that open with CreateFileW ... status c0000034 / file not found.
Elytra reports:
InstallModule failed
RPC error:
Failed to open input file
crates/bin/service/src/server_module.rs:28
File not found. (os error 2)
The current module ID on my system is:
042079a62a15754c377467867d487adcbbc4e0d12768ce9c0ed7c4752763a4e1d108
Elytra's own ElytraLauncher.log confirms that download and signature verification complete before the failure, so this is not a network/download problem. The failure reproduces across multiple launches/build updates on Sep 3-4.
This independently confirms the Volume GUID path-resolution failure on Gentoo + official Proton Experimental. I have not applied filesystem aliases, patched Wine/Proton, or bypassed the anti-cheat. Full Proton/Elytra traces are available if useful.
Independent confirmation on Bazzite using official Proton Experimental (experimental-11.0-20260826-x86_64).
I reproduced the same Volume-GUID failure with WINEDEBUG=+file.
The downloaded CAB is successfully created and opened through the normal DOS path:
C:\users\steamuser\AppData\Local\Temp<module>.cab
Wine resolves that path successfully (ret 0).
Elytra then attempts to reopen the same CAB through:
\?\Volume{00000000-0000-0000-0000-000000000043}\users\steamuser\AppData\Local\Temp<module>.cab
At that point:
get_nt_and_unix_names -> ret c00000cb
CreateFileW -> status c0000034
The CAB is then removed and InstallModule fails.
So the original Volume-GUID issue is reproducible on Bazzite with current official Proton Experimental as well.
I’ve attached a sanitized WINEDEBUG extract containing only the relevant CAB operations.
please post the latest pins or information and not old stuff (:
or thier CEO (Joe Brammer) on Twitter:
No, we are just prioritising security ahead of that part of the playerbase. We will bring the game to proton properly ASAP which should be soon after launch.
Security and perf are our biggest priorities, we won’t compromise them.
Yes, we want Linux users to play and we’ll be prioritising that, in part for Steam deck. But not at the expense of security.
So no timeline, but fast. It’s an anti cheat related issue not anything else.
Same failure here, and I traced it to the bottom. Three separate causes, two of them plain Wine gaps with fixes, the third a hard stop.
Setup: Fedora 44 (KDE), kernel 7.1.13-200.fc44.x86_64, WARDOGS Playtest (4809930). Reproduced on Proton Experimental (wine-11.0) and Proton 11.0-2c. Fresh prefix. Launch options used for the traces below:
PROTON_LOG=1 WINEDEBUG=+timestamp,+pid,+tid,+seh,+loaddll,+file,+service,+winedevice %command%
The user-facing dialogs ("anti-cheat module could not be downloaded or installed", then "the anti-cheat service refused the game executable") are the launcher's generic stage messages; the real errors are in drive_c/users/steamuser/AppData/Local/Wardogs/ElytraLauncher.log and the Proton log.
\\?\Volume{GUID}\… paths never resolve (module install failure)Confirms the original report. Elytra's service downloads the module CAB through C:\users\…\Temp\, then re-opens it through the volume-GUID path and Wine returns c0000034.
Root cause: nt_to_unix_file_name_no_root() (dlls/ntdll/unix/file.c) maps \??\<prefix>\rest to $WINEPREFIX/dosdevices/<prefix> (prefix lowercased) and returns STATUS_BAD_DEVICE_TYPE when that entry doesn't exist, so the open falls through to the wineserver object namespace and fails. mountmgr synthesizes the per-drive GUID in get_default_uuid() as an all-zero GUID with the last byte set to 'A' + drive (C: → …043, S: → …053, Z: → …05a), and GetFinalPathNameByHandleW(VOLUME_NAME_GUID) hands that path back to the application — but nothing makes it openable. (HKLM\System\MountedDevices is REG_OPTION_VOLATILE, so the GUID never appears in system.reg either.)
Workaround — one symlink per drive letter, lowercase name:
cd "$WINEPREFIX/dosdevices"
ln -s ../drive_c "volume{00000000-0000-0000-0000-000000000043}"
With that in place the same open succeeds:
trace:file:get_nt_and_unix_names L"\\??\\Volume{00000000-0000-0000-0000-000000000043}\\users\\steamuser\\AppData\\Local\\Temp\\0420….cab" -> ret 0 … unix "…/pfx/dosdevices/volume{00000000-0000-0000-0000-000000000043}/users/steamuser/AppData/Local/Temp/0420….cab"
and all three Elytra modules download, verify and install. A proper fix would resolve \??\Volume{…} prefixes that match a drive's GUID inside nt_to_unix_file_name_no_root() (or have mountmgr create the dosdevices entries).
ntdll.RtlStringFromGUIDEx doesn't exist (service abort during session prime)Next, the service (C:\Program Files\Elytra\service.exe) loads its heartbeat.dll module, which imports RtlStringFromGUIDEx. The export is absent from ntdll.spec (not even a stub), so the loader binds it to the abort thunk:
wine: Call from 00006FFFFFF9C280 to unimplemented function ntdll.dll.RtlStringFromGUIDEx, aborting
trace:seh:dispatch_exception code=80000100 (EXCEPTION_WINE_STUB) flags=1 addr=00006FFFFFF9C280
warn:seh:virtual_unwind backtrace: 00006FFFFFF9C280: L"ntdll.dll" + 000000000006C280.
warn:seh:virtual_unwind backtrace: 00006FFFFC6D1136: L"heartbeat.dll" + 0000000000001136.
warn:seh:virtual_unwind backtrace: 00006FFFFC6ED62A: L"heartbeat.dll" + 000000000001D62A.
warn:seh:virtual_unwind backtrace: 00006FFFFC716059: L"heartbeat.dll" + 0000000000046059.
warn:seh:virtual_unwind backtrace: 00006FFFFFEC1649: L"kernel32.dll" + 0000000000011649.
The service process dies, the launcher's RPC pipe closes (Session prime failed: Pipe closed while reading RPC header), and the user sees "refused the game executable".
Patch below (applies to proton_11.0, bleeding-edge and upstream master). I rebuilt x86_64-windows/ntdll.dll from tag proton-wine-11.0-2c with it, dropped it into Proton 11.0, and the service now gets past heartbeat.dll and returns a real RPC error instead of dying. Semantics: AllocateGuidString=TRUE behaves like RtlStringFromGUID; FALSE formats into the caller's buffer, STATUS_BUFFER_TOO_SMALL under 76 bytes, NUL-terminated when there's room. I don't have a Windows conformance test for the exact too-small threshold, so this is deliberately lenient.
diff -ruN a/dlls/ntdll/ntdll.spec b/dlls/ntdll/ntdll.spec
--- a/dlls/ntdll/ntdll.spec 2026-09-05 16:34:39.157542496 +0000
+++ b/dlls/ntdll/ntdll.spec 2026-09-05 16:34:39.231741528 +0000
@@ -1051,6 +1051,7 @@
@ stub RtlStartRXact
# @ stub RtlStatMemoryStream
@ stdcall RtlStringFromGUID(ptr ptr)
+@ stdcall RtlStringFromGUIDEx(ptr ptr long)
@ stdcall RtlSubAuthorityCountSid(ptr)
@ stdcall RtlSubAuthoritySid(ptr long)
@ stdcall RtlSubtreePredecessor(ptr)
diff -ruN a/dlls/ntdll/rtlstr.c b/dlls/ntdll/rtlstr.c
--- a/dlls/ntdll/rtlstr.c 2026-09-05 16:34:39.156051140 +0000
+++ b/dlls/ntdll/rtlstr.c 2026-09-05 16:34:39.234191181 +0000
@@ -1703,6 +1703,49 @@
return STATUS_SUCCESS;
}
+/*************************************************************************
+ * RtlStringFromGUIDEx (NTDLL.@)
+ *
+ * Convert a GUID into a string representation of a GUID, optionally
+ * using a caller supplied buffer.
+ *
+ * PARAMS
+ * guid [I] GUID to convert
+ * str [I/O] Destination for the converted string. If alloc is FALSE,
+ * Buffer and MaximumLength must be set by the caller.
+ * alloc [I] TRUE to allocate the string buffer, as RtlStringFromGUID does.
+ *
+ * RETURNS
+ * Success: STATUS_SUCCESS. str contains the converted value.
+ * Failure: STATUS_NO_MEMORY, if memory for str cannot be allocated, or
+ * STATUS_BUFFER_TOO_SMALL, if the supplied buffer is too small.
+ */
+NTSTATUS WINAPI RtlStringFromGUIDEx(const GUID *guid, UNICODE_STRING *str, BOOLEAN alloc)
+{
+ WCHAR buffer[GUID_STRING_LENGTH + 1];
+
+ TRACE("(%p,%p,%u)\n", guid, str, alloc);
+
+ if (alloc) return RtlStringFromGUID(guid, str);
+
+ if (!str->Buffer || str->MaximumLength < GUID_STRING_LENGTH * sizeof(WCHAR))
+ {
+ str->Length = 0;
+ return STATUS_BUFFER_TOO_SMALL;
+ }
+
+ swprintf(buffer, GUID_STRING_LENGTH + 1,
+ L"{%08lX-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}", guid->Data1, guid->Data2, guid->Data3,
+ guid->Data4[0], guid->Data4[1], guid->Data4[2], guid->Data4[3],
+ guid->Data4[4], guid->Data4[5], guid->Data4[6], guid->Data4[7]);
+
+ str->Length = GUID_STRING_LENGTH * sizeof(WCHAR);
+ memcpy(str->Buffer, buffer, str->Length);
+ if (str->MaximumLength >= str->Length + sizeof(WCHAR)) str->Buffer[GUID_STRING_LENGTH] = 0;
+
+ return STATUS_SUCCESS;
+}
+
/***********************************************************************
* Message formatting
diff -ruN a/include/winternl.h b/include/winternl.h
--- a/include/winternl.h 2026-09-05 16:34:39.161609843 +0000
+++ b/include/winternl.h 2026-09-05 16:34:39.233876901 +0000
@@ -5257,6 +5257,7 @@
NTSYSAPI NTSTATUS WINAPI RtlSleepConditionVariableCS(RTL_CONDITION_VARIABLE*,RTL_CRITICAL_SECTION*,const LARGE_INTEGER*);
NTSYSAPI NTSTATUS WINAPI RtlSleepConditionVariableSRW(RTL_CONDITION_VARIABLE*,RTL_SRWLOCK*,const LARGE_INTEGER*,ULONG);
NTSYSAPI NTSTATUS WINAPI RtlStringFromGUID(REFGUID,PUNICODE_STRING);
+NTSYSAPI NTSTATUS WINAPI RtlStringFromGUIDEx(REFGUID,PUNICODE_STRING,BOOLEAN);
NTSYSAPI LPDWORD WINAPI RtlSubAuthoritySid(PSID,DWORD);
NTSYSAPI LPBYTE WINAPI RtlSubAuthorityCountSid(PSID);
NTSYSAPI NTSTATUS WINAPI RtlSystemTimeToLocalTime(const LARGE_INTEGER*,PLARGE_INTEGER);
NtLoadDriver is a stub — and behind it is a kernel anti-cheatWith 1 and 2 fixed, session-prime fails with a structured error:
Failed to invoke `Load` on one or more modules
crates/bin/service/src/v2/session.rs:202
mod: 23da072e-f99b-4807-90e0-5670036c3261@10
Invoking IElytraModule::load failed — Invalid function. (0x80070001)
matched in the Proton log by:
fixme:ntdll:NtLoadDriver (L"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\elytra_jfdRtz8-EALC7JEW"), stub!
STATUS_NOT_IMPLEMENTED → ERROR_INVALID_FUNCTION → 0x80070001. The module set the backend serves for this title (from the CABs' module.json):
| classid | entrypoint | payload |
|---|---|---|
{23da072e-…} rev 10 |
elytraldrfs_shared.dll |
elytraldrfs_driver.sys (293 KB) |
{0b9c0968-…} rev 2 |
heartbeat.dll |
— |
{597ca429-…} rev 44, depends on both above |
lighthouse_bootstrap.dll |
lighthouse_module.dll, lighthouse_driver.sys (48.9 MB), driver.ini |
So the loader module calls NtLoadDriver directly (random service name, not via the SCM) to bring up a kernel driver, and the actual anti-cheat is a ~49 MB kernel driver on top of it. Routing NtLoadDriver into winedevice.exe would only move the failure into DriverEntry. Nothing further is fixable on the Wine side: this build needs the vendor's Proton profile (Elytra runs under Proton for THE FINALS and ARC Raiders, so a user-mode module set exists — it just isn't enabled for WARDOGS, which matches what Bulkhead has said publicly).
Items 1 and 2 are worth fixing in Wine/Proton independently of this game. Full logs available on request.
i wouldnt recommend following @nickmartin1ee7 's fixes as you will likely be banned, since elytra doesnt natively have linux support
these linux compat patches would need to come upstream from embark studios directly
just for devs looking here there is a proof of work which even implements their ac
it probably also not desired by the devs anyways :/
but maybe it helps embark to implement a fix (:
Same thing on the full EA release (1867240), not just the Playtest.
Steam Machine, SteamOS, Proton 11.0. Launcher fails with WD-L010-4ea7b9bda656.
Elytra's actual errors only show up with +eventlog (ReportEventW is a stub otherwise):
5475.925:017c:0198:trace:eventlog:ReportEventW L"Service started with arguments: [\"Elytra.Service\"]"
5476.036:017c:01ac:trace:eventlog:ReportEventW L"is_module_installed(0420a0b6d89ceec7fd6b01bb536b90ef72f45c124c939ad156063268266cd2bae75f) -> false"
5476.093:017c:01ac:trace:eventlog:ReportEventW L"c -> s: {\"jsonrpc\":\"2.0\",\"id\":2,\"method\":\"InstallModule\",\"params\":[\"\\\\\\\\?\\\\Volume{00000000-0000-0000-0000-000000000043}\\\\users\\\\steamuser\\\\AppData\\\\Local\\\\Temp\\\\0420a0b6d89ceec7fd6b01bb536b90ef72f45c124c939ad156063268266cd2bae75f-316-5476036.cab\"]}"
5476.093:017c:01ac:trace:eventlog:ReportEventW L"s -> c: {\"jsonrpc\":\"2.0\",\"id\":2,\"error\":{\"code\":-32000,\"message\":\"Failed to open input file / crates/bin/service/src/server_module.rs:28 / Fichier introuvable. (os error 2)\"}}"
Module hash changed since the Playtest (0420a0b6... vs 04207452...) but it still dies on the Volume GUID path. Service goes quiet right after GetTempPath2W, launcher gives up ~20s later with error 1726.
Should this be tracked on a new Issue since APPID changed?
I have logs for the current release, APPID: 1867240
Replying to https://github.com/ValveSoftware/Proton/issues/10113#issuecomment-5548762008
yeah
just refund. Its a fucking circus
Replying to [#10113 (comment)](https://github.com/ValveSoftware/Proton/issues/10113#issuecomment-5637653230)
im not seeing the change number listed here on steamdb
https://steamdb.info/changelist/38799019/
proton 11.0x2 2026-09proton experimentalx8 2026-09proton 11.0-2cx1 2026-09proton 9.0x1 2026-09proton 10.0x1 2026-09proton 11.0-2x2 2026-09ge-proton11-6x1 2026-09proton 10.0-4bx1 2026-09proton 9.0-203x1 2026-09proton 10.0-4x1 2026-09PROTON_LOG=1x4 2026-09WINEPREFIXx2 2026-09WINEDEBUG=+timestamp,+pid,+tid,+seh,+loaddll,+file,+service,+winedevicex1 2026-09WINEDEBUG=+filex2 2026-09WINEDEBUGx1 2026-09WINEDEBUG=+timestamp,+pid,+tid,+winhttp,+wininet,+winsock,+filex1 2026-09WINEDEBUG=+mountmgr,+filex1 2026-09PROTON_LOGx1 2026-09PROTON_SET_GAME_DRIVE=1x1 2026-09WINEDEBUG=+volumex1 2026-09PROTON_LOG=+filex1 2026-09PROTON_SET_GAME_DRIVE=1 %command%x1 2026-09heartbeat.dllx5 2026-09ntdll.dllx4 2026-09elytraldrfs_shared.dllx2 2026-09lighthouse_bootstrap.dllx2 2026-09lighthouse_module.dllx2 2026-09kernel32.dllx1 2026-090x80070001x2 2026-09
WARDOGS Playtest (4809930) – Elytra InstallModule fails opening CAB through Volume GUID path
Compatibility Report
Name: WARDOGS Playtest
Steam AppID: 4809930
Distribution: Linux Mint
Kernel: 7.0.0-28-generic
Proton versions tested
The issue reproduces with:
Proton Experimental
Proton 11.0-2
Proton 10.0-4
A completely fresh Proton prefix was also tested.
Symptoms
WARDOGS starts the Elytra anti-cheat/service installation, but Elytra fails during InstallModule.
The Elytra error dialog reports:
InstallModule failed
RPC error:
Failed to open input file
crates/bin/service/src/server_module.rs:28
File not found. (os error 2)
The module identifier involved is:
042074521588d69599a364e2f975460e68551832d35317ce19bd30af43e9cca90758
Investigation
Testing with:
PROTON_LOG=1 WINEDEBUG=+file %command%
shows that Elytra successfully creates/downloads:
C:\users\steamuser\AppData\Local\Temp
042074521588d69599a364e2f975460e68551832d35317ce19bd30af43e9cca90758.cab.part
It then renames it to:
C:\users\steamuser\AppData\Local\Temp
042074521588d69599a364e2f975460e68551832d35317ce19bd30af43e9cca90758.cab
The CAB exists and can be accessed through the normal C: path.
However, Elytra subsequently attempts to open the same CAB using a Windows Volume GUID path:
\?\Volume{00000000-0000-0000-0000-000000000043}
users\steamuser\AppData\Local\Temp
042074521588d69599a364e2f975460e68551832d35317ce19bd30af43e9cca90758.cab
Wine then fails the file open with:
CreateFileW Unable to create file ... (status c0000034)
After the failure, the downloaded CAB is removed.
MountedDevices
The Proton prefix contains:
HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices
??\Volume{00000000-0000-0000-0000-000000000043}
REG_BINARY 2E2E2F64726976655F6300
\DosDevices\C:
REG_BINARY 2E2E2F64726976655F6300
Therefore the Volume GUID used by Elytra and C: appear to reference the same backing path.
Nevertheless, opening the CAB through the Volume GUID path fails while the regular C: path works.
Reproduction
Install WARDOGS Playtest (Steam AppID 4809930).
Force Proton Experimental, Proton 11.0-2, or Proton 10.0-4.
Use a fresh compatibility prefix.
Launch the game.
Elytra installs and starts its service.
Elytra downloads the module CAB to %LOCALAPPDATA%\Temp.
Elytra attempts to access the CAB through \?\Volume{...}.
CreateFileW fails with status c0000034.
Elytra reports InstallModule failed / Failed to open input file / os error 2.
Expected result
The Volume GUID path corresponding to the Proton C: drive should resolve to the same file as the normal C:... path, allowing Elytra to install its module.
Actual result
The CAB can be downloaded and accessed through C:..., but opening the same file through the corresponding \?\Volume{GUID}... path fails.
The behavior is reproducible after deleting the entire Proton compatibility prefix and allowing Steam/Proton to recreate it.