From 57764f6bea3d2892619b1e89f0be61a7dbefdf27 Mon Sep 17 00:00:00 2001 From: emoose Date: Mon, 4 Jan 2021 15:55:19 +0000 Subject: [PATCH] [Kernel/XAM] Improve NetDll_XNetQosServiceLookup stub, implement NetDll_XNetQosRelease Needed for Saints Row 1 (TU1) to start up properly --- src/xenia/kernel/xam/xam_net.cc | 48 ++++++++++++++++++++++++++++++--- 1 file changed, 44 insertions(+), 4 deletions(-) diff --git a/src/xenia/kernel/xam/xam_net.cc b/src/xenia/kernel/xam/xam_net.cc index 7b37e2b94..07ea5935a 100644 --- a/src/xenia/kernel/xam/xam_net.cc +++ b/src/xenia/kernel/xam/xam_net.cc @@ -63,6 +63,25 @@ typedef struct { in_addr aina[8]; } XNDNS; +typedef struct { + uint8_t flags; + uint8_t reserved; + xe::be probes_xmit; + xe::be probes_recv; + xe::be data_len; + xe::be data_ptr; + xe::be rtt_min_in_msecs; + xe::be rtt_med_in_msecs; + xe::be up_bits_per_sec; + xe::be down_bits_per_sec; +} XNQOSINFO; + +typedef struct { + xe::be count; + xe::be count_pending; + XNQOSINFO info[1]; +} XNQOS; + struct Xsockaddr_t { xe::be sa_family; char sa_data[14]; @@ -542,14 +561,35 @@ dword_result_t NetDll_XNetDnsRelease(dword_t caller, pointer_t dns) { } DECLARE_XAM_EXPORT1(NetDll_XNetDnsRelease, kNetworking, kStub); -dword_result_t NetDll_XNetQosServiceLookup(dword_t caller, dword_t zero, +dword_result_t NetDll_XNetQosServiceLookup(dword_t caller, dword_t flags, dword_t event_handle, - lpdword_t out_ptr) { - // Non-zero is error. - return 1; + lpdword_t pqos) { + // Set pqos as some games will try accessing it despite non-successful result + if (pqos) { + auto qos_guest = kernel_memory()->SystemHeapAlloc(sizeof(XNQOS)); + auto qos = kernel_memory()->TranslateVirtual(qos_guest); + qos->count = qos->count_pending = 0; + *pqos = qos_guest; + } + if (event_handle) { + auto ev = + kernel_state()->object_table()->LookupObject(event_handle); + assert_not_null(ev); + ev->Set(0, false); + } + return 0; } DECLARE_XAM_EXPORT1(NetDll_XNetQosServiceLookup, kNetworking, kStub); +dword_result_t NetDll_XNetQosRelease(dword_t caller, pointer_t qos) { + if (!qos) { + return X_STATUS_INVALID_PARAMETER; + } + kernel_memory()->SystemHeapFree(qos.guest_address()); + return 0; +} +DECLARE_XAM_EXPORT1(NetDll_XNetQosRelease, kNetworking, kStub); + dword_result_t NetDll_XNetQosListen(dword_t caller, lpvoid_t id, lpvoid_t data, dword_t data_size, dword_t r7, dword_t flags) {