Download
Download this release containing ALL files for normal/regular use:
In-Progress
SHA-256: In-Progress
Latest XLLN Repository CI Builds:
If you are:
- having troubles running a Title and wish to diagnose the issue (by checking the debug logs)
- experiencing a regression in compatibility and want to find what change caused it
- or wish to use the most recent changes available instead of waiting for the next official release
you can find and download the alternate binaries here:
XLiveLessNess Debug mode:
https://gitlab.com/GlitchyScripts/xlivelessness/-/jobs/artifacts/master/browse/bin/?job=build:%20%5BDebug%5D
XLiveLessNess Release mode:
https://gitlab.com/GlitchyScripts/xlivelessness/-/jobs/artifacts/master/browse/bin/?job=build:%20%5BRelease%5D
XLLN-Modules Debug & Release mode:
https://gitlab.com/GlitchyScripts/xlln-modules/-/jobs/artifacts/master/browse/bin/?job=build
XLLN-Hub for Linux:
https://gitlab.com/GlitchyScripts/xlln-online-hub/-/jobs/artifacts/master/browse/bin/?job=build-linux
XLLN-Hub for Windows:
https://gitlab.com/GlitchyScripts/xlln-online-hub/-/jobs/artifacts/master/browse/bin/?job=build-windows
Release Info and Changes
Sessions and Matchmaking
- !30 A search returned every context and property a session held, overrunning a Title that sizes
its result handling against its own query → emit only what the XLAST query declares, in the
order it declares them, and omit an attribute the session never set
- !34 Every supplied context was matched for equality → apply the Filters and the Constants the
Title's XLAST query declares, with the operators they name
- !30 A session advertised only the properties it held at creation, so a lobby configured
afterwards never reached a search → carry a property into the session, as contexts already were
- !34 Context and property updates reached only the first local session
- !35 XUserSetContextEx and XUserSetPropertyEx skipped a session this instance hosts but the user
has not joined, dropping every attribute set before the local join
- !36 XSessionDelete only marked the session deleted, so it was advertised for the life of the
process → skip deleted sessions and unadvertise, rather than waiting out the 15 second expiry
Fixes: Battlestations Pacific, GTA IV, Section 8: Prejudice (dedicated servers), Universe at War: Earth Assault.
Discovery and Session Identity
- !33 The remote session store was keyed by host instance alone, so a host's party session and its
matchmaking session displaced each other on every broadcast tick and only one was ever visible
→ key by instance id and session id
- !33 A party session (GROUP_LOBBY) and a session with no open public slots are no longer offered
to matchmaking; both stay reachable by session id, which is how an invitation resolves
- !33 dwOpenPublicSlots reported the allocation instead of what is left, so a session with 1 of 32
slots taken was described as having 32 open
- !33 The unadvertise packet never assigned its sessionType, so the receiver chose which store to
purge out of uninitialised memory
- !36 The unadvertise packet named an instance, not a session → it now carries the session id,
appended so an older instance reads the packet exactly as before
- !33 The LiveOverLan broadcast walked the local sessions holding only the broadcast lock, while
XCloseHandle frees those entries from the Title's thread → take xlive_critsec_xsession
Fixes: RE: Operation Raccoon City, GTA IV (Party Mode).
Winsock / Sockets
- !35 Bind and packet routing compared the port number alone, so a Title holding a stream and a
datagram socket on one port lost the second bind and misrouted datagrams → key by transport
- !35 An accepted socket inherits the listener's port without registering it, so closing one
erased the listener's routing entry → only the registered socket erases it
- !35 An owed ack or keep-alive left an idle socket on the six second backstop until the peer gave
up → submit the wait deadline, and wake the thread on an owed ack
- !40 sendto() on a connected TCP socket was rejected with WSAEINVAL and the payload discarded.
Winsock ignores the address there and sends to the connected peer. Three decisions after it
also read the address in place of the socket type, so a stream send carrying an address went
out as a datagram to a port where nothing listens
- !41 A lost TCP connection woke a blocked connect, a blocked select and the WSAEventSelect close
event, but never a blocking recv → the Title thread stayed parked for data that cannot arrive
- !41 SO_SNDTIMEO was stored by setsockopt and read by nothing, so every blocking send wait was
infinite
Fixes: Crash Time 4 (3+ player races, and the host freezing when a client leaves).
Title Servers (XLSP)
- !32 XLSP was stubbed out, so a Title that reaches its dedicated servers through it could not
connect → bridge a dial to a declared secure-gateway port onto a real TCP connection. Configured
per Title inXLiveLessNess/xlln-xlsp/*.json, matched on the running title id, and inert unless
an entry matches. The backend's close surfaces to the Title as EOF, so read-until-close
responses terminate
- !32 XN_LIVE_CONNECTIONCHANGED was dropped when it was raised before the Title created its
listener → retain it on zero listeners, so a Title that signs in first still learns it is online
- !32 A second XLiveUninitialize waited on the GetCurrentProcess() pseudo-handle, which is the same
value as INVALID_HANDLE_VALUE, and blocked until the process exits — with nothing logged. Each
window teardown is now guarded on its own destroy event
- !32 Config paths are resolved while the working directory is still the game root, because a Title
can change it after startup and break every later config-relative lookup
Fixes: Section 8: Prejudice, Crash Time 4 ("Online" greyed out).
Achievements and Stats
- !19 Stats a Title writes are now kept, persisted per title and user to stats.dat, and served back
on XUserReadStats. The file is written to a temp name and swapped in, so a crash or a full disk
leaves the previous stats.dat intact
- !19 View and column names are resolved from the SPA's embedded XLAST project, and an XLLN
debug Stats window lists every declared stat per view and can view or edit stored values
- !19 HexStrToByteArray read overlapping character pairs, kept only the low nibble of each byte and
accepted a-z/A-Z beyond the hex range. This also affected xcontent's contentId config parsing
- !31 XSessionWriteStats now validates every view before storing any, so a rejected call leaves
nothing applied
- !31 XllnStatsResolveColumnId resolved a system-scope column onto an unrelated title cell, since
the two share their low id bits
- !31 Two Stats window defects: the selected row is restored by stat identity across a repaint that
a write from the Title thread triggers mid-edit, and the previous brush is restored before
DeleteObject, which refuses a brush selected into the DC
- !30 An empty SPA string table entry is legal, but MultiByteToWideChar reports a zero byte count as
failure, which abandoned the whole SPA file and took the stats schema with it
- !30 The XSRC offset and length were used unchecked and the XVC2 guard compared a signed pointer
difference as an unsigned length, so a stale or hand-edited resource faulted inside the parse at
startup. The property bitmap skip could also wrap a 32 bit size to zero and walk arbitrary bytes
- !30 XUserCreateAchievementEnumerator resolved an explicit XUID against the remote username map
alone, where a signed-in user never appears, so an instance could not enumerate its own player
Fixes: FlatOut Ultimate Carnage, Battlestations Pacific.
Addressing and Lifecycle
- !37 XNetDnsLookup dereferenced *xndns without allocating it, faulting for a Title that passes a
zeroed out-parameter. It also strided the address array as IN_ADDR[8] per entry, and returned
WSAGetLastError() even on success instead of reporting the outcome in iStatus
- !30 XNetUnregisterKey entered the QoS listener lock where it meant to release it, holding it for
the life of the process whenever a key was not registered
- !35 XUserCheckPrivilege rejected XUSER_INDEX_ANY as an out of range user index
Fixes: Operation Flashpoint: Red River.
Build, Tooling and CI
- The XLLN-Module loader entry point code-cave now works on .NET executables (4ea82d8). A mixed-mode
managed Title is entered through mscoree.dll's _CorExeMain, which the previous cave missed
- Logging noise: GetLocalChatData warned whenever a Title passed a voice buffer larger than the most
packets that can be produced, which is allowed and already handled. A Title polling voice chat
per frame filled nine tenths of the log with it (!36)
XLLN-Modules
- Quick-Patch Crash Time 4 - run multiple instances concurrently, and let the launcher start a
Title while another Title runs. CoversCrashTime4Hi.exeandCrashTime4Low.exe
- Quick-Patch DiRT 2 - run multiple instances concurrently. Covers the Shipped and Patch 1
versions ofdirt2_game.exe
- Quick-Patch DiRT 3 - run multiple instances concurrently
- Quick-Patch Kane & Lynch: Dead Men - run multiple instances concurrently. As well as the
mutex, the Title creates its six render hand-off events with a plain name, so every process in
the session shared one event per name. An auto reset event releases a single waiter, so one
instance took the wake up owed to another and both stopped
XLLN-Hub v1.4.2.1
- Hub !5 Packet forwarding was gated on the Title's version rather than the XLLN version, so the
hub refused to forward for Titles it should have served