From 11083b94b53a8f8148e46e4059254895b999ad27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20Bernon?= Date: Thu, 16 Jan 2025 00:20:25 +0100 Subject: [PATCH] lsteamclient: Use the PE side request to cache GetServerDetails results. --- lsteamclient/gen_wrapper.py | 2 +- lsteamclient/steam_matchmaking_manual.c | 30 +++++++++++++++++++ .../unix_steam_matchmaking_manual.cpp | 4 ++- lsteamclient/unixlib.h | 1 + lsteamclient/winISteamMatchmakingServers.c | 13 -------- 5 files changed, 35 insertions(+), 15 deletions(-) diff --git a/lsteamclient/gen_wrapper.py b/lsteamclient/gen_wrapper.py index df75aecb..3d9f2a38 100755 --- a/lsteamclient/gen_wrapper.py +++ b/lsteamclient/gen_wrapper.py @@ -239,7 +239,7 @@ MANUAL_METHODS = { "ISteamMatchmakingServers_CancelQuery": lambda ver, abi: abi == 'u' and ver >= 2, "ISteamMatchmakingServers_GetServerCount": lambda ver, abi: abi == 'u' and ver >= 2, - "ISteamMatchmakingServers_GetServerDetails": lambda ver, abi: abi == 'u' and ver >= 2, + "ISteamMatchmakingServers_GetServerDetails": lambda ver, abi: ver >= 2, "ISteamMatchmakingServers_IsRefreshing": lambda ver, abi: abi == 'u' and ver >= 2, "ISteamMatchmakingServers_PingServer": lambda ver, abi: abi == 'u', "ISteamMatchmakingServers_PlayerDetails": lambda ver, abi: abi == 'u', diff --git a/lsteamclient/steam_matchmaking_manual.c b/lsteamclient/steam_matchmaking_manual.c index ddf4a920..733be7e4 100644 --- a/lsteamclient/steam_matchmaking_manual.c +++ b/lsteamclient/steam_matchmaking_manual.c @@ -176,5 +176,35 @@ void __thiscall winISteamMatchmakingServers_SteamMatchMakingServers002_ReleaseRe STEAMCLIENT_CALL( ISteamMatchmakingServers_SteamMatchMakingServers002_ReleaseRequest, ¶ms ); + if (request) HeapFree( GetProcessHeap(), 0, request->details ); HeapFree( GetProcessHeap(), 0, request ); } + +gameserveritem_t_105 * __thiscall winISteamMatchmakingServers_SteamMatchMakingServers002_GetServerDetails( struct w_iface *_this, void *hRequest, int32_t iServer ) +{ + struct ISteamMatchmakingServers_SteamMatchMakingServers002_GetServerDetails_params params = + { + .u_iface = _this->u_iface, + .hRequest = hRequest, + .iServer = iServer, + }; + struct w_request *request = hRequest; + + TRACE( "%p\n", _this ); + + if (request && !request->details) + { + struct ISteamMatchmakingServers_SteamMatchMakingServers002_GetServerCount_params count_params = + { + .u_iface = _this->u_iface, + .hRequest = hRequest, + }; + + STEAMCLIENT_CALL( ISteamMatchmakingServers_SteamMatchMakingServers002_GetServerCount, &count_params ); + if (count_params._ret) request->details = HeapAlloc( GetProcessHeap(), 0, count_params._ret * sizeof(*request->details) ); + } + + STEAMCLIENT_CALL( ISteamMatchmakingServers_SteamMatchMakingServers002_GetServerDetails, ¶ms ); + if (request && request->details && params._ret.ptr) return request->details + iServer; + return get_unix_buffer( params._ret ); +} diff --git a/lsteamclient/unix_steam_matchmaking_manual.cpp b/lsteamclient/unix_steam_matchmaking_manual.cpp index 85eb8aa9..21af0db3 100644 --- a/lsteamclient/unix_steam_matchmaking_manual.cpp +++ b/lsteamclient/unix_steam_matchmaking_manual.cpp @@ -347,7 +347,9 @@ template< typename Iface, typename Params > static NTSTATUS ISteamMatchmakingServers_GetServerDetails( Iface *iface, Params *params ) { struct w_request *w_request = (struct w_request *)(void *)params->hRequest; - params->_ret = iface->GetServerDetails( w_request ? (void *)w_request->u_request : nullptr, params->iServer ); + gameserveritem_t_105 *item = iface->GetServerDetails( w_request ? (void *)w_request->u_request : nullptr, params->iServer ); + if (w_request && w_request->details) w_request->details[params->iServer] = *item; + params->_ret = item; return 0; } diff --git a/lsteamclient/unixlib.h b/lsteamclient/unixlib.h index 06d00c22..6e67f8ef 100644 --- a/lsteamclient/unixlib.h +++ b/lsteamclient/unixlib.h @@ -229,6 +229,7 @@ struct w_request { struct u_request u_request; struct u_response u_response; + gameserveritem_t_105 *details; }; #include diff --git a/lsteamclient/winISteamMatchmakingServers.c b/lsteamclient/winISteamMatchmakingServers.c index e8dc9595..ace3e189 100644 --- a/lsteamclient/winISteamMatchmakingServers.c +++ b/lsteamclient/winISteamMatchmakingServers.c @@ -278,19 +278,6 @@ DEFINE_THISCALL_WRAPPER(winISteamMatchmakingServers_SteamMatchMakingServers002_P DEFINE_THISCALL_WRAPPER(winISteamMatchmakingServers_SteamMatchMakingServers002_ServerRules, 16) DEFINE_THISCALL_WRAPPER(winISteamMatchmakingServers_SteamMatchMakingServers002_CancelServerQuery, 8) -gameserveritem_t_105 * __thiscall winISteamMatchmakingServers_SteamMatchMakingServers002_GetServerDetails(struct w_iface *_this, void *hRequest, int32_t iServer) -{ - struct ISteamMatchmakingServers_SteamMatchMakingServers002_GetServerDetails_params params = - { - .u_iface = _this->u_iface, - .hRequest = hRequest, - .iServer = iServer, - }; - TRACE("%p\n", _this); - STEAMCLIENT_CALL( ISteamMatchmakingServers_SteamMatchMakingServers002_GetServerDetails, ¶ms ); - return get_unix_buffer( params._ret ); -} - void __thiscall winISteamMatchmakingServers_SteamMatchMakingServers002_CancelQuery(struct w_iface *_this, void *hRequest) { struct ISteamMatchmakingServers_SteamMatchMakingServers002_CancelQuery_params params =