From d1645624ded641c857d02e01ea82f3e64bd0f93c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?R=C3=A9mi=20Bernon?= <rbernon@codeweavers.com>
Date: Tue, 3 Oct 2023 09:40:50 +0200
Subject: [PATCH] lsteamclient: Use unix callbacks for custom client classes.

CW-Bug-Id: #22729
---
 lsteamclient/Makefile.in                      |   1 -
 ...kingServers_SteamMatchMakingServers001.cpp |  81 ----
 ...kingServers_SteamMatchMakingServers002.cpp |  81 ----
 ...rkingSockets_SteamNetworkingSockets006.cpp |  18 -
 ...rkingSockets_SteamNetworkingSockets008.cpp |  18 -
 lsteamclient/gen_wrapper.py                   |  60 +--
 lsteamclient/steamclient_main.c               |  62 +++
 lsteamclient/steamclient_structs_generated.h  |  40 +-
 lsteamclient/steamclient_wrappers.c           | 307 --------------
 lsteamclient/unix_private.h                   |  10 +-
 lsteamclient/unix_private_generated.h         |  24 +-
 lsteamclient/unix_steam_networking_manual.cpp | 378 ++++++++++++++++++
 lsteamclient/unixlib.cpp                      |  65 +++
 lsteamclient/unixlib.h                        |  27 ++
 lsteamclient/unixlib_generated.h              |  24 +-
 lsteamclient/winISteamMatchmakingServers.c    |  24 +-
 lsteamclient/winISteamNetworkingFakeUDPPort.c |   2 +-
 17 files changed, 641 insertions(+), 581 deletions(-)
 delete mode 100644 lsteamclient/steamclient_wrappers.c

diff --git a/lsteamclient/Makefile.in b/lsteamclient/Makefile.in
index 30271955..73c174c6 100644
--- a/lsteamclient/Makefile.in
+++ b/lsteamclient/Makefile.in
@@ -9,7 +9,6 @@ SOURCES = \
 	steam_networking_manual.c \
 	steamclient_generated.c \
 	steamclient_main.c \
-	steamclient_wrappers.c \
 	winISteamAppList.c \
 	winISteamApps.c \
 	winISteamAppTicket.c \
diff --git a/lsteamclient/cppISteamMatchmakingServers_SteamMatchMakingServers001.cpp b/lsteamclient/cppISteamMatchmakingServers_SteamMatchMakingServers001.cpp
index 188ee6c8..8c61644c 100644
--- a/lsteamclient/cppISteamMatchmakingServers_SteamMatchMakingServers001.cpp
+++ b/lsteamclient/cppISteamMatchmakingServers_SteamMatchMakingServers001.cpp
@@ -1,60 +1,6 @@
 /* This file is auto-generated, do not edit. */
 #include "unix_private.h"
 
