Repository navigation
host: offline EOS stubs answer a usable platform handle (MARVEL Cosmic Invasion) - #2596
Open
bensaadmucret wants to merge 1 commit into
Open
bensaadmucret wants to merge 1 commit into
bensaadmucret wants to merge 1 commit into
Conversation
This was referenced Nov 13, 2026
…c Invasion) A game that links the EOS client into main while its EOS module NRO is refused as an online SDK (hle_ro.c) got a null EOS_HPlatform from the generic stub: EOS_Platform_Create returned 0 and never wrote the output handle, and the game dereferenced the address at once (main+0x956aac, sig=11). Hades survives the refused module because its EOS calls live inside it; MARVEL Cosmic Invasion (FNA, SDL_GPU) imports EOS_Platform_Create directly. EOS_Platform_Create now answers the options pointer, a mapped non-null guest address the game treats as an opaque handle and writes to its out parameter, and the EOS_Platform_Get*Interface stubs answer that handle (regs[0]) instead of 0, which took the game past Connect/Auth setup into Vulkan init. The remaining EOS calls return 0 = offline success; EOS_Platform_Tick runs in the frame loop. Checked: dmhost builds and the game boots through EOS_Platform_GetConnectInterface into SDL_GPU's Vulkan init, draws and audio at 60 FPS in a window.
bensaadmucret
force-pushed
the
pr-eos-platform-handle
branch
from
November 14, 2026 13:59
aaf2235 to
bae03e1
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What and why
A game that links the EOS client into
mainwhile its EOS module NRO is refused as an online SDK (Online SDKs in NROs are never loaded) crashed on a nullEOS_HPlatform:EOS_Platform_Createwas a generic stub that returned 0 and never wrote the output handle, and eachEOS_Platform_Get*Interfacestub returned null too, which the game dereferenced and then called through (sig=11at boot, thenpc=0). Hades survives the refused module because its EOS calls live inside it; MARVEL Cosmic Invasion (FNA, SDL_GPU, title010059D020C26000) importsEOS_Platform_Createdirectly.EOS_Platform_Createnow writes the options pointer itself — a mapped, non-null guest address the game treats as an opaqueEOS_HPlatform— and a stub whose name holdsEOS_Platform_GetandInterfaceanswers the platform handle it was called with, so the offline path continues. The handle is never a real EOS object and the host never serves Epic services; the game ticks it and plays offline.Adds the finding to docs/reference/services.md (
EOS_Platform_Createcalled on the refused module's client inmain).Checked
python3 -m unittest dm.tools.tests.test_docs(6 tests, links and symptom index)010059D020C26000v0 (buildD6A37DEAFF3F5AEA, provisional profile): before the fix it aborted on the null platform dereference at boot; after, EOS initialization completes and the game reaches its frame loop — intro video at 60 fps with audio, ~870 draws/frame (with the sibling Vulkan PRs, see below)regress.py impact: the change reacheshle:*in theory, but only stubs namedEOS_Platform_Get*Interfacebehave differently — every other unimplemented import returns 0 exactly as before, so no profiled game's path changes.regress.py check --gameswas not run: no local game build exercises this path, and the only caller pattern affected is the one this fix is for.Docs
docs/reference/<subsystem>.mdentry, andpython3 dm/tools/docs_symptoms.pywas run (the symptom index)dmsh_chain.py --headerwas run anddm/gfx/nvn/dmsh_chain.his part of the change