From ccf7adf0151cdd7f056dafc2f537f314643a147d Mon Sep 17 00:00:00 2001 From: The-Little-Wolf <116989599+The-Little-Wolf@users.noreply.github.com> Date: Sat, 31 Aug 2024 23:17:23 -0700 Subject: [PATCH] [XAM/APP] Recording more Xam app messages - Recording more xam app messages for future reference - Removed mistakes from messenger_app.h - Added missing buffer_ptr, buffer_length to unknown message id logs --- src/xenia/kernel/xam/apps/messenger_app.cc | 16 ++++-- src/xenia/kernel/xam/apps/messenger_app.h | 6 +- src/xenia/kernel/xam/apps/xam_app.cc | 16 ++++-- src/xenia/kernel/xam/apps/xgi_app.cc | 64 ++++++++++++++++++---- src/xenia/kernel/xam/apps/xmp_app.cc | 27 +++++---- 5 files changed, 94 insertions(+), 35 deletions(-) diff --git a/src/xenia/kernel/xam/apps/messenger_app.cc b/src/xenia/kernel/xam/apps/messenger_app.cc index e1dc709e3..1480d163d 100644 --- a/src/xenia/kernel/xam/apps/messenger_app.cc +++ b/src/xenia/kernel/xam/apps/messenger_app.cc @@ -27,15 +27,21 @@ X_RESULT MessengerApp::DispatchMessageSync(uint32_t message, auto buffer = memory_->TranslateVirtual(buffer_ptr); switch (message) { case 0x00200002: { - // Used on start in blades dashboard v5759 (marketplace update) and - // possibly to 6717 with netplay - XELOGD("MessengerUnk200002, unimplemented"); + // Used on start in blades dashboard v5759 (marketplace update) and 6717 + XELOGD("MessengerUnk200002({:08X}, {:08X}), unimplemented", buffer_ptr, + buffer_length); + return X_E_FAIL; + } + case 0x00200018: { + // Used on logging out in blades 6717 + XELOGD("MessengerUnk200018({:08X}, {:08X}), unimplemented", buffer_ptr, + buffer_length); return X_E_FAIL; } } XELOGE( - "Unimplemented Messenger message app=%.8X, msg=%.8X, arg1=%.8X, " - "arg2=%.8X", + "Unimplemented Messenger message app={:08X}, msg={:08X}, arg1={:08X}, " + "arg2={:08X}", app_id(), message, buffer_ptr, buffer_length); return X_STATUS_UNSUCCESSFUL; } diff --git a/src/xenia/kernel/xam/apps/messenger_app.h b/src/xenia/kernel/xam/apps/messenger_app.h index 671d41a2e..62d49ee72 100644 --- a/src/xenia/kernel/xam/apps/messenger_app.h +++ b/src/xenia/kernel/xam/apps/messenger_app.h @@ -7,8 +7,8 @@ ****************************************************************************** */ -#ifndef XENIA_KERNEL_XAM_APPS_UNKNOWN_F7_APP_H_ -#define XENIA_KERNEL_XAM_APPS_UNKNOWN_F7_APP_H_ +#ifndef XENIA_KERNEL_XAM_APPS_MESSENGER_APP_H_ +#define XENIA_KERNEL_XAM_APPS_MESSENGER_APP_H_ #include "xenia/kernel/kernel_state.h" #include "xenia/kernel/xam/app_manager.h" @@ -31,4 +31,4 @@ class MessengerApp : public App { } // namespace kernel } // namespace xe -#endif // XENIA_KERNEL_XAM_APPS_UNKNOWN_FE_APP_H_ +#endif XENIA_KERNEL_XAM_APPS_MESSENGER_APP_H_ diff --git a/src/xenia/kernel/xam/apps/xam_app.cc b/src/xenia/kernel/xam/apps/xam_app.cc index d2b131cdf..fb2911c7b 100644 --- a/src/xenia/kernel/xam/apps/xam_app.cc +++ b/src/xenia/kernel/xam/apps/xam_app.cc @@ -14,6 +14,11 @@ #include "xenia/kernel/kernel_state.h" #include "xenia/kernel/xenumerator.h" +// Notes: +// - Messages ids that start with 0x00021xxx are UI calls +// - Messages ids that start with 0x00023xxx are used for the user profile +// - Messages ids that start with 0x0002Bxxx are used for the Kinect + namespace xe { namespace kernel { namespace xam { @@ -88,10 +93,6 @@ X_HRESULT XamApp::DispatchMessageSync(uint32_t message, uint32_t buffer_ptr, (uint32_t)data->unk_48); return X_E_SUCCESS; } - case 0x00021012: { - XELOGD("XamApp(0x00021012)"); - return X_E_SUCCESS; - } case 0x00022005: { struct message_data { xe::be deployment_type_ptr; @@ -105,6 +106,13 @@ X_HRESULT XamApp::DispatchMessageSync(uint32_t message, uint32_t buffer_ptr, data->deployment_type_ptr.get(), data->overlapped_ptr.get()); return X_E_SUCCESS; } + case 0x0002B003: { + // Games used in: + // 4D5309C9 + XELOGD("XamUnk2B003({:08X}, {:08X}), unimplemented", buffer_ptr, + buffer_length); + return X_E_SUCCESS; + } } XELOGE( "Unimplemented XAM message app={:08X}, msg={:08X}, arg1={:08X}, " diff --git a/src/xenia/kernel/xam/apps/xgi_app.cc b/src/xenia/kernel/xam/apps/xgi_app.cc index c2fa53014..63ff1cdf5 100644 --- a/src/xenia/kernel/xam/apps/xgi_app.cc +++ b/src/xenia/kernel/xam/apps/xgi_app.cc @@ -16,12 +16,43 @@ namespace xe { namespace kernel { namespace xam { namespace apps { +/* + * Most of the structs below were found in the Source SDK, provided as stubs. + * Specifically, they can be found in the Source 2007 SDK and the Alien Swarm + * Source SDK. Both are available on Steam for free. A GitHub mirror of the + * Alien Swarm SDK can be found here: + * https://github.com/NicolasDe/AlienSwarm/blob/master/src/common/xbox/xboxstubs.h + */ struct X_XUSER_ACHIEVEMENT { xe::be user_idx; xe::be achievement_id; }; +struct XUSER_STATS_VIEW { + xe::be ViewId; + xe::be TotalViewRows; + xe::be NumRows; + xe::be pRows; +}; + +struct XUSER_STATS_COLUMN { + xe::be ColumnId; + X_USER_DATA Value; +}; + +struct XUSER_STATS_RESET { + xe::be user_index; + xe::be view_id; +}; + +struct XUSER_ANID { + xe::be user_index; + xe::be cchAnIdBuffer; + xe::be pszAnIdBuffer; + xe::be value_const; // 1 +}; + XgiApp::XgiApp(KernelState* kernel_state) : App(kernel_state, 0xFB) {} // http://mb.mirage.org/bugzilla/xliveless/main.c @@ -108,6 +139,8 @@ X_HRESULT XgiApp::DispatchMessageSync(uint32_t message, uint32_t buffer_ptr, return X_E_SUCCESS; } case 0x000B0010: { + XELOGD("XSessionCreate({:08X}, {:08X}), implemented in netplay", + buffer_ptr, buffer_length); assert_true(!buffer_length || buffer_length == 28); // Sequence: // - XamSessionCreateHandle @@ -130,8 +163,8 @@ X_HRESULT XgiApp::DispatchMessageSync(uint32_t message, uint32_t buffer_ptr, return X_E_SUCCESS; } case 0x000B0011: { - // TODO(PermaNull): reverse buffer contents. - XELOGD("XGISessionDelete"); + XELOGD("XGISessionDelete({:08X}, {:08X}), implemented in netplay", + buffer_ptr, buffer_length); return X_STATUS_SUCCESS; } case 0x000B0012: { @@ -150,16 +183,19 @@ X_HRESULT XgiApp::DispatchMessageSync(uint32_t message, uint32_t buffer_ptr, case 0x000B0014: { // Gets 584107FB in game. // get high score table? - XELOGD("XGI_unknown"); + XELOGD("XSessionStart({:08X}), implemented in netplay", buffer_ptr); return X_STATUS_SUCCESS; } case 0x000B0015: { // send high scores? - XELOGD("XGI_unknown"); + XELOGD("XSessionEnd({:08X}, {:08X}), implemented in netplay", buffer_ptr, + buffer_length); return X_STATUS_SUCCESS; } case 0x000B0021: { - struct XLeaderboard { + XELOGD("XUserReadStats"); + + struct XUserReadStats { xe::be titleId; xe::be xuids_count; xe::be xuids_guest_address; @@ -167,7 +203,7 @@ X_HRESULT XgiApp::DispatchMessageSync(uint32_t message, uint32_t buffer_ptr, xe::be specs_guest_address; xe::be results_size; xe::be results_guest_address; - }* data = reinterpret_cast(buffer); + }* data = reinterpret_cast(buffer); if (!data->results_guest_address) { return 1; @@ -177,13 +213,16 @@ X_HRESULT XgiApp::DispatchMessageSync(uint32_t message, uint32_t buffer_ptr, // Called after opening xbox live arcade and clicking on xbox live v5759 // to 5787 and called after clicking xbox live in the game library from // v6683 to v6717 - XELOGD("XGIUnkB0036, unimplemented"); + XELOGD("XGIUnkB0036({:08X}, {:08X}), unimplemented", buffer_ptr, + buffer_length); return X_E_FAIL; } case 0x000B003D: { - // Games used in: - // - 5451082a (netplay build). - XELOGD("XGIUnkB003D, unimplemented"); + // Used in 5451082A, 5553081E + + // XUserGetCachedANID + XELOGI("XUserGetANID({:08X}, {:08X}), implemented in netplay", buffer_ptr, + buffer_length); return X_E_FAIL; } case 0x000B0041: { @@ -209,10 +248,11 @@ X_HRESULT XgiApp::DispatchMessageSync(uint32_t message, uint32_t buffer_ptr, } xe::store_and_swap(context + 4, value); } - return X_E_FAIL; + return X_E_SUCCESS; } case 0x000B0071: { - XELOGD("XGI 0x000B0071, unimplemented"); + XELOGD("XGIUnkB0071({:08X}, {:08X}), unimplemented", buffer_ptr, + buffer_length); return X_E_SUCCESS; } } diff --git a/src/xenia/kernel/xam/apps/xmp_app.cc b/src/xenia/kernel/xam/apps/xmp_app.cc index 511a5bcff..07e29cfc2 100644 --- a/src/xenia/kernel/xam/apps/xmp_app.cc +++ b/src/xenia/kernel/xam/apps/xmp_app.cc @@ -439,8 +439,9 @@ X_HRESULT XmpApp::DispatchMessageSync(uint32_t message, uint32_t buffer_ptr, case 0x0007002B: { // Called on the NXE and Kinect dashboard after clicking on the picture, // video, and music library - XELOGD("XMPUnk7002B, unimplemented"); - return X_E_FAIL; + XELOGD("XMPUnk7002B({:08X}, {:08X}), unimplemented", buffer_ptr, + buffer_length); + return X_E_INVALIDARG; } case 0x0007002E: { assert_true(!buffer_length || buffer_length == 12); @@ -462,8 +463,9 @@ X_HRESULT XmpApp::DispatchMessageSync(uint32_t message, uint32_t buffer_ptr, } case 0x0007002F: { // Called on the start up of all dashboard versions before kinect - XELOGD("XMPUnk7002F, unimplemented"); - return X_E_FAIL; + XELOGD("XMPUnk7002F({:08X}, {:08X}), unimplemented", buffer_ptr, + buffer_length); + return X_E_INVALIDARG; } case 0x0007003D: { // XMPCaptureOutput @@ -485,16 +487,19 @@ X_HRESULT XmpApp::DispatchMessageSync(uint32_t message, uint32_t buffer_ptr, } case 0x00070044: { // Called on the start up of all dashboard versions before kinect - // When it returns X_E_FAIL you can access the music player up to version - // 5787 - XELOGD("XMPUnk70044, unimplemented"); - return X_E_FAIL; + // When it returns X_E_INVALIDARG you can access the music player up to + // version 5787 + XELOGD("XMPUnk70044({:08X}, {:08X}), unimplemented", buffer_ptr, + buffer_length); + return X_E_INVALIDARG; } case 0x00070053: { // Called on the blades dashboard after clicking on the picture, - // video, and music library - XELOGD("XMPUnk70053, unimplemented"); - return X_E_FAIL; + // video, and music library in rapid succession then freezes + // it only recieves buffer + XELOGD("XMPUnk70053({:08X}, {:08X}), unimplemented", buffer_ptr, + buffer_length); + return X_E_SUCCESS; } } XELOGE(