-NTSTATUS ISteamMatchmakingServers_SteamMatchMakingServers001_RequestInternetServerList( void *args )
-{
-    struct ISteamMatchmakingServers_SteamMatchMakingServers001_RequestInternetServerList_params *params = (struct ISteamMatchmakingServers_SteamMatchMakingServers001_RequestInternetServerList_params *)args;
-    struct u_ISteamMatchmakingServers_SteamMatchMakingServers001 *iface = (struct u_ISteamMatchmakingServers_SteamMatchMakingServers001 *)params->linux_side;
-    u_ISteamMatchmakingServerListResponse *u_pRequestServersResponse = create_LinuxISteamMatchmakingServerListResponse( params->pRequestServersResponse, "ISteamMatchmakingServers_SteamMatchMakingServers001" );
-    iface->RequestInternetServerList( params->iApp, params->ppchFilters, params->nFilters, u_pRequestServersResponse );
-    return 0;
-}
-
-NTSTATUS ISteamMatchmakingServers_SteamMatchMakingServers001_RequestLANServerList( void *args )
-{
-    struct ISteamMatchmakingServers_SteamMatchMakingServers001_RequestLANServerList_params *params = (struct ISteamMatchmakingServers_SteamMatchMakingServers001_RequestLANServerList_params *)args;
-    struct u_ISteamMatchmakingServers_SteamMatchMakingServers001 *iface = (struct u_ISteamMatchmakingServers_SteamMatchMakingServers001 *)params->linux_side;
-    u_ISteamMatchmakingServerListResponse *u_pRequestServersResponse = create_LinuxISteamMatchmakingServerListResponse( params->pRequestServersResponse, "ISteamMatchmakingServers_SteamMatchMakingServers001" );
-    iface->RequestLANServerList( params->iApp, u_pRequestServersResponse );
-    return 0;
-}
-
-NTSTATUS ISteamMatchmakingServers_SteamMatchMakingServers001_RequestFriendsServerList( void *args )
-{
-    struct ISteamMatchmakingServers_SteamMatchMakingServers001_RequestFriendsServerList_params *params = (struct ISteamMatchmakingServers_SteamMatchMakingServers001_RequestFriendsServerList_params *)args;
-    struct u_ISteamMatchmakingServers_SteamMatchMakingServers001 *iface = (struct u_ISteamMatchmakingServers_SteamMatchMakingServers001 *)params->linux_side;
-    u_ISteamMatchmakingServerListResponse *u_pRequestServersResponse = create_LinuxISteamMatchmakingServerListResponse( params->pRequestServersResponse, "ISteamMatchmakingServers_SteamMatchMakingServers001" );
-    iface->RequestFriendsServerList( params->iApp, params->ppchFilters, params->nFilters, u_pRequestServersResponse );
-    return 0;
-}
-
-NTSTATUS ISteamMatchmakingServers_SteamMatchMakingServers001_RequestFavoritesServerList( void *args )
-{
-    struct ISteamMatchmakingServers_SteamMatchMakingServers001_RequestFavoritesServerList_params *params = (struct ISteamMatchmakingServers_SteamMatchMakingServers001_RequestFavoritesServerList_params *)args;
-    struct u_ISteamMatchmakingServers_SteamMatchMakingServers001 *iface = (struct u_ISteamMatchmakingServers_SteamMatchMakingServers001 *)params->linux_side;
-    u_ISteamMatchmakingServerListResponse *u_pRequestServersResponse = create_LinuxISteamMatchmakingServerListResponse( params->pRequestServersResponse, "ISteamMatchmakingServers_SteamMatchMakingServers001" );
-    iface->RequestFavoritesServerList( params->iApp, params->ppchFilters, params->nFilters, u_pRequestServersResponse );
-    return 0;
-}
-
-NTSTATUS ISteamMatchmakingServers_SteamMatchMakingServers001_RequestHistoryServerList( void *args )
-{
-    struct ISteamMatchmakingServers_SteamMatchMakingServers001_RequestHistoryServerList_params *params = (struct ISteamMatchmakingServers_SteamMatchMakingServers001_RequestHistoryServerList_params *)args;
-    struct u_ISteamMatchmakingServers_SteamMatchMakingServers001 *iface = (struct u_ISteamMatchmakingServers_SteamMatchMakingServers001 *)params->linux_side;
-    u_ISteamMatchmakingServerListResponse *u_pRequestServersResponse = create_LinuxISteamMatchmakingServerListResponse( params->pRequestServersResponse, "ISteamMatchmakingServers_SteamMatchMakingServers001" );
-    iface->RequestHistoryServerList( params->iApp, params->ppchFilters, params->nFilters, u_pRequestServersResponse );
-    return 0;
-}
-
-NTSTATUS ISteamMatchmakingServers_SteamMatchMakingServers001_RequestSpectatorServerList( void *args )
-{
-    struct ISteamMatchmakingServers_SteamMatchMakingServers001_RequestSpectatorServerList_params *params = (struct ISteamMatchmakingServers_SteamMatchMakingServers001_RequestSpectatorServerList_params *)args;
-    struct u_ISteamMatchmakingServers_SteamMatchMakingServers001 *iface = (struct u_ISteamMatchmakingServers_SteamMatchMakingServers001 *)params->linux_side;
-    u_ISteamMatchmakingServerListResponse *u_pRequestServersResponse = create_LinuxISteamMatchmakingServerListResponse( params->pRequestServersResponse, "ISteamMatchmakingServers_SteamMatchMakingServers001" );
-    iface->RequestSpectatorServerList( params->iApp, params->ppchFilters, params->nFilters, u_pRequestServersResponse );
-    return 0;
-}
-
 NTSTATUS ISteamMatchmakingServers_SteamMatchMakingServers001_GetServerDetails( void *args )
 {
     struct ISteamMatchmakingServers_SteamMatchMakingServers001_GetServerDetails_params *params = (struct ISteamMatchmakingServers_SteamMatchMakingServers001_GetServerDetails_params *)args;
@@ -103,33 +49,6 @@ NTSTATUS ISteamMatchmakingServers_SteamMatchMakingServers001_RefreshServer( void
     return 0;
 }
 
-NTSTATUS ISteamMatchmakingServers_SteamMatchMakingServers001_PingServer( void *args )
-{
-    struct ISteamMatchmakingServers_SteamMatchMakingServers001_PingServer_params *params = (struct ISteamMatchmakingServers_SteamMatchMakingServers001_PingServer_params *)args;
-    struct u_ISteamMatchmakingServers_SteamMatchMakingServers001 *iface = (struct u_ISteamMatchmakingServers_SteamMatchMakingServers001 *)params->linux_side;
-    u_ISteamMatchmakingPingResponse *u_pRequestServersResponse = create_LinuxISteamMatchmakingPingResponse( params->pRequestServersResponse, "ISteamMatchmakingServers_SteamMatchMakingServers001" );
-    params->_ret = iface->PingServer( params->unIP, params->usPort, u_pRequestServersResponse );
-    return 0;
-}
-
-NTSTATUS ISteamMatchmakingServers_SteamMatchMakingServers001_PlayerDetails( void *args )
-{
-    struct ISteamMatchmakingServers_SteamMatchMakingServers001_PlayerDetails_params *params = (struct ISteamMatchmakingServers_SteamMatchMakingServers001_PlayerDetails_params *)args;
-    struct u_ISteamMatchmakingServers_SteamMatchMakingServers001 *iface = (struct u_ISteamMatchmakingServers_SteamMatchMakingServers001 *)params->linux_side;
-    u_ISteamMatchmakingPlayersResponse *u_pRequestServersResponse = create_LinuxISteamMatchmakingPlayersResponse( params->pRequestServersResponse, "ISteamMatchmakingServers_SteamMatchMakingServers001" );
-    params->_ret = iface->PlayerDetails( params->unIP, params->usPort, u_pRequestServersResponse );
-    return 0;
-}
-
-NTSTATUS ISteamMatchmakingServers_SteamMatchMakingServers001_ServerRules( void *args )
-{
-    struct ISteamMatchmakingServers_SteamMatchMakingServers001_ServerRules_params *params = (struct ISteamMatchmakingServers_SteamMatchMakingServers001_ServerRules_params *)args;
-    struct u_ISteamMatchmakingServers_SteamMatchMakingServers001 *iface = (struct u_ISteamMatchmakingServers_SteamMatchMakingServers001 *)params->linux_side;
-    u_ISteamMatchmakingRulesResponse *u_pRequestServersResponse = create_LinuxISteamMatchmakingRulesResponse( params->pRequestServersResponse, "ISteamMatchmakingServers_SteamMatchMakingServers001" );
-    params->_ret = iface->ServerRules( params->unIP, params->usPort, u_pRequestServersResponse );
-    return 0;
-}
-
 NTSTATUS ISteamMatchmakingServers_SteamMatchMakingServers001_CancelServerQuery( void *args )
 {
     struct ISteamMatchmakingServers_SteamMatchMakingServers001_CancelServerQuery_params *params = (struct ISteamMatchmakingServers_SteamMatchMakingServers001_CancelServerQuery_params *)args;
diff --git a/lsteamclient/cppISteamMatchmakingServers_SteamMatchMakingServers002.cpp b/lsteamclient/cppISteamMatchmakingServers_SteamMatchMakingServers002.cpp
index 021a808b..bbd08d88 100644
--- a/lsteamclient/cppISteamMatchmakingServers_SteamMatchMakingServers002.cpp
+++ b/lsteamclient/cppISteamMatchmakingServers_SteamMatchMakingServers002.cpp
@@ -1,60 +1,6 @@
 /* This file is auto-generated, do not edit. */
 #include "unix_private.h"
 
-NTSTATUS ISteamMatchmakingServers_SteamMatchMakingServers002_RequestInternetServerList( void *args )
-{
-    struct ISteamMatchmakingServers_SteamMatchMakingServers002_RequestInternetServerList_params *params = (struct ISteamMatchmakingServers_SteamMatchMakingServers002_RequestInternetServerList_params *)args;
-    struct u_ISteamMatchmakingServers_SteamMatchMakingServers002 *iface = (struct u_ISteamMatchmakingServers_SteamMatchMakingServers002 *)params->linux_side;
-    u_ISteamMatchmakingServerListResponse *u_pRequestServersResponse = create_LinuxISteamMatchmakingServerListResponse( params->pRequestServersResponse, "ISteamMatchmakingServers_SteamMatchMakingServers002" );
-    params->_ret = iface->RequestInternetServerList( params->iApp, params->ppchFilters, params->nFilters, u_pRequestServersResponse );
-    return 0;
-}
-
-NTSTATUS ISteamMatchmakingServers_SteamMatchMakingServers002_RequestLANServerList( void *args )
-{
-    struct ISteamMatchmakingServers_SteamMatchMakingServers002_RequestLANServerList_params *params = (struct ISteamMatchmakingServers_SteamMatchMakingServers002_RequestLANServerList_params *)args;
-    struct u_ISteamMatchmakingServers_SteamMatchMakingServers002 *iface = (struct u_ISteamMatchmakingServers_SteamMatchMakingServers002 *)params->linux_side;
-    u_ISteamMatchmakingServerListResponse *u_pRequestServersResponse = create_LinuxISteamMatchmakingServerListResponse( params->pRequestServersResponse, "ISteamMatchmakingServers_SteamMatchMakingServers002" );
-    params->_ret = iface->RequestLANServerList( params->iApp, u_pRequestServersResponse );
-    return 0;
-}
-
-NTSTATUS ISteamMatchmakingServers_SteamMatchMakingServers002_RequestFriendsServerList( void *args )
-{
-    struct ISteamMatchmakingServers_SteamMatchMakingServers002_RequestFriendsServerList_params *params = (struct ISteamMatchmakingServers_SteamMatchMakingServers002_RequestFriendsServerList_params *)args;
-    struct u_ISteamMatchmakingServers_SteamMatchMakingServers002 *iface = (struct u_ISteamMatchmakingServers_SteamMatchMakingServers002 *)params->linux_side;
-    u_ISteamMatchmakingServerListResponse *u_pRequestServersResponse = create_LinuxISteamMatchmakingServerListResponse( params->pRequestServersResponse, "ISteamMatchmakingServers_SteamMatchMakingServers002" );
-    params->_ret = iface->RequestFriendsServerList( params->iApp, params->ppchFilters, params->nFilters, u_pRequestServersResponse );
-    return 0;
-}
-
-NTSTATUS ISteamMatchmakingServers_SteamMatchMakingServers002_RequestFavoritesServerList( void *args )
-{
-    struct ISteamMatchmakingServers_SteamMatchMakingServers002_RequestFavoritesServerList_params *params = (struct ISteamMatchmakingServers_SteamMatchMakingServers002_RequestFavoritesServerList_params *)args;
-    struct u_ISteamMatchmakingServers_SteamMatchMakingServers002 *iface = (struct u_ISteamMatchmakingServers_SteamMatchMakingServers002 *)params->linux_side;
-    u_ISteamMatchmakingServerListResponse *u_pRequestServersResponse = create_LinuxISteamMatchmakingServerListResponse( params->pRequestServersResponse, "ISteamMatchmakingServers_SteamMatchMakingServers002" );
-    params->_ret = iface->RequestFavoritesServerList( params->iApp, params->ppchFilters, params->nFilters, u_pRequestServersResponse );
-    return 0;
-}
-
-NTSTATUS ISteamMatchmakingServers_SteamMatchMakingServers002_RequestHistoryServerList( void *args )
-{
-    struct ISteamMatchmakingServers_SteamMatchMakingServers002_RequestHistoryServerList_params *params = (struct ISteamMatchmakingServers_SteamMatchMakingServers002_RequestHistoryServerList_params *)args;
-    struct u_ISteamMatchmakingServers_SteamMatchMakingServers002 *iface = (struct u_ISteamMatchmakingServers_SteamMatchMakingServers002 *)params->linux_side;
-    u_ISteamMatchmakingServerListResponse *u_pRequestServersResponse = create_LinuxISteamMatchmakingServerListResponse( params->pRequestServersResponse, "ISteamMatchmakingServers_SteamMatchMakingServers002" );
-    params->_ret = iface->RequestHistoryServerList( params->iApp, params->ppchFilters, params->nFilters, u_pRequestServersResponse );
-    return 0;
-}
-
-NTSTATUS ISteamMatchmakingServers_SteamMatchMakingServers002_RequestSpectatorServerList( void *args )
-{
-    struct ISteamMatchmakingServers_SteamMatchMakingServers002_RequestSpectatorServerList_params *params = (struct ISteamMatchmakingServers_SteamMatchMakingServers002_RequestSpectatorServerList_params *)args;
-    struct u_ISteamMatchmakingServers_SteamMatchMakingServers002 *iface = (struct u_ISteamMatchmakingServers_SteamMatchMakingServers002 *)params->linux_side;
-    u_ISteamMatchmakingServerListResponse *u_pRequestServersResponse = create_LinuxISteamMatchmakingServerListResponse( params->pRequestServersResponse, "ISteamMatchmakingServers_SteamMatchMakingServers002" );
-    params->_ret = iface->RequestSpectatorServerList( params->iApp, params->ppchFilters, params->nFilters, u_pRequestServersResponse );
-    return 0;
-}
-
 NTSTATUS ISteamMatchmakingServers_SteamMatchMakingServers002_ReleaseRequest( void *args )
 {
     struct ISteamMatchmakingServers_SteamMatchMakingServers002_ReleaseRequest_params *params = (struct ISteamMatchmakingServers_SteamMatchMakingServers002_ReleaseRequest_params *)args;
@@ -111,33 +57,6 @@ NTSTATUS ISteamMatchmakingServers_SteamMatchMakingServers002_RefreshServer( void
     return 0;
 }
 
-NTSTATUS ISteamMatchmakingServers_SteamMatchMakingServers002_PingServer( void *args )
-{
-    struct ISteamMatchmakingServers_SteamMatchMakingServers002_PingServer_params *params = (struct ISteamMatchmakingServers_SteamMatchMakingServers002_PingServer_params *)args;
-    struct u_ISteamMatchmakingServers_SteamMatchMakingServers002 *iface = (struct u_ISteamMatchmakingServers_SteamMatchMakingServers002 *)params->linux_side;
-    u_ISteamMatchmakingPingResponse *u_pRequestServersResponse = create_LinuxISteamMatchmakingPingResponse( params->pRequestServersResponse, "ISteamMatchmakingServers_SteamMatchMakingServers002" );
-    params->_ret = iface->PingServer( params->unIP, params->usPort, u_pRequestServersResponse );
-    return 0;
-}
-
-NTSTATUS ISteamMatchmakingServers_SteamMatchMakingServers002_PlayerDetails( void *args )
-{
-    struct ISteamMatchmakingServers_SteamMatchMakingServers002_PlayerDetails_params *params = (struct ISteamMatchmakingServers_SteamMatchMakingServers002_PlayerDetails_params *)args;
-    struct u_ISteamMatchmakingServers_SteamMatchMakingServers002 *iface = (struct u_ISteamMatchmakingServers_SteamMatchMakingServers002 *)params->linux_side;
-    u_ISteamMatchmakingPlayersResponse *u_pRequestServersResponse = create_LinuxISteamMatchmakingPlayersResponse( params->pRequestServersResponse, "ISteamMatchmakingServers_SteamMatchMakingServers002" );
-    params->_ret = iface->PlayerDetails( params->unIP, params->usPort, u_pRequestServersResponse );
-    return 0;
-}
-
-NTSTATUS ISteamMatchmakingServers_SteamMatchMakingServers002_ServerRules( void *args )
-{
-    struct ISteamMatchmakingServers_SteamMatchMakingServers002_ServerRules_params *params = (struct ISteamMatchmakingServers_SteamMatchMakingServers002_ServerRules_params *)args;
-    struct u_ISteamMatchmakingServers_SteamMatchMakingServers002 *iface = (struct u_ISteamMatchmakingServers_SteamMatchMakingServers002 *)params->linux_side;
-    u_ISteamMatchmakingRulesResponse *u_pRequestServersResponse = create_LinuxISteamMatchmakingRulesResponse( params->pRequestServersResponse, "ISteamMatchmakingServers_SteamMatchMakingServers002" );
-    params->_ret = iface->ServerRules( params->unIP, params->usPort, u_pRequestServersResponse );
-    return 0;
-}
-
 NTSTATUS ISteamMatchmakingServers_SteamMatchMakingServers002_CancelServerQuery( void *args )
 {
     struct ISteamMatchmakingServers_SteamMatchMakingServers002_CancelServerQuery_params *params = (struct ISteamMatchmakingServers_SteamMatchMakingServers002_CancelServerQuery_params *)args;
diff --git a/lsteamclient/cppISteamNetworkingSockets_SteamNetworkingSockets006.cpp b/lsteamclient/cppISteamNetworkingSockets_SteamNetworkingSockets006.cpp
index 68761d5a..f30ac4e8 100644
--- a/lsteamclient/cppISteamNetworkingSockets_SteamNetworkingSockets006.cpp
+++ b/lsteamclient/cppISteamNetworkingSockets_SteamNetworkingSockets006.cpp
@@ -233,21 +233,3 @@ NTSTATUS ISteamNetworkingSockets_SteamNetworkingSockets006_GetGameCoordinatorSer
     return 0;
 }
 
-NTSTATUS ISteamNetworkingSockets_SteamNetworkingSockets006_ConnectP2PCustomSignaling( void *args )
-{
-    struct ISteamNetworkingSockets_SteamNetworkingSockets006_ConnectP2PCustomSignaling_params *params = (struct ISteamNetworkingSockets_SteamNetworkingSockets006_ConnectP2PCustomSignaling_params *)args;
-    struct u_ISteamNetworkingSockets_SteamNetworkingSockets006 *iface = (struct u_ISteamNetworkingSockets_SteamNetworkingSockets006 *)params->linux_side;
-    u_ISteamNetworkingConnectionCustomSignaling *u_pSignaling = create_LinuxISteamNetworkingConnectionCustomSignaling( params->pSignaling, "ISteamNetworkingSockets_SteamNetworkingSockets006" );
-    params->_ret = iface->ConnectP2PCustomSignaling( u_pSignaling, params->pPeerIdentity, params->nOptions, params->pOptions );
-    return 0;
-}
-
-NTSTATUS ISteamNetworkingSockets_SteamNetworkingSockets006_ReceivedP2PCustomSignal( void *args )
-{
-    struct ISteamNetworkingSockets_SteamNetworkingSockets006_ReceivedP2PCustomSignal_params *params = (struct ISteamNetworkingSockets_SteamNetworkingSockets006_ReceivedP2PCustomSignal_params *)args;
-    struct u_ISteamNetworkingSockets_SteamNetworkingSockets006 *iface = (struct u_ISteamNetworkingSockets_SteamNetworkingSockets006 *)params->linux_side;
-    u_ISteamNetworkingCustomSignalingRecvContext *u_pContext = create_LinuxISteamNetworkingCustomSignalingRecvContext( params->pContext, "ISteamNetworkingSockets_SteamNetworkingSockets006" );
-    params->_ret = iface->ReceivedP2PCustomSignal( params->pMsg, params->cbMsg, u_pContext );
-    return 0;
-}
-
diff --git a/lsteamclient/cppISteamNetworkingSockets_SteamNetworkingSockets008.cpp b/lsteamclient/cppISteamNetworkingSockets_SteamNetworkingSockets008.cpp
index d809c346..ce6289d5 100644
--- a/lsteamclient/cppISteamNetworkingSockets_SteamNetworkingSockets008.cpp
+++ b/lsteamclient/cppISteamNetworkingSockets_SteamNetworkingSockets008.cpp
@@ -257,24 +257,6 @@ NTSTATUS ISteamNetworkingSockets_SteamNetworkingSockets008_GetGameCoordinatorSer
     return 0;
 }
 
-NTSTATUS ISteamNetworkingSockets_SteamNetworkingSockets008_ConnectP2PCustomSignaling( void *args )
-{
-    struct ISteamNetworkingSockets_SteamNetworkingSockets008_ConnectP2PCustomSignaling_params *params = (struct ISteamNetworkingSockets_SteamNetworkingSockets008_ConnectP2PCustomSignaling_params *)args;
-    struct u_ISteamNetworkingSockets_SteamNetworkingSockets008 *iface = (struct u_ISteamNetworkingSockets_SteamNetworkingSockets008 *)params->linux_side;
-    u_ISteamNetworkingConnectionCustomSignaling *u_pSignaling = create_LinuxISteamNetworkingConnectionCustomSignaling( params->pSignaling, "ISteamNetworkingSockets_SteamNetworkingSockets008" );
-    params->_ret = iface->ConnectP2PCustomSignaling( u_pSignaling, params->pPeerIdentity, params->nOptions, params->pOptions );
-    return 0;
-}
-
-NTSTATUS ISteamNetworkingSockets_SteamNetworkingSockets008_ReceivedP2PCustomSignal( void *args )
-{
-    struct ISteamNetworkingSockets_SteamNetworkingSockets008_ReceivedP2PCustomSignal_params *params = (struct ISteamNetworkingSockets_SteamNetworkingSockets008_ReceivedP2PCustomSignal_params *)args;
-    struct u_ISteamNetworkingSockets_SteamNetworkingSockets008 *iface = (struct u_ISteamNetworkingSockets_SteamNetworkingSockets008 *)params->linux_side;
-    u_ISteamNetworkingCustomSignalingRecvContext *u_pContext = create_LinuxISteamNetworkingCustomSignalingRecvContext( params->pContext, "ISteamNetworkingSockets_SteamNetworkingSockets008" );
-    params->_ret = iface->ReceivedP2PCustomSignal( params->pMsg, params->cbMsg, u_pContext );
-    return 0;
-}
-
 NTSTATUS ISteamNetworkingSockets_SteamNetworkingSockets008_GetCertificateRequest( void *args )
 {
     struct ISteamNetworkingSockets_SteamNetworkingSockets008_GetCertificateRequest_params *params = (struct ISteamNetworkingSockets_SteamNetworkingSockets008_GetCertificateRequest_params *)args;
diff --git a/lsteamclient/gen_wrapper.py b/lsteamclient/gen_wrapper.py
index ae9c7d78..14070320 100755
--- a/lsteamclient/gen_wrapper.py
+++ b/lsteamclient/gen_wrapper.py
@@ -225,6 +225,18 @@ MANUAL_METHODS = {
     "ISteamNetworkingSockets_ReceiveMessagesOnListenSocket": True,
     "ISteamNetworkingSockets_ReceiveMessagesOnPollGroup": True,
     "ISteamNetworkingSockets_SendMessages": True,
+    "ISteamNetworkingSockets_ConnectP2PCustomSignaling": lambda ver, abi: abi == 'u' and ver <= 8,
+    "ISteamNetworkingSockets_ReceivedP2PCustomSignal": lambda ver, abi: abi == 'u' and ver <= 8,
+
+    "ISteamMatchmakingServers_PingServer": lambda ver, abi: abi == 'u',
+    "ISteamMatchmakingServers_PlayerDetails": lambda ver, abi: abi == 'u',
+    "ISteamMatchmakingServers_RequestFavoritesServerList": lambda ver, abi: abi == 'u',
+    "ISteamMatchmakingServers_RequestFriendsServerList": lambda ver, abi: abi == 'u',
+    "ISteamMatchmakingServers_RequestHistoryServerList": lambda ver, abi: abi == 'u',
+    "ISteamMatchmakingServers_RequestInternetServerList": lambda ver, abi: abi == 'u',
+    "ISteamMatchmakingServers_RequestLANServerList": lambda ver, abi: abi == 'u',
+    "ISteamMatchmakingServers_RequestSpectatorServerList": lambda ver, abi: abi == 'u',
+    "ISteamMatchmakingServers_ServerRules": lambda ver, abi: abi == 'u',
 
     "ISteamNetworkingUtils_AllocateMessage": True,
     "ISteamNetworkingUtils_SetConfigValue": lambda ver, abi: abi == 'u' and ver >= 3,
@@ -280,17 +292,6 @@ MANUAL_PARAMS = [
 
 converted_structs = []
 
-# callback classes for which we have a linux wrapper
-WRAPPED_CLASSES = [
-    "ISteamMatchmakingServerListResponse",
-    "ISteamMatchmakingPingResponse",
-    "ISteamMatchmakingPlayersResponse",
-    "ISteamMatchmakingRulesResponse",
-    "ISteamNetworkingFakeUDPPort",
-    "ISteamNetworkingConnectionCustomSignaling",
-    "ISteamNetworkingCustomSignalingRecvContext",
-]
-
 all_classes = {}
 all_records = {}
 all_sources = {}
@@ -617,6 +618,11 @@ class Method:
     def get_arguments(self):
         return self._cursor.get_arguments()
 
+    def needs_conversion(self, other):
+        if len(list(self.get_arguments())) != len(list(other.get_arguments())):
+            return True
+        return False # FIXME
+
     def write_params(self, out):
         returns_record = self.result_type.get_canonical().kind == TypeKind.RECORD
 
@@ -710,7 +716,13 @@ class Class:
         self._decl_order = order
 
     def needs_conversion(self, other):
-        return self._abi[0] != other._abi[0]
+        if self._abi[0] != other._abi[0]:
+            return True
+        if len(self.methods) != len(other.methods):
+            return True
+        if any(m.needs_conversion(n) for m, n in zip(self.methods, other.methods)):
+            return True
+        return False
 
     def write_definition(self, out, prefix):
         out(f'struct {prefix}{self.full_name}\n')
@@ -807,8 +819,7 @@ def underlying_type(decl):
 
 def param_needs_conversion(decl):
     decl = underlying_type(decl)
-    return decl.spelling not in WRAPPED_CLASSES and \
-           decl.kind == TypeKind.RECORD and \
+    return decl.kind == TypeKind.RECORD and \
            struct_needs_conversion(decl)
 
 
@@ -900,8 +911,6 @@ def handle_method_cpp(method, classname, out):
 
     need_convert = {n: p for n, p in zip(names, method.get_arguments())
                     if param_needs_conversion(p)}
-    need_wrapper = {n: p for n, p in zip(names, method.get_arguments())
-                    if underlying_typename(p) in WRAPPED_CLASSES}
     manual_convert = {n: p for n, p in zip(names, method.get_arguments())
                       if underlying_type(p).spelling in MANUAL_TYPES
                       or p.spelling in MANUAL_PARAMS}
@@ -963,9 +972,6 @@ def handle_method_cpp(method, classname, out):
         else:
             out(f'    {declspec(param, f"u_{name}", "u_")} = manual_convert_{method.name}_{name}( params->{name} );\n')
 
-    for name, param in sorted(need_wrapper.items()):
-        out(f'    {declspec(param, f"u_{name}", "u_")} = create_Linux{underlying_type(param.type).spelling}( params->{name}, "{classname}_{klass.version}" );\n')
-
     if returns_void:
         out(u'    ')
     elif returns_record:
@@ -978,7 +984,6 @@ def handle_method_cpp(method, classname, out):
         if name in need_convert: return f"{pfx}u_{name}"
         if name in manual_convert: return f"u_{name}"
         if name in path_conv_wtou: return f"u_{name}"
-        if name in need_wrapper: return f"u_{name}"
         return f'params->{name}'
 
     params = [param_call(n, p) for n, p in zip(names[1:], method.get_arguments())]
@@ -1116,10 +1121,7 @@ def handle_class(klass):
         out(u'\n')
         out(f'struct w_steam_iface *create_{winclassname}(void *u_iface)\n')
         out(u'{\n')
-        if klass.name in WRAPPED_CLASSES:
-            out(u'    struct w_steam_iface *r = HeapAlloc(GetProcessHeap(), 0, sizeof(struct w_steam_iface));\n')
-        else:
-            out(f'    struct w_steam_iface *r = alloc_mem_for_iface(sizeof(struct w_steam_iface), "{klass.version}");\n')
+        out(f'    struct w_steam_iface *r = alloc_mem_for_iface(sizeof(struct w_steam_iface), "{klass.version}");\n')
         out(u'    TRACE("-> %p\\n", r);\n')
         out(f'    r->vtable = alloc_vtable(&{winclassname}_vtable, {len(klass.methods)}, "{klass.version}");\n')
         out(u'    r->u_iface = u_iface;\n')
@@ -1183,6 +1185,10 @@ def classify_struct(name):
     versions = {}
     unique = True
 
+    def set_class_version(abis, version):
+        for abi in filter(lambda x: type(x) is Class, abis):
+            abi.version = version
+
     for sdkver in filter(lambda v: v in structs, reversed(SDK_VERSIONS)):
         abis = [structs[sdkver][a] for a in ABIS]
 
@@ -1198,16 +1204,22 @@ def classify_struct(name):
         compat = next((k for k, v in prev if is_always_compatible(v)), None)
         if compat:
             versions[sdkver] = versions[compat]
+            set_class_version(abis, compat)
         else:
             [abi.set_used() for abi in abis] # make sure order is computed
             versions[sdkver] = f"{name}_{sdkver}"
             prev += [(sdkver, abis)]
+            set_class_version(abis, sdkver)
 
     if unique:
         unique_structs.append(name)
 
     if len(set(versions.values())) == 1:
         versions = {sdkver: name for sdkver in versions.keys()}
+        for sdkver in filter(lambda v: v in structs, reversed(SDK_VERSIONS)):
+            abis = [structs[sdkver][a] for a in ABIS]
+            set_class_version(abis, "")
+
     return versions
 
 
diff --git a/lsteamclient/steamclient_main.c b/lsteamclient/steamclient_main.c
index ef4ffd0f..123e5dbb 100644
--- a/lsteamclient/steamclient_main.c
+++ b/lsteamclient/steamclient_main.c
@@ -17,6 +17,34 @@ WINE_DEFAULT_DEBUG_CHANNEL(steamclient);
 
 CREATE_TYPE_INFO_VTABLE;
 
+#ifdef __ASM_USE_THISCALL_WRAPPER
+
+#define DEFINE_VTBL_WRAPPER(off)            \
+    __ASM_GLOBAL_FUNC(vtbl_wrapper_ ## off, \
+        "popl %eax\n\t"                     \
+        "popl %ecx\n\t"                     \
+        "pushl %eax\n\t"                    \
+        "movl 0(%ecx), %eax\n\t"            \
+        "jmp *" #off "(%eax)\n\t")
+
+DEFINE_VTBL_WRAPPER(0);
+DEFINE_VTBL_WRAPPER(4);
+DEFINE_VTBL_WRAPPER(8);
+DEFINE_VTBL_WRAPPER(12);
+DEFINE_VTBL_WRAPPER(16);
+DEFINE_VTBL_WRAPPER(20);
+DEFINE_VTBL_WRAPPER(24);
+DEFINE_VTBL_WRAPPER(28);
+DEFINE_VTBL_WRAPPER(32);
+DEFINE_VTBL_WRAPPER(36);
+DEFINE_VTBL_WRAPPER(40);
+DEFINE_VTBL_WRAPPER(44);
+DEFINE_VTBL_WRAPPER(48);
+DEFINE_VTBL_WRAPPER(52);
+DEFINE_VTBL_WRAPPER(56);
+
+#endif
+
 char g_tmppath[PATH_MAX];
 
 static CRITICAL_SECTION steamclient_cs = { NULL, -1, 0, 0, 0, 0 };
@@ -324,6 +352,40 @@ static void execute_pending_callbacks(void)
                    params.callback->warning_message_hook.severity, wine_dbgstr_a( params.callback->warning_message_hook.msg ) );
             params.callback->warning_message_hook.pFunction( params.callback->warning_message_hook.severity, params.callback->warning_message_hook.msg );
             break;
+        case CALL_IFACE_VTABLE_0:
+            TRACE( "CALL_IFACE_VTABLE_0 iface %p, arg0 %#jx, arg1 %#jx, arg2 %#jx.\n", params.callback->call_iface_vtable.iface,
+                   params.callback->call_iface_vtable.arg0, params.callback->call_iface_vtable.arg1, params.callback->call_iface_vtable.arg2 );
+            CALL_VTBL_FUNC( params.callback->call_iface_vtable.iface, 0, void, (void *, intptr_t, intptr_t, intptr_t), (params.callback->call_iface_vtable.iface,
+                            params.callback->call_iface_vtable.arg0, params.callback->call_iface_vtable.arg1, params.callback->call_iface_vtable.arg2) );
+            break;
+        case CALL_IFACE_VTABLE_1:
+            TRACE( "CALL_IFACE_VTABLE_1 iface %p, arg0 %#jx, arg1 %#jx, arg2 %#jx.\n", params.callback->call_iface_vtable.iface,
+                   params.callback->call_iface_vtable.arg0, params.callback->call_iface_vtable.arg1, params.callback->call_iface_vtable.arg2 );
+            CALL_VTBL_FUNC( params.callback->call_iface_vtable.iface, 4, void, (void *, intptr_t, intptr_t, intptr_t), (params.callback->call_iface_vtable.iface,
+                            params.callback->call_iface_vtable.arg0, params.callback->call_iface_vtable.arg1, params.callback->call_iface_vtable.arg2) );
+            break;
+        case CALL_IFACE_VTABLE_2:
+            TRACE( "CALL_IFACE_VTABLE_2 iface %p, arg0 %#jx, arg1 %#jx, arg2 %#jx.\n", params.callback->call_iface_vtable.iface,
+                   params.callback->call_iface_vtable.arg0, params.callback->call_iface_vtable.arg1, params.callback->call_iface_vtable.arg2 );
+            CALL_VTBL_FUNC( params.callback->call_iface_vtable.iface, 8, void, (void *, intptr_t, intptr_t, intptr_t), (params.callback->call_iface_vtable.iface,
+                            params.callback->call_iface_vtable.arg0, params.callback->call_iface_vtable.arg1, params.callback->call_iface_vtable.arg2) );
+            break;
+
+        case CALL_IFACE_VTABLE_0_ADD_PLAYER_TO_LIST:
+            TRACE( "CALL_IFACE_VTABLE_0_ADD_PLAYER_TO_LIST iface %p, name %s, score %u, time_played %f.\n", params.callback->add_player_to_list.iface,
+                   params.callback->add_player_to_list.name, params.callback->add_player_to_list.score, params.callback->add_player_to_list.time_played );
+            CALL_VTBL_FUNC( params.callback->add_player_to_list.iface, 0, void, (void *, const char *, int32_t, float), (params.callback->add_player_to_list.iface,
+                            params.callback->add_player_to_list.name, params.callback->add_player_to_list.score, params.callback->add_player_to_list.time_played) );
+            break;
+        case CALL_IFACE_VTABLE_0_RULES_RESPONDED:
+        {
+            const char *value = params.callback->rules_responded.rule_and_value + strlen( params.callback->rules_responded.rule_and_value ) + 1;
+            TRACE( "CALL_IFACE_VTABLE_0_RULES_RESPONDED iface %p, rule %s, value %s.\n", params.callback->rules_responded.iface,
+                   params.callback->rules_responded.rule_and_value, value );
+            CALL_VTBL_FUNC( params.callback->rules_responded.iface, 0, void, (void *, const char *, const char *), (params.callback->rules_responded.iface,
+                            params.callback->rules_responded.rule_and_value, value) );
+            break;
+        }
         }
     }
 
diff --git a/lsteamclient/steamclient_structs_generated.h b/lsteamclient/steamclient_structs_generated.h
index d67eccd0..3de6f970 100644
--- a/lsteamclient/steamclient_structs_generated.h
+++ b/lsteamclient/steamclient_structs_generated.h
@@ -2539,12 +2539,18 @@ typedef struct u_ISteamMatchmakingRulesResponse u32_ISteamMatchmakingRulesRespon
 typedef struct w_ISteamMatchmakingRulesResponse w_ISteamMatchmakingRulesResponse;
 typedef struct w_ISteamMatchmakingRulesResponse w64_ISteamMatchmakingRulesResponse;
 typedef struct w_ISteamMatchmakingRulesResponse w32_ISteamMatchmakingRulesResponse;
-typedef struct u_ISteamMatchmakingServerListResponse u_ISteamMatchmakingServerListResponse;
-typedef struct u_ISteamMatchmakingServerListResponse u64_ISteamMatchmakingServerListResponse;
-typedef struct u_ISteamMatchmakingServerListResponse u32_ISteamMatchmakingServerListResponse;
-typedef struct w_ISteamMatchmakingServerListResponse w_ISteamMatchmakingServerListResponse;
-typedef struct w_ISteamMatchmakingServerListResponse w64_ISteamMatchmakingServerListResponse;
-typedef struct w_ISteamMatchmakingServerListResponse w32_ISteamMatchmakingServerListResponse;
+typedef struct u_ISteamMatchmakingServerListResponse_106 u_ISteamMatchmakingServerListResponse_106;
+typedef struct u_ISteamMatchmakingServerListResponse_106 u64_ISteamMatchmakingServerListResponse_106;
+typedef struct u_ISteamMatchmakingServerListResponse_106 u32_ISteamMatchmakingServerListResponse_106;
+typedef struct w_ISteamMatchmakingServerListResponse_106 w_ISteamMatchmakingServerListResponse_106;
+typedef struct w_ISteamMatchmakingServerListResponse_106 w64_ISteamMatchmakingServerListResponse_106;
+typedef struct w_ISteamMatchmakingServerListResponse_106 w32_ISteamMatchmakingServerListResponse_106;
+typedef struct u_ISteamMatchmakingServerListResponse_099u u_ISteamMatchmakingServerListResponse_099u;
+typedef struct u_ISteamMatchmakingServerListResponse_099u u64_ISteamMatchmakingServerListResponse_099u;
+typedef struct u_ISteamMatchmakingServerListResponse_099u u32_ISteamMatchmakingServerListResponse_099u;
+typedef struct w_ISteamMatchmakingServerListResponse_099u w_ISteamMatchmakingServerListResponse_099u;
+typedef struct w_ISteamMatchmakingServerListResponse_099u w64_ISteamMatchmakingServerListResponse_099u;
+typedef struct w_ISteamMatchmakingServerListResponse_099u w32_ISteamMatchmakingServerListResponse_099u;
 typedef struct u_ISteamNetworkingConnectionCustomSignaling u_ISteamNetworkingConnectionCustomSignaling;
 typedef struct u_ISteamNetworkingConnectionCustomSignaling u64_ISteamNetworkingConnectionCustomSignaling;
 typedef struct u_ISteamNetworkingConnectionCustomSignaling u32_ISteamNetworkingConnectionCustomSignaling;
@@ -5608,7 +5614,7 @@ struct u_ISteamMatchmakingRulesResponse
 #endif /* __cplusplus */
 };
 
-struct w_ISteamMatchmakingServerListResponse
+struct w_ISteamMatchmakingServerListResponse_106
 {
 #ifdef __cplusplus
     virtual void ServerResponded( void *, int32_t ) = 0;
@@ -5617,7 +5623,7 @@ struct w_ISteamMatchmakingServerListResponse
 #endif /* __cplusplus */
 };
 
-struct u_ISteamMatchmakingServerListResponse
+struct u_ISteamMatchmakingServerListResponse_106
 {
 #ifdef __cplusplus
     virtual void ServerResponded( void *, int32_t ) = 0;
@@ -5626,6 +5632,24 @@ struct u_ISteamMatchmakingServerListResponse
 #endif /* __cplusplus */
 };
 
+struct w_ISteamMatchmakingServerListResponse_099u
+{
+#ifdef __cplusplus
+    virtual void ServerResponded( int32_t ) = 0;
+    virtual void ServerFailedToRespond( int32_t ) = 0;
+    virtual void RefreshComplete( uint32_t ) = 0;
+#endif /* __cplusplus */
+};
+
+struct u_ISteamMatchmakingServerListResponse_099u
+{
+#ifdef __cplusplus
+    virtual void ServerResponded( int32_t ) = 0;
+    virtual void ServerFailedToRespond( int32_t ) = 0;
+    virtual void RefreshComplete( uint32_t ) = 0;
+#endif /* __cplusplus */
+};
+
 struct w_ISteamNetworkingConnectionCustomSignaling
 {
 #ifdef __cplusplus
diff --git a/lsteamclient/steamclient_wrappers.c b/lsteamclient/steamclient_wrappers.c
deleted file mode 100644
index d3b96e77..00000000
--- a/lsteamclient/steamclient_wrappers.c
+++ /dev/null
@@ -1,307 +0,0 @@
-/* Linux-to-Windows conversions (i.e. callbacks) here. */
-#include "unix_private.h"
-
-#include "cxx.h"
-
-WINE_DEFAULT_DEBUG_CHANNEL(steamclient);
-
-#ifdef __i386__
-
-#define DEFINE_VTBL_WRAPPER(off)            \
-    __ASM_GLOBAL_FUNC(vtbl_wrapper_ ## off, \
-        "popl %eax\n\t"                     \
-        "popl %ecx\n\t"                     \
-        "pushl %eax\n\t"                    \
-        "movl 0(%ecx), %eax\n\t"            \
-        "jmp *" #off "(%eax)\n\t")
-
-DEFINE_VTBL_WRAPPER(0);
-DEFINE_VTBL_WRAPPER(4);
-DEFINE_VTBL_WRAPPER(8);
-DEFINE_VTBL_WRAPPER(12);
-DEFINE_VTBL_WRAPPER(16);
-DEFINE_VTBL_WRAPPER(20);
-DEFINE_VTBL_WRAPPER(24);
-DEFINE_VTBL_WRAPPER(28);
-DEFINE_VTBL_WRAPPER(32);
-DEFINE_VTBL_WRAPPER(36);
-DEFINE_VTBL_WRAPPER(40);
-DEFINE_VTBL_WRAPPER(44);
-DEFINE_VTBL_WRAPPER(48);
-
-#endif
-
-/***** ISteamMatchmakingServerListResponse *****/
-typedef struct winServerListResponse {
-    const vtable_ptr *vtable;
-} winServerListResponse;
-
-struct gccServerListResponse {
-    void *vtable;
-    struct winServerListResponse *win_side;
-};
-
-void gccServerListResponse_ServerResponded( struct gccServerListResponse *_this, void *hRequest, int iServer )
-{
-    TRACE("%p/%p\n", _this, _this->win_side);
-    CALL_VTBL_FUNC( _this->win_side, 0, void, (winServerListResponse *, void *, int),
-                    (_this->win_side, hRequest, iServer) );
-}
-
-void gccServerListResponse_ServerFailedToRespond( struct gccServerListResponse *_this, void *hRequest, int iServer )
-{
-    TRACE("%p/%p\n", _this, _this->win_side);
-    CALL_VTBL_FUNC( _this->win_side, 4, void, (winServerListResponse *, void *, int),
-                    (_this->win_side, hRequest, iServer) );
-}
-
-void gccServerListResponse_RefreshComplete( struct gccServerListResponse *_this, void *hRequest, uint32_t response )
-{
-    TRACE("%p/%p\n", _this, _this->win_side);
-    CALL_VTBL_FUNC( _this->win_side, 8, void, (winServerListResponse *, void *, uint32_t),
-                    (_this->win_side, hRequest, response) );
-}
-
-struct gccServerListResponseVtbl {
-    void (*ServerResponded)( struct gccServerListResponse *, void *, int );
-
-    void (*ServerFailedToRespond)( struct gccServerListResponse *, void *, int );
-
-    void (*RefreshComplete)( struct gccServerListResponse *, void *, uint32_t );
-} gccServerListResponse_vtbl = {
-    gccServerListResponse_ServerResponded,
-    gccServerListResponse_ServerFailedToRespond,
-    gccServerListResponse_RefreshComplete
-};
-
-void gccServerListResponse001_ServerResponded(struct gccServerListResponse *_this, int iServer)
-{
-    TRACE("%p/%p\n", _this, _this->win_side);
-    CALL_VTBL_FUNC(_this->win_side, 0, void, (winServerListResponse *, int), (_this->win_side, iServer));
-}
-
-void gccServerListResponse001_ServerFailedToRespond(struct gccServerListResponse *_this, int iServer)
-{
-    TRACE("%p/%p\n", _this, _this->win_side);
-    CALL_VTBL_FUNC(_this->win_side, 4, void, (winServerListResponse *, int), (_this->win_side, iServer));
-}
-
-void gccServerListResponse001_RefreshComplete( struct gccServerListResponse *_this, uint32_t response )
-{
-    TRACE("%p/%p\n", _this, _this->win_side);
-    CALL_VTBL_FUNC( _this->win_side, 8, void, (winServerListResponse *, uint32_t), (_this->win_side, response) );
-}
-
-struct gccServerListResponse001Vtbl {
-    void (*ServerResponded)(struct gccServerListResponse *, int);
-
-    void (*ServerFailedToRespond)(struct gccServerListResponse *, int);
-
-    void (*RefreshComplete)( struct gccServerListResponse *, uint32_t );
-} gccServerListResponse001_vtbl = {
-    gccServerListResponse001_ServerResponded,
-    gccServerListResponse001_ServerFailedToRespond,
-    gccServerListResponse001_RefreshComplete
-};
-
-struct u_ISteamMatchmakingServerListResponse *create_LinuxISteamMatchmakingServerListResponse( void *win, const char *version )
-{
-    struct gccServerListResponse *ret;
-
-    if (!win)
-        return NULL;
-
-    /* FIXME: When is it save to free this? CancelServerQuery? */
-    ret = (struct gccServerListResponse *)HeapAlloc(GetProcessHeap(), 0, sizeof(*ret));
-    if(!ret)
-        return NULL;
-
-    if (strcmp( version, "ISteamMatchmakingServers_SteamMatchMakingServers001" ) == 0)
-    {
-        ret->vtable = &gccServerListResponse001_vtbl;
-    }
-    else
-    {
-        ret->vtable = &gccServerListResponse_vtbl;
-    }
-    ret->win_side = (struct winServerListResponse*)win;
-
-    return (struct u_ISteamMatchmakingServerListResponse *)ret;
-}
-
-/***** ISteamMatchmakingPingResponse *****/
-typedef struct winPingResponse {
-    const vtable_ptr *vtable;
-} winPingResponse;
-
-struct gccPingResponse {
-    void *vtable;
-    struct winPingResponse *win_side;
-};
-
-struct gameserveritem_t;
-
-void gccPingResponse_ServerResponded( struct gccPingResponse *_this, struct gameserveritem_t *server )
-{
-    TRACE("%p/%p\n", _this, _this->win_side);
-    CALL_VTBL_FUNC( _this->win_side, 0, void, (winPingResponse *, struct gameserveritem_t *),
-                    (_this->win_side, server) );
-}
-
-void gccPingResponse_ServerFailedToRespond(struct gccPingResponse *_this)
-{
-    TRACE("%p/%p\n", _this, _this->win_side);
-    CALL_VTBL_FUNC(_this->win_side, 4, void, (winPingResponse *), (_this->win_side));
-}
-
-struct gccPingResponseVtbl {
-    void (*ServerResponded)( struct gccPingResponse *, struct gameserveritem_t * );
-
-    void (*ServerFailedToRespond)(struct gccPingResponse *);
-} gccPingResponse_vtbl = {
-    gccPingResponse_ServerResponded,
-    gccPingResponse_ServerFailedToRespond
-};
-
-struct u_ISteamMatchmakingPingResponse *create_LinuxISteamMatchmakingPingResponse( void *win, const char *version )
-{
-    struct gccPingResponse *ret;
-
-    if (!win)
-        return NULL;
-
-    ret = (struct gccPingResponse *)HeapAlloc(GetProcessHeap(), 0, sizeof(*ret));
-    if(!ret)
-        return NULL;
-
-    ret->vtable = &gccPingResponse_vtbl;
-    ret->win_side = (struct winPingResponse*)win;
-
-    return (struct u_ISteamMatchmakingPingResponse *)ret;
-}
-
-/***** ISteamMatchmakingPlayersResponse *****/
-typedef struct winPlayersResponse {
-    const vtable_ptr *vtable;
-} winPlayersResponse;
-
-struct gccPlayersResponse {
-    void *vtable;
-    struct winPlayersResponse *win_side;
-};
-
-void gccPlayersResponse_AddPlayerToList(struct gccPlayersResponse *_this, const char *pchName, int nScore, float flTimePlayed)
-{
-    TRACE("%p/%p\n", _this, _this->win_side);
-    CALL_VTBL_FUNC(_this->win_side, 0, void, (winPlayersResponse *, const char *, int, float), (_this->win_side, pchName, nScore, flTimePlayed));
-}
-
-void gccPlayersResponse_PlayersFailedToRespond(struct gccPlayersResponse *_this)
-{
-    TRACE("%p/%p\n", _this, _this->win_side);
-    CALL_VTBL_FUNC(_this->win_side, 4, void, (winPlayersResponse *), (_this->win_side));
-}
-
-void gccPlayersResponse_PlayersRefreshComplete(struct gccPlayersResponse *_this)
-{
-    TRACE("%p/%p\n", _this, _this->win_side);
-    CALL_VTBL_FUNC(_this->win_side, 8, void, (winPlayersResponse *), (_this->win_side));
-}
-
-struct gccPlayersResponseVtbl {
-    void (*AddPlayerToList)(struct gccPlayersResponse *, const char *, int, float);
-
-    void (*PlayersFailedToRespond)(struct gccPlayersResponse *);
-
-    void (*PlayersRefreshComplete)(struct gccPlayersResponse *);
-} gccPlayersResponse_vtbl = {
-    gccPlayersResponse_AddPlayerToList,
-    gccPlayersResponse_PlayersFailedToRespond,
-    gccPlayersResponse_PlayersRefreshComplete
-};
-
-struct u_ISteamMatchmakingPlayersResponse *create_LinuxISteamMatchmakingPlayersResponse( void *win, const char *version )
-{
-    struct gccPlayersResponse *ret;
-
-    if (!win)
-        return NULL;
-
-    ret = (struct gccPlayersResponse *)HeapAlloc(GetProcessHeap(), 0, sizeof(*ret));
-    if(!ret)
-        return NULL;
-
-    ret->vtable = &gccPlayersResponse_vtbl;
-    ret->win_side = (struct winPlayersResponse*)win;
-
-    return (struct u_ISteamMatchmakingPlayersResponse *)ret;
-}
-
-/***** ISteamMatchmakingRulesResponse *****/
-typedef struct winRulesResponse {
-    const vtable_ptr *vtable;
-} winRulesResponse;
-
-struct gccRulesResponse {
-    void *vtable;
-    struct winRulesResponse *win_side;
-};
-
-void gccRulesResponse_RulesResponded(struct gccRulesResponse *_this, const char *pchRule, const char *pchValue)
-{
-    TRACE("%p/%p\n", _this, _this->win_side);
-    CALL_VTBL_FUNC(_this->win_side, 0, void, (winRulesResponse *, const char *, const char *), (_this->win_side, pchRule, pchValue));
-}
-
-void gccRulesResponse_RulesFailedToRespond(struct gccRulesResponse *_this)
-{
-    TRACE("%p/%p\n", _this, _this->win_side);
-    CALL_VTBL_FUNC(_this->win_side, 4, void, (winRulesResponse *), (_this->win_side));
-}
-
-void gccRulesResponse_RulesRefreshComplete(struct gccRulesResponse *_this)
-{
-    TRACE("%p/%p\n", _this, _this->win_side);
-    CALL_VTBL_FUNC(_this->win_side, 8, void, (winRulesResponse *), (_this->win_side));
-}
-
-struct gccRulesResponseVtbl {
-    void (*RulesResponded)(struct gccRulesResponse *, const char *, const char*);
-
-    void (*RulesFailedToRespond)(struct gccRulesResponse *);
-
-    void (*RulesRefreshComplete)(struct gccRulesResponse *);
-} gccRulesResponse_vtbl = {
-    gccRulesResponse_RulesResponded,
-    gccRulesResponse_RulesFailedToRespond,
-    gccRulesResponse_RulesRefreshComplete
-};
-
-struct u_ISteamMatchmakingRulesResponse *create_LinuxISteamMatchmakingRulesResponse( void *win, const char *version )
-{
-    struct gccRulesResponse *ret;
-
-    if (!win)
-        return NULL;
-
-    ret = (struct gccRulesResponse *)HeapAlloc(GetProcessHeap(), 0, sizeof(*ret));
-    if(!ret)
-        return NULL;
-
-    ret->vtable = &gccRulesResponse_vtbl;
-    ret->win_side = (struct winRulesResponse*)win;
-
-    return (struct u_ISteamMatchmakingRulesResponse *)ret;
-}
-
-struct u_ISteamNetworkingConnectionCustomSignaling *create_LinuxISteamNetworkingConnectionCustomSignaling( void *win, const char *version )
-{
-    FIXME( "not implemented!\n" );
-    return NULL;
-}
-
-struct u_ISteamNetworkingCustomSignalingRecvContext *create_LinuxISteamNetworkingCustomSignalingRecvContext( void *win, const char *version )
-{
-    FIXME( "not implemented!\n" );
-    return NULL;
-}
diff --git a/lsteamclient/unix_private.h b/lsteamclient/unix_private.h
index 60153974..9273650f 100644
--- a/lsteamclient/unix_private.h
+++ b/lsteamclient/unix_private.h
@@ -18,12 +18,10 @@ extern "C"
 {
 #endif /* __cplusplus */
 
-extern struct u_ISteamMatchmakingServerListResponse *create_LinuxISteamMatchmakingServerListResponse( void *win, const char *version ) DECLSPEC_HIDDEN;
-extern struct u_ISteamMatchmakingPingResponse *create_LinuxISteamMatchmakingPingResponse( void *win, const char *version ) DECLSPEC_HIDDEN;
-extern struct u_ISteamMatchmakingPlayersResponse *create_LinuxISteamMatchmakingPlayersResponse( void *win, const char *version ) DECLSPEC_HIDDEN;
-extern struct u_ISteamMatchmakingRulesResponse *create_LinuxISteamMatchmakingRulesResponse( void *win, const char *version ) DECLSPEC_HIDDEN;
-extern struct u_ISteamNetworkingConnectionCustomSignaling *create_LinuxISteamNetworkingConnectionCustomSignaling(void *win, const char *version) DECLSPEC_HIDDEN;
-extern struct u_ISteamNetworkingCustomSignalingRecvContext *create_LinuxISteamNetworkingCustomSignalingRecvContext(void *win, const char *version) DECLSPEC_HIDDEN;
+struct w_steam_iface;
+extern void queue_vtable_callback( struct w_steam_iface *w_iface, enum callback_type type, uint64_t arg0, uint64_t arg1, uint64_t arg2 );
+extern void queue_vtable_callback_0_add_player_to_list( struct w_steam_iface *w_iface, const char *pchName, int nScore, float flTimePlayed );
+extern void queue_vtable_callback_0_rules_responded( struct w_steam_iface *w_iface, const char *pchRule, const char *pchValue );
 
 extern uint32_t manual_convert_nNativeKeyCode( uint32_t win_vk );
 
diff --git a/lsteamclient/unix_private_generated.h b/lsteamclient/unix_private_generated.h
index b199c936..b76b36d1 100644
--- a/lsteamclient/unix_private_generated.h
+++ b/lsteamclient/unix_private_generated.h
@@ -147,12 +147,12 @@ struct u_ISteamMatchmaking_SteamMatchMaking001
 struct u_ISteamMatchmakingServers_SteamMatchMakingServers001
 {
 #ifdef __cplusplus
-    virtual void RequestInternetServerList( uint32_t, MatchMakingKeyValuePair_t **, uint32_t, u_ISteamMatchmakingServerListResponse * ) = 0;
-    virtual void RequestLANServerList( uint32_t, u_ISteamMatchmakingServerListResponse * ) = 0;
-    virtual void RequestFriendsServerList( uint32_t, MatchMakingKeyValuePair_t **, uint32_t, u_ISteamMatchmakingServerListResponse * ) = 0;
-    virtual void RequestFavoritesServerList( uint32_t, MatchMakingKeyValuePair_t **, uint32_t, u_ISteamMatchmakingServerListResponse * ) = 0;
-    virtual void RequestHistoryServerList( uint32_t, MatchMakingKeyValuePair_t **, uint32_t, u_ISteamMatchmakingServerListResponse * ) = 0;
-    virtual void RequestSpectatorServerList( uint32_t, MatchMakingKeyValuePair_t **, uint32_t, u_ISteamMatchmakingServerListResponse * ) = 0;
+    virtual void RequestInternetServerList( uint32_t, MatchMakingKeyValuePair_t **, uint32_t, u_ISteamMatchmakingServerListResponse_099u * ) = 0;
+    virtual void RequestLANServerList( uint32_t, u_ISteamMatchmakingServerListResponse_099u * ) = 0;
+    virtual void RequestFriendsServerList( uint32_t, MatchMakingKeyValuePair_t **, uint32_t, u_ISteamMatchmakingServerListResponse_099u * ) = 0;
+    virtual void RequestFavoritesServerList( uint32_t, MatchMakingKeyValuePair_t **, uint32_t, u_ISteamMatchmakingServerListResponse_099u * ) = 0;
+    virtual void RequestHistoryServerList( uint32_t, MatchMakingKeyValuePair_t **, uint32_t, u_ISteamMatchmakingServerListResponse_099u * ) = 0;
+    virtual void RequestSpectatorServerList( uint32_t, MatchMakingKeyValuePair_t **, uint32_t, u_ISteamMatchmakingServerListResponse_099u * ) = 0;
     virtual gameserveritem_t_105 * GetServerDetails( uint32_t, int32_t ) = 0;
     virtual void CancelQuery( uint32_t ) = 0;
     virtual void RefreshQuery( uint32_t ) = 0;
@@ -1196,12 +1196,12 @@ struct u_ISteamUser_SteamUser013
 struct u_ISteamMatchmakingServers_SteamMatchMakingServers002
 {
 #ifdef __cplusplus
-    virtual void * RequestInternetServerList( uint32_t, MatchMakingKeyValuePair_t **, uint32_t, u_ISteamMatchmakingServerListResponse * ) = 0;
-    virtual void * RequestLANServerList( uint32_t, u_ISteamMatchmakingServerListResponse * ) = 0;
-    virtual void * RequestFriendsServerList( uint32_t, MatchMakingKeyValuePair_t **, uint32_t, u_ISteamMatchmakingServerListResponse * ) = 0;
-    virtual void * RequestFavoritesServerList( uint32_t, MatchMakingKeyValuePair_t **, uint32_t, u_ISteamMatchmakingServerListResponse * ) = 0;
-    virtual void * RequestHistoryServerList( uint32_t, MatchMakingKeyValuePair_t **, uint32_t, u_ISteamMatchmakingServerListResponse * ) = 0;
-    virtual void * RequestSpectatorServerList( uint32_t, MatchMakingKeyValuePair_t **, uint32_t, u_ISteamMatchmakingServerListResponse * ) = 0;
+    virtual void * RequestInternetServerList( uint32_t, MatchMakingKeyValuePair_t **, uint32_t, u_ISteamMatchmakingServerListResponse_106 * ) = 0;
+    virtual void * RequestLANServerList( uint32_t, u_ISteamMatchmakingServerListResponse_106 * ) = 0;
+    virtual void * RequestFriendsServerList( uint32_t, MatchMakingKeyValuePair_t **, uint32_t, u_ISteamMatchmakingServerListResponse_106 * ) = 0;
+    virtual void * RequestFavoritesServerList( uint32_t, MatchMakingKeyValuePair_t **, uint32_t, u_ISteamMatchmakingServerListResponse_106 * ) = 0;
+    virtual void * RequestHistoryServerList( uint32_t, MatchMakingKeyValuePair_t **, uint32_t, u_ISteamMatchmakingServerListResponse_106 * ) = 0;
+    virtual void * RequestSpectatorServerList( uint32_t, MatchMakingKeyValuePair_t **, uint32_t, u_ISteamMatchmakingServerListResponse_106 * ) = 0;
     virtual void ReleaseRequest( void * ) = 0;
     virtual gameserveritem_t_105 * GetServerDetails( void *, int32_t ) = 0;
     virtual void CancelQuery( void * ) = 0;
diff --git a/lsteamclient/unix_steam_networking_manual.cpp b/lsteamclient/unix_steam_networking_manual.cpp
index 9a75482f..7dfc785c 100644
--- a/lsteamclient/unix_steam_networking_manual.cpp
+++ b/lsteamclient/unix_steam_networking_manual.cpp
@@ -2,6 +2,8 @@
 
 #include <stdlib.h>
 
+WINE_DEFAULT_DEBUG_CHANNEL(steamclient);
+
 static void receive_messages_utow_144( uint32_t count, u_SteamNetworkingMessage_t_144 **u_msgs,
                                        w_SteamNetworkingMessage_t_144 **w_msgs )
 {
@@ -606,3 +608,379 @@ NTSTATUS ISteamNetworkingUtils_SteamNetworkingUtils004_SetConfigValue( void *arg
 
     return 0;
 }
+
+struct SteamMatchmakingServerListResponse_099u : u_ISteamMatchmakingServerListResponse_099u
+{
+    struct w_steam_iface *w_iface;
+    virtual void ServerResponded( int32_t );
+    virtual void ServerFailedToRespond( int32_t );
+    virtual void RefreshComplete( uint32_t );
+};
+
+void SteamMatchmakingServerListResponse_099u::ServerResponded( int32_t iServer )
+{
+    queue_vtable_callback( this->w_iface, CALL_IFACE_VTABLE_0, (intptr_t)iServer, 0, 0 );
+}
+
+void SteamMatchmakingServerListResponse_099u::ServerFailedToRespond( int32_t iServer )
+{
+    queue_vtable_callback( this->w_iface, CALL_IFACE_VTABLE_1, (intptr_t)iServer, 0, 0 );
+}
+
+void SteamMatchmakingServerListResponse_099u::RefreshComplete( uint32_t response )
+{
+    queue_vtable_callback( this->w_iface, CALL_IFACE_VTABLE_2, (intptr_t)response, 0, 0 );
+}
+
+u_ISteamMatchmakingServerListResponse_099u *create_LinuxISteamMatchmakingServerListResponse_099u( void *win )
+{
+    SteamMatchmakingServerListResponse_099u *ret;
+
+    if (!win) return NULL;
+
+    if (!(ret = new SteamMatchmakingServerListResponse_099u())) return NULL;
+    ret->w_iface = (struct w_steam_iface *)win;
+
+    return ret;
+}
+
+struct SteamMatchmakingServerListResponse_106 : u_ISteamMatchmakingServerListResponse_106
+{
+    struct w_steam_iface *w_iface;
+    virtual void ServerResponded( void *, int32_t );
+    virtual void ServerFailedToRespond( void *, int32_t );
+    virtual void RefreshComplete( void *, uint32_t );
+};
+
+void SteamMatchmakingServerListResponse_106::ServerResponded( void *hRequest, int32_t iServer )
+{
+    queue_vtable_callback( this->w_iface, CALL_IFACE_VTABLE_0, (intptr_t)hRequest, (intptr_t)iServer, 0 );
+}
+
+void SteamMatchmakingServerListResponse_106::ServerFailedToRespond( void *hRequest, int32_t iServer )
+{
+    queue_vtable_callback( this->w_iface, CALL_IFACE_VTABLE_1, (intptr_t)hRequest, (intptr_t)iServer, 0 );
+}
+
+void SteamMatchmakingServerListResponse_106::RefreshComplete( void *hRequest, uint32_t response )
+{
+    queue_vtable_callback( this->w_iface, CALL_IFACE_VTABLE_2, (intptr_t)hRequest, (intptr_t)response, 0 );
+}
+
+u_ISteamMatchmakingServerListResponse_106 *create_LinuxISteamMatchmakingServerListResponse_106( void *win )
+{
+    SteamMatchmakingServerListResponse_106 *ret;
+
+    if (!win) return NULL;
+
+    if (!(ret = new SteamMatchmakingServerListResponse_106())) return NULL;
+    ret->w_iface = (struct w_steam_iface *)win;
+
+    return ret;
+}
+
+struct SteamMatchmakingPingResponse : u_ISteamMatchmakingPingResponse
+{
+    struct w_steam_iface *w_iface;
+    virtual void ServerResponded( gameserveritem_t_105 * );
+    virtual void ServerFailedToRespond(  );
+};
+
+void SteamMatchmakingPingResponse::ServerResponded( gameserveritem_t_105 *server )
+{
+    queue_vtable_callback( this->w_iface, CALL_IFACE_VTABLE_0, (intptr_t)server, 0, 0 );
+}
+
+void SteamMatchmakingPingResponse::ServerFailedToRespond(void)
+{
+    queue_vtable_callback( this->w_iface, CALL_IFACE_VTABLE_1, 0, 0, 0 );
+}
+
+struct u_ISteamMatchmakingPingResponse *create_LinuxISteamMatchmakingPingResponse( void *win )
+{
+    SteamMatchmakingPingResponse *ret;
+
+    if (!win) return NULL;
+    if (!(ret = new SteamMatchmakingPingResponse())) return NULL;
+    ret->w_iface = (struct w_steam_iface *)win;
+
+    return ret;
+}
+
+struct SteamMatchmakingPlayersResponse : u_ISteamMatchmakingPlayersResponse
+{
+    struct w_steam_iface *w_iface;
+    virtual void AddPlayerToList( const char *, int32_t, float );
+    virtual void PlayersFailedToRespond(  );
+    virtual void PlayersRefreshComplete(  );
+};
+
+void SteamMatchmakingPlayersResponse::AddPlayerToList(const char *pchName, int nScore, float flTimePlayed)
+{
+    queue_vtable_callback_0_add_player_to_list( this->w_iface, pchName, nScore, flTimePlayed );
+}
+
+void SteamMatchmakingPlayersResponse::PlayersFailedToRespond(void)
+{
+    queue_vtable_callback( this->w_iface, CALL_IFACE_VTABLE_1, 0, 0, 0 );
+}
+
+void SteamMatchmakingPlayersResponse::PlayersRefreshComplete(void)
+{
+    queue_vtable_callback( this->w_iface, CALL_IFACE_VTABLE_2, 0, 0, 0 );
+}
+
+struct u_ISteamMatchmakingPlayersResponse *create_LinuxISteamMatchmakingPlayersResponse( void *win )
+{
+    struct SteamMatchmakingPlayersResponse *ret;
+
+    if (!win) return NULL;
+    if (!(ret = new SteamMatchmakingPlayersResponse())) return NULL;
+    ret->w_iface = (struct w_steam_iface *)win;
+
+    return ret;
+}
+
+struct SteamMatchmakingRulesResponse : u_ISteamMatchmakingRulesResponse
+{
+    struct w_steam_iface *w_iface;
+    virtual void RulesResponded( const char *, const char * );
+    virtual void RulesFailedToRespond(  );
+    virtual void RulesRefreshComplete(  );
+};
+
+void SteamMatchmakingRulesResponse::RulesResponded(const char *pchRule, const char *pchValue)
+{
+    queue_vtable_callback_0_rules_responded( this->w_iface, pchRule, pchValue );
+}
+
+void SteamMatchmakingRulesResponse::RulesFailedToRespond(void)
+{
+    queue_vtable_callback( this->w_iface, CALL_IFACE_VTABLE_1, 0, 0, 0 );
+}
+
+void SteamMatchmakingRulesResponse::RulesRefreshComplete(void)
+{
+    queue_vtable_callback( this->w_iface, CALL_IFACE_VTABLE_2, 0, 0, 0 );
+}
+
+struct u_ISteamMatchmakingRulesResponse *create_LinuxISteamMatchmakingRulesResponse( void *win )
+{
+    SteamMatchmakingRulesResponse *ret;
+
+    if (!win) return NULL;
+    if (!(ret = new SteamMatchmakingRulesResponse())) return NULL;
+    ret->w_iface = (struct w_steam_iface *)win;
+
+    return ret;
+}
+
+struct u_ISteamNetworkingConnectionCustomSignaling *create_LinuxISteamNetworkingConnectionCustomSignaling( void *win )
+{
+    FIXME( "not implemented!\n" );
+    return NULL;
+}
+
+struct u_ISteamNetworkingCustomSignalingRecvContext *create_LinuxISteamNetworkingCustomSignalingRecvContext( void *win )
+{
+    FIXME( "not implemented!\n" );
+    return NULL;
+}
+
+NTSTATUS ISteamMatchmakingServers_SteamMatchMakingServers001_RequestInternetServerList( void *args )
+{
+    struct ISteamMatchmakingServers_SteamMatchMakingServers001_RequestInternetServerList_params *params = (struct ISteamMatchmakingServers_SteamMatchMakingServers001_RequestInternetServerList_params *)args;
+    struct u_ISteamMatchmakingServers_SteamMatchMakingServers001 *iface = (struct u_ISteamMatchmakingServers_SteamMatchMakingServers001 *)params->linux_side;
+    u_ISteamMatchmakingServerListResponse_099u *u_pRequestServersResponse = create_LinuxISteamMatchmakingServerListResponse_099u( params->pRequestServersResponse );
+    iface->RequestInternetServerList( params->iApp, params->ppchFilters, params->nFilters, u_pRequestServersResponse );
+    return 0;
+}
+
+NTSTATUS ISteamMatchmakingServers_SteamMatchMakingServers001_RequestLANServerList( void *args )
+{
+    struct ISteamMatchmakingServers_SteamMatchMakingServers001_RequestLANServerList_params *params = (struct ISteamMatchmakingServers_SteamMatchMakingServers001_RequestLANServerList_params *)args;
+    struct u_ISteamMatchmakingServers_SteamMatchMakingServers001 *iface = (struct u_ISteamMatchmakingServers_SteamMatchMakingServers001 *)params->linux_side;
+    u_ISteamMatchmakingServerListResponse_099u *u_pRequestServersResponse = create_LinuxISteamMatchmakingServerListResponse_099u( params->pRequestServersResponse );
+    iface->RequestLANServerList( params->iApp, u_pRequestServersResponse );
+    return 0;
+}
+
+NTSTATUS ISteamMatchmakingServers_SteamMatchMakingServers001_RequestFriendsServerList( void *args )
+{
+    struct ISteamMatchmakingServers_SteamMatchMakingServers001_RequestFriendsServerList_params *params = (struct ISteamMatchmakingServers_SteamMatchMakingServers001_RequestFriendsServerList_params *)args;
+    struct u_ISteamMatchmakingServers_SteamMatchMakingServers001 *iface = (struct u_ISteamMatchmakingServers_SteamMatchMakingServers001 *)params->linux_side;
+    u_ISteamMatchmakingServerListResponse_099u *u_pRequestServersResponse = create_LinuxISteamMatchmakingServerListResponse_099u( params->pRequestServersResponse );
+    iface->RequestFriendsServerList( params->iApp, params->ppchFilters, params->nFilters, u_pRequestServersResponse );
+    return 0;
+}
+
+NTSTATUS ISteamMatchmakingServers_SteamMatchMakingServers001_RequestFavoritesServerList( void *args )
+{
+    struct ISteamMatchmakingServers_SteamMatchMakingServers001_RequestFavoritesServerList_params *params = (struct ISteamMatchmakingServers_SteamMatchMakingServers001_RequestFavoritesServerList_params *)args;
+    struct u_ISteamMatchmakingServers_SteamMatchMakingServers001 *iface = (struct u_ISteamMatchmakingServers_SteamMatchMakingServers001 *)params->linux_side;
+    u_ISteamMatchmakingServerListResponse_099u *u_pRequestServersResponse = create_LinuxISteamMatchmakingServerListResponse_099u( params->pRequestServersResponse );
+    iface->RequestFavoritesServerList( params->iApp, params->ppchFilters, params->nFilters, u_pRequestServersResponse );
+    return 0;
+}
+
+NTSTATUS ISteamMatchmakingServers_SteamMatchMakingServers001_RequestHistoryServerList( void *args )
+{
+    struct ISteamMatchmakingServers_SteamMatchMakingServers001_RequestHistoryServerList_params *params = (struct ISteamMatchmakingServers_SteamMatchMakingServers001_RequestHistoryServerList_params *)args;
+    struct u_ISteamMatchmakingServers_SteamMatchMakingServers001 *iface = (struct u_ISteamMatchmakingServers_SteamMatchMakingServers001 *)params->linux_side;
+    u_ISteamMatchmakingServerListResponse_099u *u_pRequestServersResponse = create_LinuxISteamMatchmakingServerListResponse_099u( params->pRequestServersResponse );
+    iface->RequestHistoryServerList( params->iApp, params->ppchFilters, params->nFilters, u_pRequestServersResponse );
+    return 0;
+}
+
+NTSTATUS ISteamMatchmakingServers_SteamMatchMakingServers001_RequestSpectatorServerList( void *args )
+{
+    struct ISteamMatchmakingServers_SteamMatchMakingServers001_RequestSpectatorServerList_params *params = (struct ISteamMatchmakingServers_SteamMatchMakingServers001_RequestSpectatorServerList_params *)args;
+    struct u_ISteamMatchmakingServers_SteamMatchMakingServers001 *iface = (struct u_ISteamMatchmakingServers_SteamMatchMakingServers001 *)params->linux_side;
+    u_ISteamMatchmakingServerListResponse_099u *u_pRequestServersResponse = create_LinuxISteamMatchmakingServerListResponse_099u( params->pRequestServersResponse );
+    iface->RequestSpectatorServerList( params->iApp, params->ppchFilters, params->nFilters, u_pRequestServersResponse );
+    return 0;
+}
+
+NTSTATUS ISteamMatchmakingServers_SteamMatchMakingServers001_PingServer( void *args )
+{
+    struct ISteamMatchmakingServers_SteamMatchMakingServers001_PingServer_params *params = (struct ISteamMatchmakingServers_SteamMatchMakingServers001_PingServer_params *)args;
+    struct u_ISteamMatchmakingServers_SteamMatchMakingServers001 *iface = (struct u_ISteamMatchmakingServers_SteamMatchMakingServers001 *)params->linux_side;
+    u_ISteamMatchmakingPingResponse *u_pRequestServersResponse = create_LinuxISteamMatchmakingPingResponse( params->pRequestServersResponse );
+    params->_ret = iface->PingServer( params->unIP, params->usPort, u_pRequestServersResponse );
+    return 0;
+}
+
+NTSTATUS ISteamMatchmakingServers_SteamMatchMakingServers001_PlayerDetails( void *args )
+{
+    struct ISteamMatchmakingServers_SteamMatchMakingServers001_PlayerDetails_params *params = (struct ISteamMatchmakingServers_SteamMatchMakingServers001_PlayerDetails_params *)args;
+    struct u_ISteamMatchmakingServers_SteamMatchMakingServers001 *iface = (struct u_ISteamMatchmakingServers_SteamMatchMakingServers001 *)params->linux_side;
+    u_ISteamMatchmakingPlayersResponse *u_pRequestServersResponse = create_LinuxISteamMatchmakingPlayersResponse( params->pRequestServersResponse );
+    params->_ret = iface->PlayerDetails( params->unIP, params->usPort, u_pRequestServersResponse );
+    return 0;
+}
+
+NTSTATUS ISteamMatchmakingServers_SteamMatchMakingServers001_ServerRules( void *args )
+{
+    struct ISteamMatchmakingServers_SteamMatchMakingServers001_ServerRules_params *params = (struct ISteamMatchmakingServers_SteamMatchMakingServers001_ServerRules_params *)args;
+    struct u_ISteamMatchmakingServers_SteamMatchMakingServers001 *iface = (struct u_ISteamMatchmakingServers_SteamMatchMakingServers001 *)params->linux_side;
+    u_ISteamMatchmakingRulesResponse *u_pRequestServersResponse = create_LinuxISteamMatchmakingRulesResponse( params->pRequestServersResponse );
+    params->_ret = iface->ServerRules( params->unIP, params->usPort, u_pRequestServersResponse );
+    return 0;
+}
+
+NTSTATUS ISteamMatchmakingServers_SteamMatchMakingServers002_RequestInternetServerList( void *args )
+{
+    struct ISteamMatchmakingServers_SteamMatchMakingServers002_RequestInternetServerList_params *params = (struct ISteamMatchmakingServers_SteamMatchMakingServers002_RequestInternetServerList_params *)args;
+    struct u_ISteamMatchmakingServers_SteamMatchMakingServers002 *iface = (struct u_ISteamMatchmakingServers_SteamMatchMakingServers002 *)params->linux_side;
+    u_ISteamMatchmakingServerListResponse_106 *u_pRequestServersResponse = create_LinuxISteamMatchmakingServerListResponse_106( params->pRequestServersResponse );
+    params->_ret = iface->RequestInternetServerList( params->iApp, params->ppchFilters, params->nFilters, u_pRequestServersResponse );
+    return 0;
+}
+
+NTSTATUS ISteamMatchmakingServers_SteamMatchMakingServers002_RequestLANServerList( void *args )
+{
+    struct ISteamMatchmakingServers_SteamMatchMakingServers002_RequestLANServerList_params *params = (struct ISteamMatchmakingServers_SteamMatchMakingServers002_RequestLANServerList_params *)args;
+    struct u_ISteamMatchmakingServers_SteamMatchMakingServers002 *iface = (struct u_ISteamMatchmakingServers_SteamMatchMakingServers002 *)params->linux_side;
+    u_ISteamMatchmakingServerListResponse_106 *u_pRequestServersResponse = create_LinuxISteamMatchmakingServerListResponse_106( params->pRequestServersResponse );
+    params->_ret = iface->RequestLANServerList( params->iApp, u_pRequestServersResponse );
+    return 0;
+}
+
+NTSTATUS ISteamMatchmakingServers_SteamMatchMakingServers002_RequestFriendsServerList( void *args )
+{
+    struct ISteamMatchmakingServers_SteamMatchMakingServers002_RequestFriendsServerList_params *params = (struct ISteamMatchmakingServers_SteamMatchMakingServers002_RequestFriendsServerList_params *)args;
+    struct u_ISteamMatchmakingServers_SteamMatchMakingServers002 *iface = (struct u_ISteamMatchmakingServers_SteamMatchMakingServers002 *)params->linux_side;
+    u_ISteamMatchmakingServerListResponse_106 *u_pRequestServersResponse = create_LinuxISteamMatchmakingServerListResponse_106( params->pRequestServersResponse );
+    params->_ret = iface->RequestFriendsServerList( params->iApp, params->ppchFilters, params->nFilters, u_pRequestServersResponse );
+    return 0;
+}
+
+NTSTATUS ISteamMatchmakingServers_SteamMatchMakingServers002_RequestFavoritesServerList( void *args )
+{
+    struct ISteamMatchmakingServers_SteamMatchMakingServers002_RequestFavoritesServerList_params *params = (struct ISteamMatchmakingServers_SteamMatchMakingServers002_RequestFavoritesServerList_params *)args;
+    struct u_ISteamMatchmakingServers_SteamMatchMakingServers002 *iface = (struct u_ISteamMatchmakingServers_SteamMatchMakingServers002 *)params->linux_side;
+    u_ISteamMatchmakingServerListResponse_106 *u_pRequestServersResponse = create_LinuxISteamMatchmakingServerListResponse_106( params->pRequestServersResponse );
+    params->_ret = iface->RequestFavoritesServerList( params->iApp, params->ppchFilters, params->nFilters, u_pRequestServersResponse );
+    return 0;
+}
+
+NTSTATUS ISteamMatchmakingServers_SteamMatchMakingServers002_RequestHistoryServerList( void *args )
+{
+    struct ISteamMatchmakingServers_SteamMatchMakingServers002_RequestHistoryServerList_params *params = (struct ISteamMatchmakingServers_SteamMatchMakingServers002_RequestHistoryServerList_params *)args;
+    struct u_ISteamMatchmakingServers_SteamMatchMakingServers002 *iface = (struct u_ISteamMatchmakingServers_SteamMatchMakingServers002 *)params->linux_side;
+    u_ISteamMatchmakingServerListResponse_106 *u_pRequestServersResponse = create_LinuxISteamMatchmakingServerListResponse_106( params->pRequestServersResponse );
+    params->_ret = iface->RequestHistoryServerList( params->iApp, params->ppchFilters, params->nFilters, u_pRequestServersResponse );
+    return 0;
+}
+
+NTSTATUS ISteamMatchmakingServers_SteamMatchMakingServers002_RequestSpectatorServerList( void *args )
+{
+    struct ISteamMatchmakingServers_SteamMatchMakingServers002_RequestSpectatorServerList_params *params = (struct ISteamMatchmakingServers_SteamMatchMakingServers002_RequestSpectatorServerList_params *)args;
+    struct u_ISteamMatchmakingServers_SteamMatchMakingServers002 *iface = (struct u_ISteamMatchmakingServers_SteamMatchMakingServers002 *)params->linux_side;
+    u_ISteamMatchmakingServerListResponse_106 *u_pRequestServersResponse = create_LinuxISteamMatchmakingServerListResponse_106( params->pRequestServersResponse );
+    params->_ret = iface->RequestSpectatorServerList( params->iApp, params->ppchFilters, params->nFilters, u_pRequestServersResponse );
+    return 0;
+}
+
+NTSTATUS ISteamMatchmakingServers_SteamMatchMakingServers002_PingServer( void *args )
+{
+    struct ISteamMatchmakingServers_SteamMatchMakingServers002_PingServer_params *params = (struct ISteamMatchmakingServers_SteamMatchMakingServers002_PingServer_params *)args;
+    struct u_ISteamMatchmakingServers_SteamMatchMakingServers002 *iface = (struct u_ISteamMatchmakingServers_SteamMatchMakingServers002 *)params->linux_side;
+    u_ISteamMatchmakingPingResponse *u_pRequestServersResponse = create_LinuxISteamMatchmakingPingResponse( params->pRequestServersResponse );
+    params->_ret = iface->PingServer( params->unIP, params->usPort, u_pRequestServersResponse );
+    return 0;
+}
+
+NTSTATUS ISteamMatchmakingServers_SteamMatchMakingServers002_PlayerDetails( void *args )
+{
+    struct ISteamMatchmakingServers_SteamMatchMakingServers002_PlayerDetails_params *params = (struct ISteamMatchmakingServers_SteamMatchMakingServers002_PlayerDetails_params *)args;
+    struct u_ISteamMatchmakingServers_SteamMatchMakingServers002 *iface = (struct u_ISteamMatchmakingServers_SteamMatchMakingServers002 *)params->linux_side;
+    u_ISteamMatchmakingPlayersResponse *u_pRequestServersResponse = create_LinuxISteamMatchmakingPlayersResponse( params->pRequestServersResponse );
+    params->_ret = iface->PlayerDetails( params->unIP, params->usPort, u_pRequestServersResponse );
+    return 0;
+}
+
+NTSTATUS ISteamMatchmakingServers_SteamMatchMakingServers002_ServerRules( void *args )
+{
+    struct ISteamMatchmakingServers_SteamMatchMakingServers002_ServerRules_params *params = (struct ISteamMatchmakingServers_SteamMatchMakingServers002_ServerRules_params *)args;
+    struct u_ISteamMatchmakingServers_SteamMatchMakingServers002 *iface = (struct u_ISteamMatchmakingServers_SteamMatchMakingServers002 *)params->linux_side;
+    u_ISteamMatchmakingRulesResponse *u_pRequestServersResponse = create_LinuxISteamMatchmakingRulesResponse( params->pRequestServersResponse );
+    params->_ret = iface->ServerRules( params->unIP, params->usPort, u_pRequestServersResponse );
+    return 0;
+}
+
+NTSTATUS ISteamNetworkingSockets_SteamNetworkingSockets006_ConnectP2PCustomSignaling( void *args )
+{
+    struct ISteamNetworkingSockets_SteamNetworkingSockets006_ConnectP2PCustomSignaling_params *params = (struct ISteamNetworkingSockets_SteamNetworkingSockets006_ConnectP2PCustomSignaling_params *)args;
+    struct u_ISteamNetworkingSockets_SteamNetworkingSockets006 *iface = (struct u_ISteamNetworkingSockets_SteamNetworkingSockets006 *)params->linux_side;
+    u_ISteamNetworkingConnectionCustomSignaling *u_pSignaling = create_LinuxISteamNetworkingConnectionCustomSignaling( params->pSignaling );
+    params->_ret = iface->ConnectP2PCustomSignaling( u_pSignaling, params->pPeerIdentity, params->nOptions, params->pOptions );
+    return 0;
+}
+
+NTSTATUS ISteamNetworkingSockets_SteamNetworkingSockets006_ReceivedP2PCustomSignal( void *args )
+{
+    struct ISteamNetworkingSockets_SteamNetworkingSockets006_ReceivedP2PCustomSignal_params *params = (struct ISteamNetworkingSockets_SteamNetworkingSockets006_ReceivedP2PCustomSignal_params *)args;
+    struct u_ISteamNetworkingSockets_SteamNetworkingSockets006 *iface = (struct u_ISteamNetworkingSockets_SteamNetworkingSockets006 *)params->linux_side;
+    u_ISteamNetworkingCustomSignalingRecvContext *u_pContext = create_LinuxISteamNetworkingCustomSignalingRecvContext( params->pContext );
+    params->_ret = iface->ReceivedP2PCustomSignal( params->pMsg, params->cbMsg, u_pContext );
+    return 0;
+}
+
+NTSTATUS ISteamNetworkingSockets_SteamNetworkingSockets008_ConnectP2PCustomSignaling( void *args )
+{
+    struct ISteamNetworkingSockets_SteamNetworkingSockets008_ConnectP2PCustomSignaling_params *params = (struct ISteamNetworkingSockets_SteamNetworkingSockets008_ConnectP2PCustomSignaling_params *)args;
+    struct u_ISteamNetworkingSockets_SteamNetworkingSockets008 *iface = (struct u_ISteamNetworkingSockets_SteamNetworkingSockets008 *)params->linux_side;
+    u_ISteamNetworkingConnectionCustomSignaling *u_pSignaling = create_LinuxISteamNetworkingConnectionCustomSignaling( params->pSignaling );
+    params->_ret = iface->ConnectP2PCustomSignaling( u_pSignaling, params->pPeerIdentity, params->nOptions, params->pOptions );
+    return 0;
+}
+
+NTSTATUS ISteamNetworkingSockets_SteamNetworkingSockets008_ReceivedP2PCustomSignal( void *args )
+{
+    struct ISteamNetworkingSockets_SteamNetworkingSockets008_ReceivedP2PCustomSignal_params *params = (struct ISteamNetworkingSockets_SteamNetworkingSockets008_ReceivedP2PCustomSignal_params *)args;
+    struct u_ISteamNetworkingSockets_SteamNetworkingSockets008 *iface = (struct u_ISteamNetworkingSockets_SteamNetworkingSockets008 *)params->linux_side;
+    u_ISteamNetworkingCustomSignalingRecvContext *u_pContext = create_LinuxISteamNetworkingCustomSignalingRecvContext( params->pContext );
+    params->_ret = iface->ReceivedP2PCustomSignal( params->pMsg, params->cbMsg, u_pContext );
+    return 0;
+}
diff --git a/lsteamclient/unixlib.cpp b/lsteamclient/unixlib.cpp
index 974e6065..36b1ab23 100644
--- a/lsteamclient/unixlib.cpp
+++ b/lsteamclient/unixlib.cpp
@@ -16,6 +16,71 @@ struct callback_entry
 static struct list callbacks = LIST_INIT( callbacks );
 static pthread_mutex_t callbacks_lock = PTHREAD_MUTEX_INITIALIZER;
 
+extern void queue_vtable_callback( struct w_steam_iface *w_iface, enum callback_type type, uint64_t arg0, uint64_t arg1, uint64_t arg2 )
+{
+    struct callback_entry *entry;
+    uint32_t size = 0;
+
+    size += sizeof(struct callback_entry);
+    if (!(entry = (struct callback_entry *)malloc( size ))) return;
+
+    entry->callback.type = type;
+    size -= offsetof( struct callback_entry, callback );
+    entry->callback.size = size;
+
+    entry->callback.call_iface_vtable.iface = w_iface;
+    entry->callback.call_iface_vtable.arg0 = arg0;
+    entry->callback.call_iface_vtable.arg1 = arg1;
+    entry->callback.call_iface_vtable.arg2 = arg2;
+
+    pthread_mutex_lock( &callbacks_lock );
+    list_add_tail( &callbacks, &entry->entry );
+    pthread_mutex_unlock( &callbacks_lock );
+}
+
+extern void queue_vtable_callback_0_add_player_to_list( struct w_steam_iface *w_iface, const char *pchName, int nScore, float flTimePlayed )
+{
+    uint32_t name_size = strlen( pchName ) + 1, size = name_size;
+    struct callback_entry *entry;
+
+    size += sizeof(struct callback_entry);
+    if (!(entry = (struct callback_entry *)malloc( size ))) return;
+
+    entry->callback.type = CALL_IFACE_VTABLE_0_ADD_PLAYER_TO_LIST;
+    size -= offsetof( struct callback_entry, callback );
+    entry->callback.size = size;
+
+    entry->callback.add_player_to_list.iface = w_iface;
+    entry->callback.add_player_to_list.score = nScore;
+    entry->callback.add_player_to_list.time_played = flTimePlayed;
+    memcpy( (char *)entry->callback.add_player_to_list.name, pchName, name_size );
+
+    pthread_mutex_lock( &callbacks_lock );
+    list_add_tail( &callbacks, &entry->entry );
+    pthread_mutex_unlock( &callbacks_lock );
+}
+
+extern void queue_vtable_callback_0_rules_responded( struct w_steam_iface *w_iface, const char *pchRule, const char *pchValue )
+{
+    uint32_t rule_size = strlen( pchRule ) + 1, value_size = strlen( pchValue ) + 1, size = rule_size + value_size;
+    struct callback_entry *entry;
+
+    size += sizeof(struct callback_entry);
+    if (!(entry = (struct callback_entry *)malloc( size ))) return;
+
+    entry->callback.type = CALL_IFACE_VTABLE_0_RULES_RESPONDED;
+    size -= offsetof( struct callback_entry, callback );
+    entry->callback.size = size;
+
+    entry->callback.rules_responded.iface = w_iface;
+    memcpy( (char *)entry->callback.rules_responded.rule_and_value, pchRule, rule_size );
+    memcpy( (char *)entry->callback.rules_responded.rule_and_value + rule_size, pchValue, value_size );
+
+    pthread_mutex_lock( &callbacks_lock );
+    list_add_tail( &callbacks, &entry->entry );
+    pthread_mutex_unlock( &callbacks_lock );
+}
+
 static w_FSteamNetworkingSocketsDebugOutput w_steam_networking_socket_debug_output;
 static void u_steam_networking_socket_debug_output( uint32_t nType, const char *pszMsg )
 {
diff --git a/lsteamclient/unixlib.h b/lsteamclient/unixlib.h
index 94ae442c..90307ffb 100644
--- a/lsteamclient/unixlib.h
+++ b/lsteamclient/unixlib.h
@@ -34,6 +34,11 @@ enum callback_type
 {
     SOCKETS_DEBUG_OUTPUT = 1,
     WARNING_MESSAGE_HOOK,
+    CALL_IFACE_VTABLE_0,
+    CALL_IFACE_VTABLE_1,
+    CALL_IFACE_VTABLE_2,
+    CALL_IFACE_VTABLE_0_ADD_PLAYER_TO_LIST,
+    CALL_IFACE_VTABLE_0_RULES_RESPONDED,
 };
 
 struct callback
@@ -56,6 +61,28 @@ struct callback
             int32_t severity;
             const char msg[1];
         } warning_message_hook;
+
+        struct
+        {
+            struct w_steam_iface *iface;
+            uint64_t arg0;
+            uint64_t arg1;
+            uint64_t arg2;
+        } call_iface_vtable;
+
+        struct
+        {
+            struct w_steam_iface *iface;
+            int32_t score;
+            float time_played;
+            const char name[1];
+        } add_player_to_list;
+
+        struct
+        {
+            struct w_steam_iface *iface;
+            const char rule_and_value[1];
+        } rules_responded;
     };
 };
 
diff --git a/lsteamclient/unixlib_generated.h b/lsteamclient/unixlib_generated.h
index 0b68e4f2..f39633e7 100644
--- a/lsteamclient/unixlib_generated.h
+++ b/lsteamclient/unixlib_generated.h
@@ -36885,14 +36885,14 @@ struct ISteamMatchmakingServers_SteamMatchMakingServers001_RequestInternetServer
     uint32_t iApp;
     MatchMakingKeyValuePair_t **ppchFilters;
     uint32_t nFilters;
-    w_ISteamMatchmakingServerListResponse *pRequestServersResponse;
+    w_ISteamMatchmakingServerListResponse_099u *pRequestServersResponse;
 };
 
 struct ISteamMatchmakingServers_SteamMatchMakingServers001_RequestLANServerList_params
 {
     struct u_steam_iface *linux_side;
     uint32_t iApp;
-    w_ISteamMatchmakingServerListResponse *pRequestServersResponse;
+    w_ISteamMatchmakingServerListResponse_099u *pRequestServersResponse;
 };
 
 struct ISteamMatchmakingServers_SteamMatchMakingServers001_RequestFriendsServerList_params
@@ -36901,7 +36901,7 @@ struct ISteamMatchmakingServers_SteamMatchMakingServers001_RequestFriendsServerL
     uint32_t iApp;
     MatchMakingKeyValuePair_t **ppchFilters;
     uint32_t nFilters;
-    w_ISteamMatchmakingServerListResponse *pRequestServersResponse;
+    w_ISteamMatchmakingServerListResponse_099u *pRequestServersResponse;
 };
 
 struct ISteamMatchmakingServers_SteamMatchMakingServers001_RequestFavoritesServerList_params
@@ -36910,7 +36910,7 @@ struct ISteamMatchmakingServers_SteamMatchMakingServers001_RequestFavoritesServe
     uint32_t iApp;
     MatchMakingKeyValuePair_t **ppchFilters;
     uint32_t nFilters;
-    w_ISteamMatchmakingServerListResponse *pRequestServersResponse;
+    w_ISteamMatchmakingServerListResponse_099u *pRequestServersResponse;
 };
 
 struct ISteamMatchmakingServers_SteamMatchMakingServers001_RequestHistoryServerList_params
@@ -36919,7 +36919,7 @@ struct ISteamMatchmakingServers_SteamMatchMakingServers001_RequestHistoryServerL
     uint32_t iApp;
     MatchMakingKeyValuePair_t **ppchFilters;
     uint32_t nFilters;
-    w_ISteamMatchmakingServerListResponse *pRequestServersResponse;
+    w_ISteamMatchmakingServerListResponse_099u *pRequestServersResponse;
 };
 
 struct ISteamMatchmakingServers_SteamMatchMakingServers001_RequestSpectatorServerList_params
@@ -36928,7 +36928,7 @@ struct ISteamMatchmakingServers_SteamMatchMakingServers001_RequestSpectatorServe
     uint32_t iApp;
     MatchMakingKeyValuePair_t **ppchFilters;
     uint32_t nFilters;
-    w_ISteamMatchmakingServerListResponse *pRequestServersResponse;
+    w_ISteamMatchmakingServerListResponse_099u *pRequestServersResponse;
 };
 
 struct ISteamMatchmakingServers_SteamMatchMakingServers001_GetServerDetails_params
@@ -37012,7 +37012,7 @@ struct ISteamMatchmakingServers_SteamMatchMakingServers002_RequestInternetServer
     uint32_t iApp;
     MatchMakingKeyValuePair_t **ppchFilters;
     uint32_t nFilters;
-    w_ISteamMatchmakingServerListResponse *pRequestServersResponse;
+    w_ISteamMatchmakingServerListResponse_106 *pRequestServersResponse;
 };
 
 struct ISteamMatchmakingServers_SteamMatchMakingServers002_RequestLANServerList_params
