/* Copyright (C) 2019 Mr Goldberg This file is part of the Goldberg Emulator The Goldberg Emulator is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. The Goldberg Emulator is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with the Goldberg Emulator; if not, see . */ #include "dll/steam_client.h" // retrieves the ISteamAppDisableUpdate interface associated with the handle ISteamAppDisableUpdate *Steam_Client::GetISteamAppDisableUpdate( HSteamUser hSteamUser, HSteamPipe hSteamPipe, const char *pchVersion ) { PRINT_DEBUG("%s", pchVersion); if (!steam_pipes.count(hSteamPipe) || !hSteamUser) return nullptr; if (strcmp(pchVersion, STEAMAPPDISABLEUPDATE_INTERFACE_VERSION) == 0) { return reinterpret_cast(static_cast(steam_app_disable_update)); } report_missing_impl_and_exit(pchVersion, EMU_FUNC_NAME); } // retrieves the ISteamTimeline interface associated with the handle ISteamTimeline *Steam_Client::GetISteamTimeline( HSteamUser hSteamUser, HSteamPipe hSteamPipe, const char *pchVersion ) { PRINT_DEBUG("%s", pchVersion); if (!steam_pipes.count(hSteamPipe) || !hSteamUser) return nullptr; if (strcmp(pchVersion, STEAMTIMELINE_INTERFACE_VERSION) == 0) { return reinterpret_cast(static_cast(steam_timeline)); } report_missing_impl_and_exit(pchVersion, EMU_FUNC_NAME); } // retrieves the ISteamGameStats interface associated with the handle ISteamGameStats *Steam_Client::GetISteamGameStats( HSteamUser hSteamUser, HSteamPipe hSteamPipe, const char *pchVersion ) { PRINT_DEBUG("%s", pchVersion); if (!steam_pipes.count(hSteamPipe) || !hSteamUser) return nullptr; Steam_GameStats *steam_gamestats_tmp{}; if (steam_pipes[hSteamPipe] == Steam_Pipe::SERVER) { steam_gamestats_tmp = steam_gameserver_gamestats; } else { steam_gamestats_tmp = steam_gamestats; } if (strcmp(pchVersion, STEAMGAMESTATS_INTERFACE_VERSION) == 0) { return reinterpret_cast(static_cast(steam_gamestats_tmp)); } report_missing_impl_and_exit(pchVersion, EMU_FUNC_NAME); } // retrieves the ISteamUser interface associated with the handle ISteamUser *Steam_Client::GetISteamUser( HSteamUser hSteamUser, HSteamPipe hSteamPipe, const char *pchVersion ) { PRINT_DEBUG("%s", pchVersion); if (!steam_pipes.count(hSteamPipe) || !hSteamUser) return NULL; if (strcmp(pchVersion, "SteamUser009") == 0) { return reinterpret_cast(static_cast(steam_user)); } else if (strcmp(pchVersion, "SteamUser010") == 0) { return reinterpret_cast(static_cast(steam_user)); } else if (strcmp(pchVersion, "SteamUser011") == 0) { return reinterpret_cast(static_cast(steam_user)); } else if (strcmp(pchVersion, "SteamUser012") == 0) { return reinterpret_cast(static_cast(steam_user)); } else if (strcmp(pchVersion, "SteamUser013") == 0) { return reinterpret_cast(static_cast(steam_user)); } else if (strcmp(pchVersion, "SteamUser014") == 0) { return reinterpret_cast(static_cast(steam_user)); } else if (strcmp(pchVersion, "SteamUser015") == 0) { return reinterpret_cast(static_cast(steam_user)); // SteamUser015 Not found in public Archive, must be between 1.12-1.13 } else if (strcmp(pchVersion, "SteamUser016") == 0) { return reinterpret_cast(static_cast(steam_user)); } else if (strcmp(pchVersion, "SteamUser017") == 0) { return reinterpret_cast(static_cast(steam_user)); } else if (strcmp(pchVersion, "SteamUser018") == 0) { return reinterpret_cast(static_cast(steam_user)); } else if (strcmp(pchVersion, "SteamUser019") == 0) { return reinterpret_cast(static_cast(steam_user)); } else if (strcmp(pchVersion, "SteamUser020") == 0) { return reinterpret_cast(static_cast(steam_user)); } else if (strcmp(pchVersion, "SteamUser021") == 0) { return reinterpret_cast(static_cast(steam_user)); } else if (strcmp(pchVersion, "SteamUser022") == 0) { return reinterpret_cast(static_cast(steam_user)); } else if (strcmp(pchVersion, STEAMUSER_INTERFACE_VERSION) == 0) { return reinterpret_cast(static_cast(steam_user)); } report_missing_impl_and_exit(pchVersion, EMU_FUNC_NAME); } // retrieves the ISteamGameServer interface associated with the handle ISteamGameServer *Steam_Client::GetISteamGameServer( HSteamUser hSteamUser, HSteamPipe hSteamPipe, const char *pchVersion ) { PRINT_DEBUG("%s", pchVersion); if (!steam_pipes.count(hSteamPipe) || !hSteamUser) return NULL; if (strcmp(pchVersion, "SteamGameServer004") == 0) { return reinterpret_cast(static_cast(steam_gameserver)); } else if (strcmp(pchVersion, "SteamGameServer005") == 0) { return reinterpret_cast(static_cast(steam_gameserver)); } else if (strcmp(pchVersion, "SteamGameServer006") == 0) { return reinterpret_cast(static_cast(steam_gameserver)); // SteamGameServer006 Not exists } else if (strcmp(pchVersion, "SteamGameServer007") == 0) { return reinterpret_cast(static_cast(steam_gameserver)); // SteamGameServer007 Not exists } else if (strcmp(pchVersion, "SteamGameServer008") == 0) { return reinterpret_cast(static_cast(steam_gameserver)); } else if (strcmp(pchVersion, "SteamGameServer009") == 0) { return reinterpret_cast(static_cast(steam_gameserver)); } else if (strcmp(pchVersion, "SteamGameServer010") == 0) { return reinterpret_cast(static_cast(steam_gameserver)); } else if (strcmp(pchVersion, "SteamGameServer011") == 0) { return reinterpret_cast(static_cast(steam_gameserver)); } else if (strcmp(pchVersion, "SteamGameServer012") == 0) { return reinterpret_cast(static_cast(steam_gameserver)); } else if (strcmp(pchVersion, "SteamGameServer013") == 0) { gameserver_has_ipv6_functions = true; return reinterpret_cast(static_cast(steam_gameserver)); } else if (strcmp(pchVersion, "SteamGameServer014") == 0) { gameserver_has_ipv6_functions = true; return reinterpret_cast(static_cast(steam_gameserver)); } else if (strcmp(pchVersion, STEAMGAMESERVER_INTERFACE_VERSION) == 0) { gameserver_has_ipv6_functions = true; return reinterpret_cast(static_cast(steam_gameserver)); } report_missing_impl_and_exit(pchVersion, EMU_FUNC_NAME); } // returns the ISteamFriends interface ISteamFriends *Steam_Client::GetISteamFriends( HSteamUser hSteamUser, HSteamPipe hSteamPipe, const char *pchVersion ) { PRINT_DEBUG("%s", pchVersion); if (!steam_pipes.count(hSteamPipe) || !hSteamUser) return NULL; if (strcmp(pchVersion, "SteamFriends003") == 0) { return reinterpret_cast(static_cast(steam_friends)); } else if (strcmp(pchVersion, "SteamFriends004") == 0) { return reinterpret_cast(static_cast(steam_friends)); } else if (strcmp(pchVersion, "SteamFriends005") == 0) { return reinterpret_cast(static_cast(steam_friends)); } else if (strcmp(pchVersion, "SteamFriends006") == 0) { return reinterpret_cast(static_cast(steam_friends)); } else if (strcmp(pchVersion, "SteamFriends007") == 0) { return reinterpret_cast(static_cast(steam_friends)); } else if (strcmp(pchVersion, "SteamFriends008") == 0) { return reinterpret_cast(static_cast(steam_friends)); } else if (strcmp(pchVersion, "SteamFriends009") == 0) { return reinterpret_cast(static_cast(steam_friends)); } else if (strcmp(pchVersion, "SteamFriends010") == 0) { return reinterpret_cast(static_cast(steam_friends)); // SteamFriends010 Not found in public Archive, must be between 1.16-1.17 } else if (strcmp(pchVersion, "SteamFriends011") == 0) { return reinterpret_cast(static_cast(steam_friends)); } else if (strcmp(pchVersion, "SteamFriends012") == 0) { return reinterpret_cast(static_cast(steam_friends)); // SteamFriends012 Not found in public Archive, must be between 1.19-1.20 } else if (strcmp(pchVersion, "SteamFriends013") == 0) { return reinterpret_cast(static_cast(steam_friends)); } else if (strcmp(pchVersion, "SteamFriends014") == 0) { return reinterpret_cast(static_cast(steam_friends)); } else if (strcmp(pchVersion, "SteamFriends015") == 0) { return reinterpret_cast(static_cast(steam_friends)); } else if (strcmp(pchVersion, "SteamFriends016") == 0) { return reinterpret_cast(static_cast(steam_friends)); // SteamFriends016 Not found in public Archive, must be between 1.42-1.43 } else if (strcmp(pchVersion, STEAMFRIENDS_INTERFACE_VERSION) == 0) { return reinterpret_cast(static_cast(steam_friends)); } report_missing_impl_and_exit(pchVersion, EMU_FUNC_NAME); } // returns the ISteamUtils interface ISteamUtils *Steam_Client::GetISteamUtils( HSteamPipe hSteamPipe, const char *pchVersion ) { PRINT_DEBUG("%s", pchVersion); if (!steam_pipes.count(hSteamPipe)) return NULL; Steam_Utils *steam_utils_temp{}; if (steam_pipes[hSteamPipe] == Steam_Pipe::SERVER) { steam_utils_temp = steam_gameserver_utils; } else { steam_utils_temp = steam_utils; } if (strcmp(pchVersion, "SteamUtils002") == 0) { return reinterpret_cast(static_cast(steam_utils_temp)); } else if (strcmp(pchVersion, "SteamUtils003") == 0) { return reinterpret_cast(static_cast(steam_utils_temp)); // ISteamUtils003 Not found in public Archive, must be between 1.02-1.03 } else if (strcmp(pchVersion, "SteamUtils004") == 0) { return reinterpret_cast(static_cast(steam_utils_temp)); } else if (strcmp(pchVersion, "SteamUtils005") == 0) { return reinterpret_cast(static_cast(steam_utils_temp)); } else if (strcmp(pchVersion, "SteamUtils006") == 0) { return reinterpret_cast(static_cast(steam_utils_temp)); } else if (strcmp(pchVersion, "SteamUtils007") == 0) { return reinterpret_cast(static_cast(steam_utils_temp)); } else if (strcmp(pchVersion, "SteamUtils008") == 0) { return reinterpret_cast(static_cast(steam_utils_temp)); } else if (strcmp(pchVersion, "SteamUtils009") == 0) { return reinterpret_cast(static_cast(steam_utils_temp)); } else if (strcmp(pchVersion, STEAMUTILS_INTERFACE_VERSION) == 0) { return reinterpret_cast(static_cast(steam_utils_temp)); } report_missing_impl_and_exit(pchVersion, EMU_FUNC_NAME); } // returns the ISteamMatchmaking interface ISteamMatchmaking *Steam_Client::GetISteamMatchmaking( HSteamUser hSteamUser, HSteamPipe hSteamPipe, const char *pchVersion ) { PRINT_DEBUG("%s", pchVersion); if (!steam_pipes.count(hSteamPipe) || !hSteamUser) return NULL; if (strcmp(pchVersion, "SteamMatchMaking001") == 0) { // SteamMatchMaking001 Not found in public Archive, must be before 1.00 //TODO return reinterpret_cast(static_cast(steam_matchmaking)); } else if (strcmp(pchVersion, "SteamMatchMaking002") == 0) { return reinterpret_cast(static_cast(steam_matchmaking)); } else if (strcmp(pchVersion, "SteamMatchMaking003") == 0) { return reinterpret_cast(static_cast(steam_matchmaking)); // SteamMatchMaking003 Not found in public Archive, must be between 1.01-1.02 } else if (strcmp(pchVersion, "SteamMatchMaking004") == 0) { return reinterpret_cast(static_cast(steam_matchmaking)); } else if (strcmp(pchVersion, "SteamMatchMaking005") == 0) { return reinterpret_cast(static_cast(steam_matchmaking)); // SteamMatchMaking005 Not found in public Archive, must be between 1.02-1.03 } else if (strcmp(pchVersion, "SteamMatchMaking006") == 0) { return reinterpret_cast(static_cast(steam_matchmaking)); } else if (strcmp(pchVersion, "SteamMatchMaking007") == 0) { return reinterpret_cast(static_cast(steam_matchmaking)); } else if (strcmp(pchVersion, "SteamMatchMaking008") == 0) { return reinterpret_cast(static_cast(steam_matchmaking)); } else if (strcmp(pchVersion, STEAMMATCHMAKING_INTERFACE_VERSION) == 0) { return reinterpret_cast(static_cast(steam_matchmaking)); } report_missing_impl_and_exit(pchVersion, EMU_FUNC_NAME); } // returns the ISteamMatchmakingServers interface ISteamMatchmakingServers *Steam_Client::GetISteamMatchmakingServers( HSteamUser hSteamUser, HSteamPipe hSteamPipe, const char *pchVersion ) { PRINT_DEBUG("%s", pchVersion); if (!steam_pipes.count(hSteamPipe) || !hSteamUser) return NULL; if (strcmp(pchVersion, "SteamMatchMakingServers001") == 0) { return reinterpret_cast(static_cast(steam_matchmaking_servers)); } else if (strcmp(pchVersion, STEAMMATCHMAKINGSERVERS_INTERFACE_VERSION) == 0) { return reinterpret_cast(static_cast(steam_matchmaking_servers)); } report_missing_impl_and_exit(pchVersion, EMU_FUNC_NAME); } // returns the a generic interface void *Steam_Client::GetISteamGenericInterface( HSteamUser hSteamUser, HSteamPipe hSteamPipe, const char *pchVersion ) { PRINT_DEBUG("'%s' %i %i", pchVersion, hSteamUser, hSteamPipe); if (!steam_pipes.count(hSteamPipe)) return NULL; bool server = false; if (steam_pipes[hSteamPipe] == Steam_Pipe::SERVER) { // PRINT_DEBUG("requesting interface with server pipe"); server = true; } else { // PRINT_DEBUG("requesting interface with client pipe"); // if this is a user pipe, and version != "SteamNetworkingUtils", and version != "SteamUtils" if ((strstr(pchVersion, "SteamNetworkingUtils") != pchVersion) && (strstr(pchVersion, "SteamUtils") != pchVersion)) { if (!hSteamUser) return NULL; } } // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! // NOTE: you must try to read the one with the most characters first // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! if (strstr(pchVersion, "SteamNetworkingSocketsSerialized") == pchVersion) { Steam_Networking_Sockets_Serialized *steam_networking_sockets_serialized_temp{}; if (server) { steam_networking_sockets_serialized_temp = steam_gameserver_networking_sockets_serialized; } else { steam_networking_sockets_serialized_temp = steam_networking_sockets_serialized; } if (strcmp(pchVersion, "SteamNetworkingSocketsSerialized002") == 0) { return reinterpret_cast(static_cast(steam_networking_sockets_serialized_temp)); } else if (strcmp(pchVersion, "SteamNetworkingSocketsSerialized003") == 0) { return reinterpret_cast(static_cast(steam_networking_sockets_serialized_temp)); } else if (strcmp(pchVersion, "SteamNetworkingSocketsSerialized004") == 0) { return reinterpret_cast(static_cast(steam_networking_sockets_serialized_temp)); } else if (strcmp(pchVersion, "SteamNetworkingSocketsSerialized005") == 0) { return reinterpret_cast(static_cast(steam_networking_sockets_serialized_temp)); } } else if (strstr(pchVersion, "SteamNetworkingSockets") == pchVersion) { Steam_Networking_Sockets *steam_networking_sockets_temp{}; if (server) { steam_networking_sockets_temp = steam_gameserver_networking_sockets; } else { steam_networking_sockets_temp = steam_networking_sockets; } if (strcmp(pchVersion, "SteamNetworkingSockets001") == 0) { return reinterpret_cast(static_cast( steam_networking_sockets_temp)); // SteamNetworkingSockets001 Not found in public Archive, must be before 1.44 } else if (strcmp(pchVersion, "SteamNetworkingSockets002") == 0) { return reinterpret_cast(static_cast( steam_networking_sockets_temp)); } else if (strcmp(pchVersion, "SteamNetworkingSockets003") == 0) { return reinterpret_cast(static_cast( steam_networking_sockets_temp)); } else if (strcmp(pchVersion, "SteamNetworkingSockets004") == 0) { return reinterpret_cast(static_cast( steam_networking_sockets_temp)); } else if (strcmp(pchVersion, "SteamNetworkingSockets006") == 0) { return reinterpret_cast(static_cast( steam_networking_sockets_temp)); } else if (strcmp(pchVersion, "SteamNetworkingSockets007") == 0) { // Not found in public Archive, real steamclient64.dll returns null return nullptr; } else if (strcmp(pchVersion, "SteamNetworkingSockets008") == 0) { return reinterpret_cast(static_cast( steam_networking_sockets_temp)); } else if (strcmp(pchVersion, "SteamNetworkingSockets009") == 0) { return reinterpret_cast(static_cast( steam_networking_sockets_temp)); } else if (strcmp(pchVersion, "SteamNetworkingSockets010") == 0) { // Not found in public Archive, based on reversing return reinterpret_cast(static_cast( steam_networking_sockets_temp)); } else if (strcmp(pchVersion, "SteamNetworkingSockets011") == 0) { // Not found in public Archive, based on reversing, requested by appid 1492070 return reinterpret_cast(static_cast( steam_networking_sockets_temp)); } else if (strcmp(pchVersion, STEAMNETWORKINGSOCKETS_INTERFACE_VERSION) == 0) { return reinterpret_cast(static_cast( steam_networking_sockets_temp)); } } else if (strstr(pchVersion, "SteamNetworkingMessages") == pchVersion) { Steam_Networking_Messages *steam_networking_messages_temp{}; if (server) { steam_networking_messages_temp = steam_gameserver_networking_messages; } else { steam_networking_messages_temp = steam_networking_messages; } if (strcmp(pchVersion, STEAMNETWORKINGMESSAGES_INTERFACE_VERSION) == 0) { return reinterpret_cast(static_cast(steam_networking_messages_temp)); } } else if (strstr(pchVersion, "SteamNetworkingUtils") == pchVersion) { if (strcmp(pchVersion, "SteamNetworkingUtils001") == 0) { return reinterpret_cast(static_cast(steam_networking_utils)); } else if (strcmp(pchVersion, "SteamNetworkingUtils002") == 0) { return reinterpret_cast(static_cast(steam_networking_utils)); } else if (strcmp(pchVersion, "SteamNetworkingUtils003") == 0) { return reinterpret_cast(static_cast(steam_networking_utils)); } else if (strcmp(pchVersion, STEAMNETWORKINGUTILS_INTERFACE_VERSION) == 0) { return reinterpret_cast(static_cast(steam_networking_utils)); } } else if (strstr(pchVersion, "SteamNetworking") == pchVersion) { return GetISteamNetworking(hSteamUser, hSteamPipe, pchVersion); } else if (strstr(pchVersion, "SteamGameCoordinator") == pchVersion) { Steam_Game_Coordinator *steam_game_coordinator_temp{}; if (server) { steam_game_coordinator_temp = steam_gameserver_game_coordinator; } else { steam_game_coordinator_temp = steam_game_coordinator; } if (strcmp(pchVersion, STEAMGAMECOORDINATOR_INTERFACE_VERSION) == 0) { return reinterpret_cast(static_cast(steam_game_coordinator_temp)); } } else if (strstr(pchVersion, "STEAMTV_INTERFACE_V") == pchVersion) { if (strcmp(pchVersion, STEAMTV_INTERFACE_VERSION) == 0) { return reinterpret_cast(static_cast(steam_tv)); } } else if (strstr(pchVersion, "STEAMREMOTESTORAGE_INTERFACE_VERSION") == pchVersion) { return GetISteamRemoteStorage(hSteamUser, hSteamPipe, pchVersion); } else if (strstr(pchVersion, "SteamGameServerStats") == pchVersion) { return GetISteamGameServerStats(hSteamUser, hSteamPipe, pchVersion); } else if (strstr(pchVersion, "SteamGameServer") == pchVersion) { return GetISteamGameServer(hSteamUser, hSteamPipe, pchVersion); } else if (strstr(pchVersion, "SteamGameStats") == pchVersion) { return GetISteamGameStats(hSteamUser, hSteamPipe, pchVersion); } else if (strstr(pchVersion, "SteamMatchMakingServers") == pchVersion) { return GetISteamMatchmakingServers(hSteamUser, hSteamPipe, pchVersion); } else if (strstr(pchVersion, "SteamMatchMaking") == pchVersion) { return GetISteamMatchmaking(hSteamUser, hSteamPipe, pchVersion); } else if (strstr(pchVersion, "SteamFriends") == pchVersion) { return GetISteamFriends(hSteamUser, hSteamPipe, pchVersion); } else if (strstr(pchVersion, "SteamController") == pchVersion || strstr(pchVersion, "STEAMCONTROLLER_INTERFACE_VERSION") == pchVersion) { return GetISteamController(hSteamUser, hSteamPipe, pchVersion); } else if (strstr(pchVersion, "STEAMUGC_INTERFACE_VERSION") == pchVersion) { return GetISteamUGC(hSteamUser, hSteamPipe, pchVersion); } else if (strstr(pchVersion, "STEAMINVENTORY_INTERFACE") == pchVersion) { return GetISteamInventory(hSteamUser, hSteamPipe, pchVersion); } else if (strstr(pchVersion, "STEAMUSERSTATS_INTERFACE_VERSION") == pchVersion) { return GetISteamUserStats(hSteamUser, hSteamPipe, pchVersion); } else if (strstr(pchVersion, "SteamUser") == pchVersion) { return GetISteamUser(hSteamUser, hSteamPipe, pchVersion); } else if (strstr(pchVersion, "SteamUtils") == pchVersion) { return GetISteamUtils(hSteamPipe, pchVersion); } else if (strstr(pchVersion, "STEAMAPPS_INTERFACE_VERSION") == pchVersion) { return GetISteamApps(hSteamUser, hSteamPipe, pchVersion); } else if (strstr(pchVersion, "STEAMSCREENSHOTS_INTERFACE_VERSION") == pchVersion) { return GetISteamScreenshots(hSteamUser, hSteamPipe, pchVersion); } else if (strstr(pchVersion, "STEAMHTTP_INTERFACE_VERSION") == pchVersion) { return GetISteamHTTP(hSteamUser, hSteamPipe, pchVersion); } else if (strstr(pchVersion, "STEAMUNIFIEDMESSAGES_INTERFACE_VERSION") == pchVersion) { return DEPRECATED_GetISteamUnifiedMessages(hSteamUser, hSteamPipe, pchVersion); } else if (strstr(pchVersion, "STEAMAPPLIST_INTERFACE_VERSION") == pchVersion) { return GetISteamAppList(hSteamUser, hSteamPipe, pchVersion); } else if (strstr(pchVersion, "STEAMMUSIC_INTERFACE_VERSION") == pchVersion) { return GetISteamMusic(hSteamUser, hSteamPipe, pchVersion); } else if (strstr(pchVersion, "STEAMMUSICREMOTE_INTERFACE_VERSION") == pchVersion) { return GetISteamMusicRemote(hSteamUser, hSteamPipe, pchVersion); } else if (strstr(pchVersion, "STEAMHTMLSURFACE_INTERFACE_VERSION") == pchVersion) { return GetISteamHTMLSurface(hSteamUser, hSteamPipe, pchVersion); } else if (strstr(pchVersion, "STEAMVIDEO_INTERFACE") == pchVersion) { return GetISteamVideo(hSteamUser, hSteamPipe, pchVersion); } else if (strstr(pchVersion, "SteamMasterServerUpdater") == pchVersion) { return GetISteamMasterServerUpdater(hSteamUser, hSteamPipe, pchVersion); } else if (strstr(pchVersion, "SteamMatchGameSearch") == pchVersion) { return GetISteamGameSearch(hSteamUser, hSteamPipe, pchVersion); } else if (strstr(pchVersion, "SteamParties") == pchVersion) { return GetISteamParties(hSteamUser, hSteamPipe, pchVersion); } else if (strstr(pchVersion, "SteamInput") == pchVersion) { return GetISteamInput(hSteamUser, hSteamPipe, pchVersion); } else if (strstr(pchVersion, "STEAMREMOTEPLAY_INTERFACE_VERSION") == pchVersion) { return GetISteamRemotePlay(hSteamUser, hSteamPipe, pchVersion); } else if (strstr(pchVersion, "STEAMPARENTALSETTINGS_INTERFACE_VERSION") == pchVersion) { return GetISteamParentalSettings(hSteamUser, hSteamPipe, pchVersion); } else if (strstr(pchVersion, "STEAMAPPTICKET_INTERFACE_VERSION") == pchVersion) { return GetAppTicket(hSteamUser, hSteamPipe, pchVersion); } else if (strstr(pchVersion, "STEAMTIMELINE_INTERFACE") == pchVersion) { return GetISteamTimeline(hSteamUser, hSteamPipe, pchVersion); } else if (strstr(pchVersion, "SteamAppDisableUpdate") == pchVersion) { return GetISteamAppDisableUpdate(hSteamUser, hSteamPipe, pchVersion); } PRINT_DEBUG("No interface: %s", pchVersion); report_missing_impl_and_exit(pchVersion, EMU_FUNC_NAME); } // returns the ISteamUserStats interface ISteamUserStats *Steam_Client::GetISteamUserStats( HSteamUser hSteamUser, HSteamPipe hSteamPipe, const char *pchVersion ) { PRINT_DEBUG("%s", pchVersion); if (!steam_pipes.count(hSteamPipe) || !hSteamUser) return NULL; // v001, v002 Not found in public Archive, must be before 1.00 if (strcmp(pchVersion, "STEAMUSERSTATS_INTERFACE_VERSION003") == 0) { return reinterpret_cast(static_cast(steam_user_stats)); } else if (strcmp(pchVersion, "STEAMUSERSTATS_INTERFACE_VERSION004") == 0) { return reinterpret_cast(static_cast(steam_user_stats)); } else if (strcmp(pchVersion, "STEAMUSERSTATS_INTERFACE_VERSION005") == 0) { return reinterpret_cast(static_cast(steam_user_stats)); } else if (strcmp(pchVersion, "STEAMUSERSTATS_INTERFACE_VERSION006") == 0) { return reinterpret_cast(static_cast(steam_user_stats)); } else if (strcmp(pchVersion, "STEAMUSERSTATS_INTERFACE_VERSION007") == 0) { return reinterpret_cast(static_cast(steam_user_stats)); } else if (strcmp(pchVersion, "STEAMUSERSTATS_INTERFACE_VERSION008") == 0) { return reinterpret_cast(static_cast(steam_user_stats)); // Not found in public Archive, must be between 1.11-1.12 } else if (strcmp(pchVersion, "STEAMUSERSTATS_INTERFACE_VERSION009") == 0) { return reinterpret_cast(static_cast(steam_user_stats)); } else if (strcmp(pchVersion, "STEAMUSERSTATS_INTERFACE_VERSION010") == 0) { return reinterpret_cast(static_cast(steam_user_stats)); } else if (strcmp(pchVersion, "STEAMUSERSTATS_INTERFACE_VERSION011") == 0) { return reinterpret_cast(static_cast(steam_user_stats)); } else if (strcmp(pchVersion, STEAMUSERSTATS_INTERFACE_VERSION) == 0) { return reinterpret_cast(static_cast(steam_user_stats)); } report_missing_impl_and_exit(pchVersion, EMU_FUNC_NAME); } // returns the ISteamGameServerStats interface ISteamGameServerStats *Steam_Client::GetISteamGameServerStats( HSteamUser hSteamuser, HSteamPipe hSteamPipe, const char *pchVersion ) { PRINT_DEBUG("%s", pchVersion); if (!steam_pipes.count(hSteamPipe) || !hSteamuser) return NULL; if (strcmp(pchVersion, STEAMGAMESERVERSTATS_INTERFACE_VERSION) == 0) { return reinterpret_cast(static_cast(steam_gameserverstats)); } report_missing_impl_and_exit(pchVersion, EMU_FUNC_NAME); } // returns apps interface ISteamApps *Steam_Client::GetISteamApps( HSteamUser hSteamUser, HSteamPipe hSteamPipe, const char *pchVersion ) { PRINT_DEBUG("%s", pchVersion); if (!steam_pipes.count(hSteamPipe) || !hSteamUser) return NULL; Steam_Apps *steam_apps_temp{}; if (steam_pipes[hSteamPipe] == Steam_Pipe::SERVER) { steam_apps_temp = steam_gameserver_apps; } else { steam_apps_temp = steam_apps; } if (strcmp(pchVersion, "STEAMAPPS_INTERFACE_VERSION001") == 0) { return reinterpret_cast(static_cast(steam_apps_temp)); } else if (strcmp(pchVersion, "STEAMAPPS_INTERFACE_VERSION002") == 0) { return reinterpret_cast(static_cast(steam_apps_temp)); } else if (strcmp(pchVersion, "STEAMAPPS_INTERFACE_VERSION003") == 0) { return reinterpret_cast(static_cast(steam_apps_temp)); } else if (strcmp(pchVersion, "STEAMAPPS_INTERFACE_VERSION004") == 0) { return reinterpret_cast(static_cast(steam_apps_temp)); } else if (strcmp(pchVersion, "STEAMAPPS_INTERFACE_VERSION005") == 0) { return reinterpret_cast(static_cast(steam_apps_temp)); } else if (strcmp(pchVersion, "STEAMAPPS_INTERFACE_VERSION006") == 0) { return reinterpret_cast(static_cast(steam_apps_temp)); } else if (strcmp(pchVersion, "STEAMAPPS_INTERFACE_VERSION007") == 0) { return reinterpret_cast(static_cast(steam_apps_temp)); } else if (strcmp(pchVersion, STEAMAPPS_INTERFACE_VERSION) == 0) { return reinterpret_cast(static_cast(steam_apps_temp)); } report_missing_impl_and_exit(pchVersion, EMU_FUNC_NAME); } // networking ISteamNetworking *Steam_Client::GetISteamNetworking( HSteamUser hSteamUser, HSteamPipe hSteamPipe, const char *pchVersion ) { PRINT_DEBUG("%s", pchVersion); if (!steam_pipes.count(hSteamPipe) || !hSteamUser) return NULL; Steam_Networking *steam_networking_temp{}; if (steam_pipes[hSteamPipe] == Steam_Pipe::SERVER) { steam_networking_temp = steam_gameserver_networking; } else { steam_networking_temp = steam_networking; } if (strcmp(pchVersion, "SteamNetworking001") == 0) { return reinterpret_cast(static_cast(steam_networking_temp)); } else if (strcmp(pchVersion, "SteamNetworking002") == 0) { return reinterpret_cast(static_cast(steam_networking_temp)); } else if (strcmp(pchVersion, "SteamNetworking003") == 0) { return reinterpret_cast(static_cast(steam_networking_temp)); } else if (strcmp(pchVersion, "SteamNetworking004") == 0) { return reinterpret_cast(static_cast(steam_networking_temp)); } else if (strcmp(pchVersion, "SteamNetworking005") == 0) { return reinterpret_cast(static_cast(steam_networking_temp)); } else if (strcmp(pchVersion, STEAMNETWORKING_INTERFACE_VERSION) == 0) { return reinterpret_cast(static_cast(steam_networking_temp)); } report_missing_impl_and_exit(pchVersion, EMU_FUNC_NAME); } // remote storage ISteamRemoteStorage *Steam_Client::GetISteamRemoteStorage( HSteamUser hSteamuser, HSteamPipe hSteamPipe, const char *pchVersion ) { PRINT_DEBUG("%s", pchVersion); if (!steam_pipes.count(hSteamPipe) || !hSteamuser) return NULL; if (strcmp(pchVersion, "STEAMREMOTESTORAGE_INTERFACE_VERSION001") == 0) { return reinterpret_cast(static_cast(steam_remote_storage)); //Not found in public Archive, must be before 1.00 } else if (strcmp(pchVersion, "STEAMREMOTESTORAGE_INTERFACE_VERSION002") == 0) { return reinterpret_cast(static_cast(steam_remote_storage)); } else if (strcmp(pchVersion, "STEAMREMOTESTORAGE_INTERFACE_VERSION003") == 0) { return reinterpret_cast(static_cast(steam_remote_storage)); //Not found in public Archive, must be between 1.11-1.12 } else if (strcmp(pchVersion, "STEAMREMOTESTORAGE_INTERFACE_VERSION004") == 0) { return reinterpret_cast(static_cast(steam_remote_storage)); } else if (strcmp(pchVersion, "STEAMREMOTESTORAGE_INTERFACE_VERSION005") == 0) { return reinterpret_cast(static_cast(steam_remote_storage)); } else if (strcmp(pchVersion, "STEAMREMOTESTORAGE_INTERFACE_VERSION006") == 0) { return reinterpret_cast(static_cast(steam_remote_storage)); } else if (strcmp(pchVersion, "STEAMREMOTESTORAGE_INTERFACE_VERSION007") == 0) { return reinterpret_cast(static_cast(steam_remote_storage)); //Not found in public Archive, must be between 1.19-1.20 } else if (strcmp(pchVersion, "STEAMREMOTESTORAGE_INTERFACE_VERSION008") == 0) { return reinterpret_cast(static_cast(steam_remote_storage)); } else if (strcmp(pchVersion, "STEAMREMOTESTORAGE_INTERFACE_VERSION009") == 0) { return reinterpret_cast(static_cast(steam_remote_storage)); //Not found in public Archive, must be between 1.21-1.22 } else if (strcmp(pchVersion, "STEAMREMOTESTORAGE_INTERFACE_VERSION010") == 0) { return reinterpret_cast(static_cast(steam_remote_storage)); } else if (strcmp(pchVersion, "STEAMREMOTESTORAGE_INTERFACE_VERSION011") == 0) { return reinterpret_cast(static_cast(steam_remote_storage)); } else if (strcmp(pchVersion, "STEAMREMOTESTORAGE_INTERFACE_VERSION012") == 0) { return reinterpret_cast(static_cast(steam_remote_storage)); } else if (strcmp(pchVersion, "STEAMREMOTESTORAGE_INTERFACE_VERSION013") == 0) { return reinterpret_cast(static_cast(steam_remote_storage)); } else if (strcmp(pchVersion, "STEAMREMOTESTORAGE_INTERFACE_VERSION014") == 0) { return reinterpret_cast(static_cast(steam_remote_storage)); } else if (strcmp(pchVersion, "STEAMREMOTESTORAGE_INTERFACE_VERSION015") == 0) { // Not found in public Archive, based on reversing return reinterpret_cast(static_cast(steam_remote_storage)); } else if (strcmp(pchVersion, STEAMREMOTESTORAGE_INTERFACE_VERSION) == 0) { return reinterpret_cast(static_cast(steam_remote_storage)); } report_missing_impl_and_exit(pchVersion, EMU_FUNC_NAME); } // user screenshots ISteamScreenshots *Steam_Client::GetISteamScreenshots( HSteamUser hSteamuser, HSteamPipe hSteamPipe, const char *pchVersion ) { PRINT_DEBUG("%s", pchVersion); if (!steam_pipes.count(hSteamPipe) || !hSteamuser) return NULL; if (strcmp(pchVersion, "STEAMSCREENSHOTS_INTERFACE_VERSION001") == 0) { return reinterpret_cast(static_cast(steam_screenshots)); } else if (strcmp(pchVersion, "STEAMSCREENSHOTS_INTERFACE_VERSION002") == 0) { return reinterpret_cast(static_cast(steam_screenshots)); } else if (strcmp(pchVersion, STEAMSCREENSHOTS_INTERFACE_VERSION) == 0) { return reinterpret_cast(static_cast(steam_screenshots)); } report_missing_impl_and_exit(pchVersion, EMU_FUNC_NAME); } // Expose HTTP interface ISteamHTTP *Steam_Client::GetISteamHTTP( HSteamUser hSteamuser, HSteamPipe hSteamPipe, const char *pchVersion ) { PRINT_DEBUG("%s", pchVersion); if (!steam_pipes.count(hSteamPipe) || !hSteamuser) return NULL; Steam_HTTP *steam_http_temp{}; if (steam_pipes[hSteamPipe] == Steam_Pipe::SERVER) { steam_http_temp = steam_gameserver_http; } else { steam_http_temp = steam_http; } if (strcmp(pchVersion, "STEAMHTTP_INTERFACE_VERSION001") == 0) { return reinterpret_cast(static_cast(steam_http_temp)); } else if (strcmp(pchVersion, "STEAMHTTP_INTERFACE_VERSION002") == 0) { return reinterpret_cast(static_cast(steam_http_temp)); } else if (strcmp(pchVersion, STEAMHTTP_INTERFACE_VERSION) == 0) { return reinterpret_cast(static_cast(steam_http_temp)); } report_missing_impl_and_exit(pchVersion, EMU_FUNC_NAME); } // Deprecated - the ISteamUnifiedMessages interface is no longer intended for public consumption. void *Steam_Client::DEPRECATED_GetISteamUnifiedMessages( HSteamUser hSteamuser, HSteamPipe hSteamPipe, const char *pchVersion ) { PRINT_DEBUG("%s", pchVersion); if (!steam_pipes.count(hSteamPipe) || !hSteamuser) return NULL; if (strcmp(pchVersion, STEAMUNIFIEDMESSAGES_INTERFACE_VERSION) == 0) { return reinterpret_cast(static_cast(steam_unified_messages)); } report_missing_impl_and_exit(pchVersion, EMU_FUNC_NAME); } ISteamUnifiedMessages *Steam_Client::GetISteamUnifiedMessages( HSteamUser hSteamuser, HSteamPipe hSteamPipe, const char *pchVersion ) { PRINT_DEBUG("%s", pchVersion); if (!steam_pipes.count(hSteamPipe) || !hSteamuser) return NULL; if (strcmp(pchVersion, STEAMUNIFIEDMESSAGES_INTERFACE_VERSION) == 0) { return reinterpret_cast(static_cast(steam_unified_messages)); } report_missing_impl_and_exit(pchVersion, EMU_FUNC_NAME); } // Exposes the ISteamController interface ISteamController *Steam_Client::GetISteamController( HSteamUser hSteamUser, HSteamPipe hSteamPipe, const char *pchVersion ) { PRINT_DEBUG("%s", pchVersion); if (!steam_pipes.count(hSteamPipe) || !hSteamUser) return NULL; if (strcmp(pchVersion, "STEAMCONTROLLER_INTERFACE_VERSION") == 0) { return reinterpret_cast(static_cast(steam_controller)); } else if (strcmp(pchVersion, "SteamController003") == 0) { return reinterpret_cast(static_cast(steam_controller)); } else if (strcmp(pchVersion, "SteamController004") == 0) { return reinterpret_cast(static_cast(steam_controller)); } else if (strcmp(pchVersion, "SteamController005") == 0) { return reinterpret_cast(static_cast(steam_controller)); } else if (strcmp(pchVersion, "SteamController006") == 0) { return reinterpret_cast(static_cast(steam_controller)); } else if (strcmp(pchVersion, "SteamController007") == 0) { return reinterpret_cast(static_cast(steam_controller)); } else if (strcmp(pchVersion, STEAMCONTROLLER_INTERFACE_VERSION) == 0) { return reinterpret_cast(static_cast(steam_controller)); } report_missing_impl_and_exit(pchVersion, EMU_FUNC_NAME); } // Exposes the ISteamUGC interface ISteamUGC *Steam_Client::GetISteamUGC( HSteamUser hSteamUser, HSteamPipe hSteamPipe, const char *pchVersion ) { PRINT_DEBUG("%s", pchVersion); if (!steam_pipes.count(hSteamPipe) || !hSteamUser) return NULL; Steam_UGC *steam_ugc_temp{}; if (steam_pipes[hSteamPipe] == Steam_Pipe::SERVER) { steam_ugc_temp = steam_gameserver_ugc; } else { steam_ugc_temp = steam_ugc; } if (strcmp(pchVersion, "STEAMUGC_INTERFACE_VERSION") == 0) { //Is this actually a valid interface version? return reinterpret_cast(static_cast(steam_ugc_temp)); } else if (strcmp(pchVersion, "STEAMUGC_INTERFACE_VERSION001") == 0) { return reinterpret_cast(static_cast(steam_ugc_temp)); } else if (strcmp(pchVersion, "STEAMUGC_INTERFACE_VERSION002") == 0) { return reinterpret_cast(static_cast(steam_ugc_temp)); } else if (strcmp(pchVersion, "STEAMUGC_INTERFACE_VERSION003") == 0) { return reinterpret_cast(static_cast(steam_ugc_temp)); } else if (strcmp(pchVersion, "STEAMUGC_INTERFACE_VERSION004") == 0) { return reinterpret_cast(static_cast(steam_ugc_temp)); // Not found in public Archive, must be between 1.32-1.33b } else if (strcmp(pchVersion, "STEAMUGC_INTERFACE_VERSION005") == 0) { return reinterpret_cast(static_cast(steam_ugc_temp)); } else if (strcmp(pchVersion, "STEAMUGC_INTERFACE_VERSION006") == 0) { return reinterpret_cast(static_cast(steam_ugc_temp)); // Not found in public Archive, must be between 1.33b-1.34 } else if (strcmp(pchVersion, "STEAMUGC_INTERFACE_VERSION007") == 0) { return reinterpret_cast(static_cast(steam_ugc_temp)); } else if (strcmp(pchVersion, "STEAMUGC_INTERFACE_VERSION008") == 0) { return reinterpret_cast(static_cast(steam_ugc_temp)); } else if (strcmp(pchVersion, "STEAMUGC_INTERFACE_VERSION009") == 0) { return reinterpret_cast(static_cast(steam_ugc_temp)); } else if (strcmp(pchVersion, "STEAMUGC_INTERFACE_VERSION010") == 0) { return reinterpret_cast(static_cast(steam_ugc_temp)); } else if (strcmp(pchVersion, "STEAMUGC_INTERFACE_VERSION011") == 0) { // Not found in public Archive, based on reversing return reinterpret_cast(static_cast(steam_ugc_temp)); } else if (strcmp(pchVersion, "STEAMUGC_INTERFACE_VERSION012") == 0) { return reinterpret_cast(static_cast(steam_ugc_temp)); } else if (strcmp(pchVersion, "STEAMUGC_INTERFACE_VERSION013") == 0) { return reinterpret_cast(static_cast(steam_ugc_temp)); } else if (strcmp(pchVersion, "STEAMUGC_INTERFACE_VERSION014") == 0) { return reinterpret_cast(static_cast(steam_ugc_temp)); } else if (strcmp(pchVersion, "STEAMUGC_INTERFACE_VERSION015") == 0) { return reinterpret_cast(static_cast(steam_ugc_temp)); } else if (strcmp(pchVersion, "STEAMUGC_INTERFACE_VERSION016") == 0) { return reinterpret_cast(static_cast(steam_ugc_temp)); } else if (strcmp(pchVersion, "STEAMUGC_INTERFACE_VERSION017") == 0) { return reinterpret_cast(static_cast(steam_ugc_temp)); } else if (strcmp(pchVersion, "STEAMUGC_INTERFACE_VERSION018") == 0) { return reinterpret_cast(static_cast(steam_ugc_temp)); } else if (strcmp(pchVersion, STEAMUGC_INTERFACE_VERSION) == 0) { return reinterpret_cast(static_cast(steam_ugc_temp)); } report_missing_impl_and_exit(pchVersion, EMU_FUNC_NAME); } // returns app list interface, only available on specially registered apps ISteamAppList *Steam_Client::GetISteamAppList( HSteamUser hSteamUser, HSteamPipe hSteamPipe, const char *pchVersion ) { PRINT_DEBUG("%s", pchVersion); if (!steam_pipes.count(hSteamPipe) || !hSteamUser) return NULL; if (strcmp(pchVersion, STEAMAPPLIST_INTERFACE_VERSION) == 0) { return reinterpret_cast(static_cast(steam_applist)); } report_missing_impl_and_exit(pchVersion, EMU_FUNC_NAME); } // Music Player ISteamMusic *Steam_Client::GetISteamMusic( HSteamUser hSteamuser, HSteamPipe hSteamPipe, const char *pchVersion ) { PRINT_DEBUG("%s", pchVersion); if (!steam_pipes.count(hSteamPipe) || !hSteamuser) return NULL; if (strcmp(pchVersion, STEAMMUSIC_INTERFACE_VERSION) == 0) { return reinterpret_cast(static_cast(steam_music)); } report_missing_impl_and_exit(pchVersion, EMU_FUNC_NAME); } // Music Player Remote ISteamMusicRemote *Steam_Client::GetISteamMusicRemote(HSteamUser hSteamuser, HSteamPipe hSteamPipe, const char *pchVersion) { PRINT_DEBUG("%s", pchVersion); if (!steam_pipes.count(hSteamPipe) || !hSteamuser) return NULL; if (strcmp(pchVersion, STEAMMUSICREMOTE_INTERFACE_VERSION) == 0) { return reinterpret_cast(static_cast(steam_musicremote)); } report_missing_impl_and_exit(pchVersion, EMU_FUNC_NAME); } // html page display ISteamHTMLSurface *Steam_Client::GetISteamHTMLSurface(HSteamUser hSteamuser, HSteamPipe hSteamPipe, const char *pchVersion) { PRINT_DEBUG("%s", pchVersion); if (!steam_pipes.count(hSteamPipe) || !hSteamuser) return NULL; if (strcmp(pchVersion, "STEAMHTMLSURFACE_INTERFACE_VERSION_001") == 0) { return reinterpret_cast(static_cast(steam_HTMLsurface)); // Not found in public Archive, must be before 1.31 } else if (strcmp(pchVersion, "STEAMHTMLSURFACE_INTERFACE_VERSION_002") == 0) { return reinterpret_cast(static_cast(steam_HTMLsurface)); } else if (strcmp(pchVersion, "STEAMHTMLSURFACE_INTERFACE_VERSION_003") == 0) { return reinterpret_cast(static_cast(steam_HTMLsurface)); } else if (strcmp(pchVersion, "STEAMHTMLSURFACE_INTERFACE_VERSION_004") == 0) { return reinterpret_cast(static_cast(steam_HTMLsurface)); } else if (strcmp(pchVersion, STEAMHTMLSURFACE_INTERFACE_VERSION) == 0) { return reinterpret_cast(static_cast(steam_HTMLsurface)); } report_missing_impl_and_exit(pchVersion, EMU_FUNC_NAME); } // inventory ISteamInventory *Steam_Client::GetISteamInventory( HSteamUser hSteamuser, HSteamPipe hSteamPipe, const char *pchVersion ) { PRINT_DEBUG("%s", pchVersion); if (!steam_pipes.count(hSteamPipe) || !hSteamuser) return NULL; Steam_Inventory *steam_inventory_temp{}; if (steam_pipes[hSteamPipe] == Steam_Pipe::SERVER) { steam_inventory_temp = steam_gameserver_inventory; } else { steam_inventory_temp = steam_inventory; } if (strcmp(pchVersion, "STEAMINVENTORY_INTERFACE_V001") == 0) { return reinterpret_cast(static_cast(steam_inventory_temp)); } else if (strcmp(pchVersion, "STEAMINVENTORY_INTERFACE_V002") == 0) { return reinterpret_cast(static_cast(steam_inventory_temp)); } else if (strcmp(pchVersion, STEAMINVENTORY_INTERFACE_VERSION) == 0) { return reinterpret_cast(static_cast(steam_inventory_temp)); } report_missing_impl_and_exit(pchVersion, EMU_FUNC_NAME); } // Video ISteamVideo *Steam_Client::GetISteamVideo( HSteamUser hSteamuser, HSteamPipe hSteamPipe, const char *pchVersion ) { PRINT_DEBUG("%s", pchVersion); if (!steam_pipes.count(hSteamPipe) || !hSteamuser) return NULL; if (strcmp(pchVersion, "STEAMVIDEO_INTERFACE_V001") == 0) { return reinterpret_cast(static_cast(steam_video)); } if (strcmp(pchVersion, "STEAMVIDEO_INTERFACE_V002") == 0) { return reinterpret_cast(static_cast(steam_video)); } else if (strcmp(pchVersion, STEAMVIDEO_INTERFACE_VERSION) == 0) { return reinterpret_cast(static_cast(steam_video)); } report_missing_impl_and_exit(pchVersion, EMU_FUNC_NAME); } // Parental controls ISteamParentalSettings *Steam_Client::GetISteamParentalSettings( HSteamUser hSteamuser, HSteamPipe hSteamPipe, const char *pchVersion ) { PRINT_DEBUG("%s", pchVersion); if (!steam_pipes.count(hSteamPipe) || !hSteamuser) return NULL; if (strcmp(pchVersion, STEAMPARENTALSETTINGS_INTERFACE_VERSION) == 0) { return reinterpret_cast(static_cast(steam_parental)); } report_missing_impl_and_exit(pchVersion, EMU_FUNC_NAME); } ISteamMasterServerUpdater *Steam_Client::GetISteamMasterServerUpdater( HSteamUser hSteamUser, HSteamPipe hSteamPipe, const char *pchVersion ) { PRINT_DEBUG("%s", pchVersion); if (!steam_pipes.count(hSteamPipe) || !hSteamUser) return NULL; if (strcmp(pchVersion, STEAMMASTERSERVERUPDATER_INTERFACE_VERSION) == 0) { return reinterpret_cast(static_cast(steam_masterserver_updater)); } report_missing_impl_and_exit(pchVersion, EMU_FUNC_NAME); } ISteamContentServer *Steam_Client::GetISteamContentServer( HSteamUser hSteamUser, HSteamPipe hSteamPipe, const char *pchVersion ) { PRINT_DEBUG("%s", pchVersion); if (!steam_pipes.count(hSteamPipe) || !hSteamUser) return NULL; return NULL; } // game search ISteamGameSearch *Steam_Client::GetISteamGameSearch( HSteamUser hSteamuser, HSteamPipe hSteamPipe, const char *pchVersion ) { PRINT_DEBUG("%s", pchVersion); if (!steam_pipes.count(hSteamPipe) || !hSteamuser) return NULL; if (strcmp(pchVersion, STEAMGAMESEARCH_INTERFACE_VERSION) == 0) { return reinterpret_cast(static_cast(steam_game_search)); } report_missing_impl_and_exit(pchVersion, EMU_FUNC_NAME); } // Exposes the Steam Input interface for controller support ISteamInput *Steam_Client::GetISteamInput( HSteamUser hSteamUser, HSteamPipe hSteamPipe, const char *pchVersion ) { PRINT_DEBUG("%s", pchVersion); if (!steam_pipes.count(hSteamPipe) || !hSteamUser) return NULL; if (strcmp(pchVersion, "SteamInput001") == 0) { return reinterpret_cast(static_cast(steam_controller)); } else if (strcmp(pchVersion, "SteamInput002") == 0) { return reinterpret_cast(static_cast(steam_controller)); } else if (strcmp(pchVersion, "SteamInput005") == 0) { return reinterpret_cast(static_cast(steam_controller)); } else if (strcmp(pchVersion, STEAMINPUT_INTERFACE_VERSION) == 0) { return reinterpret_cast(static_cast(steam_controller)); } report_missing_impl_and_exit(pchVersion, EMU_FUNC_NAME); } // Steam Parties interface ISteamParties *Steam_Client::GetISteamParties( HSteamUser hSteamUser, HSteamPipe hSteamPipe, const char *pchVersion ) { PRINT_DEBUG("%s", pchVersion); if (!steam_pipes.count(hSteamPipe) || !hSteamUser) return NULL; if (strcmp(pchVersion, STEAMPARTIES_INTERFACE_VERSION) == 0) { return reinterpret_cast(static_cast(steam_parties)); } report_missing_impl_and_exit(pchVersion, EMU_FUNC_NAME); } ISteamRemotePlay *Steam_Client::GetISteamRemotePlay( HSteamUser hSteamUser, HSteamPipe hSteamPipe, const char *pchVersion ) { PRINT_DEBUG("%s", pchVersion); if (!steam_pipes.count(hSteamPipe) || !hSteamUser) return NULL; if (strcmp(pchVersion, "STEAMREMOTEPLAY_INTERFACE_VERSION001") == 0) { return reinterpret_cast(static_cast(steam_remoteplay)); } else if (strcmp(pchVersion, STEAMREMOTEPLAY_INTERFACE_VERSION) == 0) { return reinterpret_cast(static_cast(steam_remoteplay)); } report_missing_impl_and_exit(pchVersion, EMU_FUNC_NAME); } ISteamAppTicket *Steam_Client::GetAppTicket( HSteamUser hSteamUser, HSteamPipe hSteamPipe, const char *pchVersion ) { PRINT_DEBUG("%s", pchVersion); if (!steam_pipes.count(hSteamPipe) || !hSteamUser) return NULL; if (strcmp(pchVersion, STEAMAPPTICKET_INTERFACE_VERSION) == 0) { return reinterpret_cast(static_cast(steam_app_ticket)); } report_missing_impl_and_exit(pchVersion, EMU_FUNC_NAME); } void Steam_Client::report_missing_impl(std::string_view itf, std::string_view caller) { PRINT_DEBUG("'%s' '%s'", itf.data(), caller.data()); std::lock_guard lck(global_mutex); std::stringstream ss{}; try { ss << "INTERFACE=" << itf << "\n"; ss << "CALLER FN=" << caller << "\n"; } catch(...) { } try { if (settings_client) { ss << "APPID=" << settings_client->get_local_game_id().AppID() << "\n"; } } catch(...) { } try { std::string time(common_helpers::get_utc_time()); if (time.size()) { ss << "TIME=" << time << "\n"; } ss << "--------------------\n" << std::endl; } catch(...) { } try { std::ofstream report(std::filesystem::u8path(get_full_program_path() + "EMU_MISSING_INTERFACE.txt"), std::ios::out | std::ios::app); if (report.is_open()) { report << ss.str(); } } catch(...) { } #if defined(__WINDOWS__) MessageBoxA(nullptr, ss.str().c_str(), "Missing interface", MB_OK); #endif } void Steam_Client::report_missing_impl_and_exit(std::string_view itf, std::string_view caller) { report_missing_impl(itf, caller); std::exit(0x4155149); // MISSING :) }