@@ -37020,7 +37020,7 @@ struct ISteamMatchmakingServers_SteamMatchMakingServers002_RequestLANServerList_
     struct u_steam_iface *linux_side;
     void *_ret;
     uint32_t iApp;
-    w_ISteamMatchmakingServerListResponse *pRequestServersResponse;
+    w_ISteamMatchmakingServerListResponse_106 *pRequestServersResponse;
 };
 
 struct ISteamMatchmakingServers_SteamMatchMakingServers002_RequestFriendsServerList_params
@@ -37030,7 +37030,7 @@ struct ISteamMatchmakingServers_SteamMatchMakingServers002_RequestFriendsServerL
     uint32_t iApp;
     MatchMakingKeyValuePair_t **ppchFilters;
     uint32_t nFilters;
-    w_ISteamMatchmakingServerListResponse *pRequestServersResponse;
+    w_ISteamMatchmakingServerListResponse_106 *pRequestServersResponse;
 };
 
 struct ISteamMatchmakingServers_SteamMatchMakingServers002_RequestFavoritesServerList_params
@@ -37040,7 +37040,7 @@ struct ISteamMatchmakingServers_SteamMatchMakingServers002_RequestFavoritesServe
     uint32_t iApp;
     MatchMakingKeyValuePair_t **ppchFilters;
     uint32_t nFilters;
-    w_ISteamMatchmakingServerListResponse *pRequestServersResponse;
+    w_ISteamMatchmakingServerListResponse_106 *pRequestServersResponse;
 };
 
 struct ISteamMatchmakingServers_SteamMatchMakingServers002_RequestHistoryServerList_params
@@ -37050,7 +37050,7 @@ struct ISteamMatchmakingServers_SteamMatchMakingServers002_RequestHistoryServerL
     uint32_t iApp;
     MatchMakingKeyValuePair_t **ppchFilters;
     uint32_t nFilters;
-    w_ISteamMatchmakingServerListResponse *pRequestServersResponse;
+    w_ISteamMatchmakingServerListResponse_106 *pRequestServersResponse;
 };
 
 struct ISteamMatchmakingServers_SteamMatchMakingServers002_RequestSpectatorServerList_params
@@ -37060,7 +37060,7 @@ struct ISteamMatchmakingServers_SteamMatchMakingServers002_RequestSpectatorServe
     uint32_t iApp;
     MatchMakingKeyValuePair_t **ppchFilters;
     uint32_t nFilters;
-    w_ISteamMatchmakingServerListResponse *pRequestServersResponse;
+    w_ISteamMatchmakingServerListResponse_106 *pRequestServersResponse;
 };
 
 struct ISteamMatchmakingServers_SteamMatchMakingServers002_ReleaseRequest_params
diff --git a/lsteamclient/winISteamMatchmakingServers.c b/lsteamclient/winISteamMatchmakingServers.c
index 620d584b..804d9853 100644
--- a/lsteamclient/winISteamMatchmakingServers.c
+++ b/lsteamclient/winISteamMatchmakingServers.c
@@ -20,7 +20,7 @@ DEFINE_THISCALL_WRAPPER(winISteamMatchmakingServers_SteamMatchMakingServers001_P
 DEFINE_THISCALL_WRAPPER(winISteamMatchmakingServers_SteamMatchMakingServers001_ServerRules, 16)
 DEFINE_THISCALL_WRAPPER(winISteamMatchmakingServers_SteamMatchMakingServers001_CancelServerQuery, 8)
 
-void __thiscall winISteamMatchmakingServers_SteamMatchMakingServers001_RequestInternetServerList(struct w_steam_iface *_this, uint32_t iApp, MatchMakingKeyValuePair_t **ppchFilters, uint32_t nFilters, w_ISteamMatchmakingServerListResponse *pRequestServersResponse)
+void __thiscall winISteamMatchmakingServers_SteamMatchMakingServers001_RequestInternetServerList(struct w_steam_iface *_this, uint32_t iApp, MatchMakingKeyValuePair_t **ppchFilters, uint32_t nFilters, w_ISteamMatchmakingServerListResponse_099u *pRequestServersResponse)
 {
     struct ISteamMatchmakingServers_SteamMatchMakingServers001_RequestInternetServerList_params params =
     {
@@ -34,7 +34,7 @@ void __thiscall winISteamMatchmakingServers_SteamMatchMakingServers001_RequestIn
     STEAMCLIENT_CALL( ISteamMatchmakingServers_SteamMatchMakingServers001_RequestInternetServerList, &params );
 }
 
-void __thiscall winISteamMatchmakingServers_SteamMatchMakingServers001_RequestLANServerList(struct w_steam_iface *_this, uint32_t iApp, w_ISteamMatchmakingServerListResponse *pRequestServersResponse)
+void __thiscall winISteamMatchmakingServers_SteamMatchMakingServers001_RequestLANServerList(struct w_steam_iface *_this, uint32_t iApp, w_ISteamMatchmakingServerListResponse_099u *pRequestServersResponse)
 {
     struct ISteamMatchmakingServers_SteamMatchMakingServers001_RequestLANServerList_params params =
     {
@@ -46,7 +46,7 @@ void __thiscall winISteamMatchmakingServers_SteamMatchMakingServers001_RequestLA
     STEAMCLIENT_CALL( ISteamMatchmakingServers_SteamMatchMakingServers001_RequestLANServerList, &params );
 }
 
-void __thiscall winISteamMatchmakingServers_SteamMatchMakingServers001_RequestFriendsServerList(struct w_steam_iface *_this, uint32_t iApp, MatchMakingKeyValuePair_t **ppchFilters, uint32_t nFilters, w_ISteamMatchmakingServerListResponse *pRequestServersResponse)
+void __thiscall winISteamMatchmakingServers_SteamMatchMakingServers001_RequestFriendsServerList(struct w_steam_iface *_this, uint32_t iApp, MatchMakingKeyValuePair_t **ppchFilters, uint32_t nFilters, w_ISteamMatchmakingServerListResponse_099u *pRequestServersResponse)
 {
     struct ISteamMatchmakingServers_SteamMatchMakingServers001_RequestFriendsServerList_params params =
     {
@@ -60,7 +60,7 @@ void __thiscall winISteamMatchmakingServers_SteamMatchMakingServers001_RequestFr
     STEAMCLIENT_CALL( ISteamMatchmakingServers_SteamMatchMakingServers001_RequestFriendsServerList, &params );
 }
 
-void __thiscall winISteamMatchmakingServers_SteamMatchMakingServers001_RequestFavoritesServerList(struct w_steam_iface *_this, uint32_t iApp, MatchMakingKeyValuePair_t **ppchFilters, uint32_t nFilters, w_ISteamMatchmakingServerListResponse *pRequestServersResponse)
+void __thiscall winISteamMatchmakingServers_SteamMatchMakingServers001_RequestFavoritesServerList(struct w_steam_iface *_this, uint32_t iApp, MatchMakingKeyValuePair_t **ppchFilters, uint32_t nFilters, w_ISteamMatchmakingServerListResponse_099u *pRequestServersResponse)
 {
     struct ISteamMatchmakingServers_SteamMatchMakingServers001_RequestFavoritesServerList_params params =
     {
@@ -74,7 +74,7 @@ void __thiscall winISteamMatchmakingServers_SteamMatchMakingServers001_RequestFa
     STEAMCLIENT_CALL( ISteamMatchmakingServers_SteamMatchMakingServers001_RequestFavoritesServerList, &params );
 }
 
-void __thiscall winISteamMatchmakingServers_SteamMatchMakingServers001_RequestHistoryServerList(struct w_steam_iface *_this, uint32_t iApp, MatchMakingKeyValuePair_t **ppchFilters, uint32_t nFilters, w_ISteamMatchmakingServerListResponse *pRequestServersResponse)
+void __thiscall winISteamMatchmakingServers_SteamMatchMakingServers001_RequestHistoryServerList(struct w_steam_iface *_this, uint32_t iApp, MatchMakingKeyValuePair_t **ppchFilters, uint32_t nFilters, w_ISteamMatchmakingServerListResponse_099u *pRequestServersResponse)
 {
     struct ISteamMatchmakingServers_SteamMatchMakingServers001_RequestHistoryServerList_params params =
     {
@@ -88,7 +88,7 @@ void __thiscall winISteamMatchmakingServers_SteamMatchMakingServers001_RequestHi
     STEAMCLIENT_CALL( ISteamMatchmakingServers_SteamMatchMakingServers001_RequestHistoryServerList, &params );
 }
 
-void __thiscall winISteamMatchmakingServers_SteamMatchMakingServers001_RequestSpectatorServerList(struct w_steam_iface *_this, uint32_t iApp, MatchMakingKeyValuePair_t **ppchFilters, uint32_t nFilters, w_ISteamMatchmakingServerListResponse *pRequestServersResponse)
+void __thiscall winISteamMatchmakingServers_SteamMatchMakingServers001_RequestSpectatorServerList(struct w_steam_iface *_this, uint32_t iApp, MatchMakingKeyValuePair_t **ppchFilters, uint32_t nFilters, w_ISteamMatchmakingServerListResponse_099u *pRequestServersResponse)
 {
     struct ISteamMatchmakingServers_SteamMatchMakingServers001_RequestSpectatorServerList_params params =
     {
@@ -278,7 +278,7 @@ DEFINE_THISCALL_WRAPPER(winISteamMatchmakingServers_SteamMatchMakingServers002_P
 DEFINE_THISCALL_WRAPPER(winISteamMatchmakingServers_SteamMatchMakingServers002_ServerRules, 16)
 DEFINE_THISCALL_WRAPPER(winISteamMatchmakingServers_SteamMatchMakingServers002_CancelServerQuery, 8)
 
-void * __thiscall winISteamMatchmakingServers_SteamMatchMakingServers002_RequestInternetServerList(struct w_steam_iface *_this, uint32_t iApp, MatchMakingKeyValuePair_t **ppchFilters, uint32_t nFilters, w_ISteamMatchmakingServerListResponse *pRequestServersResponse)
+void * __thiscall winISteamMatchmakingServers_SteamMatchMakingServers002_RequestInternetServerList(struct w_steam_iface *_this, uint32_t iApp, MatchMakingKeyValuePair_t **ppchFilters, uint32_t nFilters, w_ISteamMatchmakingServerListResponse_106 *pRequestServersResponse)
 {
     struct ISteamMatchmakingServers_SteamMatchMakingServers002_RequestInternetServerList_params params =
     {
@@ -293,7 +293,7 @@ void * __thiscall winISteamMatchmakingServers_SteamMatchMakingServers002_Request
     return params._ret;
 }
 
-void * __thiscall winISteamMatchmakingServers_SteamMatchMakingServers002_RequestLANServerList(struct w_steam_iface *_this, uint32_t iApp, w_ISteamMatchmakingServerListResponse *pRequestServersResponse)
+void * __thiscall winISteamMatchmakingServers_SteamMatchMakingServers002_RequestLANServerList(struct w_steam_iface *_this, uint32_t iApp, w_ISteamMatchmakingServerListResponse_106 *pRequestServersResponse)
 {
     struct ISteamMatchmakingServers_SteamMatchMakingServers002_RequestLANServerList_params params =
     {
@@ -306,7 +306,7 @@ void * __thiscall winISteamMatchmakingServers_SteamMatchMakingServers002_Request
     return params._ret;
 }
 
-void * __thiscall winISteamMatchmakingServers_SteamMatchMakingServers002_RequestFriendsServerList(struct w_steam_iface *_this, uint32_t iApp, MatchMakingKeyValuePair_t **ppchFilters, uint32_t nFilters, w_ISteamMatchmakingServerListResponse *pRequestServersResponse)
+void * __thiscall winISteamMatchmakingServers_SteamMatchMakingServers002_RequestFriendsServerList(struct w_steam_iface *_this, uint32_t iApp, MatchMakingKeyValuePair_t **ppchFilters, uint32_t nFilters, w_ISteamMatchmakingServerListResponse_106 *pRequestServersResponse)
 {
     struct ISteamMatchmakingServers_SteamMatchMakingServers002_RequestFriendsServerList_params params =
     {
@@ -321,7 +321,7 @@ void * __thiscall winISteamMatchmakingServers_SteamMatchMakingServers002_Request
     return params._ret;
 }
 
-void * __thiscall winISteamMatchmakingServers_SteamMatchMakingServers002_RequestFavoritesServerList(struct w_steam_iface *_this, uint32_t iApp, MatchMakingKeyValuePair_t **ppchFilters, uint32_t nFilters, w_ISteamMatchmakingServerListResponse *pRequestServersResponse)
+void * __thiscall winISteamMatchmakingServers_SteamMatchMakingServers002_RequestFavoritesServerList(struct w_steam_iface *_this, uint32_t iApp, MatchMakingKeyValuePair_t **ppchFilters, uint32_t nFilters, w_ISteamMatchmakingServerListResponse_106 *pRequestServersResponse)
 {
     struct ISteamMatchmakingServers_SteamMatchMakingServers002_RequestFavoritesServerList_params params =
     {
@@ -336,7 +336,7 @@ void * __thiscall winISteamMatchmakingServers_SteamMatchMakingServers002_Request
     return params._ret;
 }
 
-void * __thiscall winISteamMatchmakingServers_SteamMatchMakingServers002_RequestHistoryServerList(struct w_steam_iface *_this, uint32_t iApp, MatchMakingKeyValuePair_t **ppchFilters, uint32_t nFilters, w_ISteamMatchmakingServerListResponse *pRequestServersResponse)
+void * __thiscall winISteamMatchmakingServers_SteamMatchMakingServers002_RequestHistoryServerList(struct w_steam_iface *_this, uint32_t iApp, MatchMakingKeyValuePair_t **ppchFilters, uint32_t nFilters, w_ISteamMatchmakingServerListResponse_106 *pRequestServersResponse)
 {
     struct ISteamMatchmakingServers_SteamMatchMakingServers002_RequestHistoryServerList_params params =
     {
@@ -351,7 +351,7 @@ void * __thiscall winISteamMatchmakingServers_SteamMatchMakingServers002_Request
     return params._ret;
 }
 
-void * __thiscall winISteamMatchmakingServers_SteamMatchMakingServers002_RequestSpectatorServerList(struct w_steam_iface *_this, uint32_t iApp, MatchMakingKeyValuePair_t **ppchFilters, uint32_t nFilters, w_ISteamMatchmakingServerListResponse *pRequestServersResponse)
+void * __thiscall winISteamMatchmakingServers_SteamMatchMakingServers002_RequestSpectatorServerList(struct w_steam_iface *_this, uint32_t iApp, MatchMakingKeyValuePair_t **ppchFilters, uint32_t nFilters, w_ISteamMatchmakingServerListResponse_106 *pRequestServersResponse)
 {
     struct ISteamMatchmakingServers_SteamMatchMakingServers002_RequestSpectatorServerList_params params =
     {
diff --git a/lsteamclient/winISteamNetworkingFakeUDPPort.c b/lsteamclient/winISteamNetworkingFakeUDPPort.c
index 201346e6..06d96ec8 100644
--- a/lsteamclient/winISteamNetworkingFakeUDPPort.c
+++ b/lsteamclient/winISteamNetworkingFakeUDPPort.c
@@ -49,7 +49,7 @@ __ASM_BLOCK_END
 
 struct w_steam_iface *create_winISteamNetworkingFakeUDPPort_SteamNetworkingFakeUDPPort001(void *u_iface)
 {
-    struct w_steam_iface *r = HeapAlloc(GetProcessHeap(), 0, sizeof(struct w_steam_iface));
+    struct w_steam_iface *r = alloc_mem_for_iface(sizeof(struct w_steam_iface), "SteamNetworkingFakeUDPPort001");
     TRACE("-> %p\n", r);
     r->vtable = alloc_vtable(&winISteamNetworkingFakeUDPPort_SteamNetworkingFakeUDPPort001_vtable, 4, "SteamNetworkingFakeUDPPort001");
     r->u_iface = u_iface;