diff --git a/src/xenia/kernel/xam/apps/messenger_app.cc b/src/xenia/kernel/xam/apps/messenger_app.cc index e1dc709e3..4884046ab 100644 --- a/src/xenia/kernel/xam/apps/messenger_app.cc +++ b/src/xenia/kernel/xam/apps/messenger_app.cc @@ -29,7 +29,9 @@ X_RESULT MessengerApp::DispatchMessageSync(uint32_t message, case 0x00200002: { // Used on start in blades dashboard v5759 (marketplace update) and // possibly to 6717 with netplay - XELOGD("MessengerUnk200002, unimplemented"); + assert_true(!buffer_length || buffer_length == 12); + XELOGD("MessengerUnk200002({:08X}, {:08X}), unimplemented", buffer_ptr, + buffer_length); return X_E_FAIL; } } 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..ff3acced6 100644 --- a/src/xenia/kernel/xam/apps/xgi_app.cc +++ b/src/xenia/kernel/xam/apps/xgi_app.cc @@ -16,12 +16,54 @@ 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_READ_RESULTS { + xe::be NumViews; + xe::be pViews; +}; + +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_SPEC { + xe::be ViewId; + xe::be NumColumnIds; + xe::be rgwColumnIds[0x40]; +}; + +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 +150,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 +174,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: { @@ -147,18 +191,75 @@ X_HRESULT XgiApp::DispatchMessageSync(uint32_t message, uint32_t buffer_ptr, user_count, unk_0, user_index_array, private_slots_array); return X_E_SUCCESS; } + case 0x000B0013: { + XELOGD( + "XGISessionLeaveLocal({:08X}, {:08X}), implemented by netplay build", + buffer_ptr, buffer_length); + assert_true(buffer_length == 0x14); + + return X_E_FAIL; + } 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 0x000B0016: { + XELOGD("XSessionSearch({:08X}), implemented by netplay build", + buffer_ptr); + return X_E_FAIL; + } + case 0x000B0018: { + XELOGD("XSessionModify({:08X}), implemented by netplay build", + buffer_ptr); + return X_E_FAIL; + } + case 0x000B0019: { + XELOGD("XSessionGetInvitationData({:08X}, {:08X}), unimplemented", + buffer_ptr, buffer_length); + return X_E_SUCCESS; + } + case 0x000B001A: { + XELOGD( + "XSessionArbitrationRegister({:08X}), implemented by netplay build", + buffer_ptr); + return X_E_FAIL; + } + case 0x000B001B: { + XELOGD("XSessionSearchByID({:08X}), implemented by netplay build", + buffer_ptr); + return X_E_FAIL; + } + case 0x000B001C: { + XELOGD("XSessionSearchEx({:08X}), implemented by netplay build", + buffer_ptr); + return X_E_FAIL; + } + case 0x000B001D: { + XELOGD("XSessionGetDetails({:08X}), implemented by netplay build", + buffer_ptr); + return X_E_FAIL; + } + case 0x000B001E: { + XELOGD("XSessionMigrateHost({:08X}), implemented by netplay build", + buffer_ptr); + return X_E_FAIL; + } + case 0x000B0020: { + XELOGD("XUserResetStatsView({:08X}), implemented by netplay build", + buffer_ptr); + return X_E_FAIL; + } case 0x000B0021: { + XELOGD("XUserReadStats"); + struct XLeaderboard { xe::be titleId; xe::be xuids_count; @@ -172,19 +273,35 @@ X_HRESULT XgiApp::DispatchMessageSync(uint32_t message, uint32_t buffer_ptr, if (!data->results_guest_address) { return 1; } + + return X_E_SUCCESS; + } + case 0x000B0025: { + XELOGD("XSessionWriteStats({:08X}), implemented by netplay build", + buffer_ptr); + + return X_E_FAIL; + } + case 0x000B0026: { + XELOGD("XSessionFlushStats({:08X}, {:08X}), unimplemented", buffer_ptr, + buffer_length); + return X_E_SUCCESS; } case 0x000B0036: { // 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"); - return X_E_FAIL; + // Used in 5451082A, 5553081E + // XUserGetCachedANID + // Used in 5451082A, 5553081E + XELOGI("XUserGetANID({:08X}, {:08X}), implemented in netplay", buffer_ptr, + buffer_length); + return X_E_SUCCESS; } case 0x000B0041: { assert_true(!buffer_length || buffer_length == 32); @@ -209,10 +326,20 @@ X_HRESULT XgiApp::DispatchMessageSync(uint32_t message, uint32_t buffer_ptr, } xe::store_and_swap(context + 4, value); } + return X_E_SUCCESS; + } + case 0x000B0060: { + XELOGD("XSessionSearchByIds({:08X}), implemented in netplay", buffer_ptr); return X_E_FAIL; } + case 0x000B0065: { + XELOGD("XSessionSearchWeighted({:08X}, {:08X}), unimplemented", + buffer_ptr, buffer_length); + 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/xlivebase_app.cc b/src/xenia/kernel/xam/apps/xlivebase_app.cc index 59d7d7362..5eeb1b78d 100644 --- a/src/xenia/kernel/xam/apps/xlivebase_app.cc +++ b/src/xenia/kernel/xam/apps/xlivebase_app.cc @@ -28,20 +28,156 @@ X_HRESULT XLiveBaseApp::DispatchMessageSync(uint32_t message, // NOTE: buffer_length may be zero or valid. auto buffer = memory_->TranslateVirtual(buffer_ptr); switch (message) { + case 0x00050002: { + // Current session must have PRESENCE flag. + XELOGD("XInviteSend({:08X}, {:08X}), implemented by netplay build", + buffer_ptr, buffer_length); + return X_E_FAIL; + } + case 0x00050008: { + // Required to be successful for 534507D4 + // Guess: + // XStorageDownloadToMemory -> XStorageDownloadToMemoryGetProgress + XELOGD( + "XStorageDownloadToMemoryGetProgress({:08x}, {:08x}), unimplemented", + buffer_ptr, buffer_length); + return X_E_SUCCESS; + } + case 0x00050009: { + // Fixes Xbox Live error for 513107D9 + XELOGD("XStorageDownloadToMemory({:08X}, {:08X}), unimplemented", + buffer_ptr, buffer_length); + return XStorageDownloadToMemory(buffer_ptr); + } + case 0x0005000A: { + XELOGD("XStorageEnumerate({:08X}, {:08X}) unimplemented", buffer_ptr, + buffer_length); + return X_E_SUCCESS; + } + case 0x0005000B: { + // Fixes Xbox Live error for 43430821 + XELOGD("XStorageUploadFromMemory({:08X}, {:08X}), unimplemented", + buffer_ptr, buffer_length); + return XStorageUploadFromMemory(buffer_ptr); + } + case 0x0005000C: { + XELOGD("XStringVerify({:08X} {:08X}), Stubbed", buffer_ptr, + buffer_length); + return XStringVerify(buffer_ptr, buffer_length); + } + case 0x0005000D: { + // Fixes hang when leaving session for 545107D5 + // 415607D2 says this is XStringVerify + XELOGD("XStringVerify({:08X}, {:08X}), Stubbed", buffer_ptr, + buffer_length); + return XStringVerify(buffer_ptr, buffer_length); + } + case 0x0005000E: { + // Before every call there is a call to XUserFindUsers + // Success stub: + // 584113E8 successfully creates session. + // 58410B5D craches. + XELOGD("XUserFindUsersResponseSize({:08X}, {:08X}) unimplemented", + buffer_ptr, buffer_length); + return X_E_FAIL; + } + case 0x0005000F: { + // 41560855 included from TU 7 + // Attempts to set a dvar for ui_email_address but fails on + // WideCharToMultiByte + // + // 4D530AA5 encounters "Failed to retrieve account credentials". + XELOGD("_XAccountGetUserInfo({:08X}, {:08X}) unimplemented", buffer_ptr, + buffer_length); + return X_ERROR_FUNCTION_FAILED; + } + case 0x00050010: { + XELOGD("XAccountGetUserInfo({:08X}, {:08X}) unimplemented", buffer_ptr, + buffer_length); + return X_ERROR_FUNCTION_FAILED; + } + case 0x00050036: { + XELOGD("XOnlineQuerySearch({:08X}, {:08X}) unimplemented", buffer_ptr, + buffer_length); + return X_E_SUCCESS; + } + case 0x00050038: { + // 4D5307D3 + // 4D5307D1 + XELOGD("XOnlineQuerySearch({:08X}, {:08X}) unimplemented", buffer_ptr, + buffer_length); + return X_E_SUCCESS; + } + case 0x00050077: { + // Called on blades dashboard v1888 + // Current Balance in sub menus: + // All New Demos and Trailers + // More Videos and Downloads + XELOGD("XLiveBaseUnk50077({:08X}, {:08X}) unimplemented", buffer_ptr, + buffer_length); + return X_E_SUCCESS; + } + case 0x00050079: { + // Fixes Xbox Live error for 454107DB + XELOGD("XLiveBaseUnk50079({:08X}, {:08X}) unimplemented", buffer_ptr, + buffer_length); + return X_E_SUCCESS; + } + case 0x0005008B: { + // Called on blades dashboard v1888 + // Fixes accessing marketplace Featured Downloads. + XELOGD("XLiveBaseUnk5008B({:08X}, {:08X}) unimplemented", buffer_ptr, + buffer_length); + return X_E_SUCCESS; + } case 0x0005008C: { // Called on startup of blades dashboard v1888 to v2858 - XELOGD("XLiveBaseUnk5008C, unimplemented"); + XELOGD("XLiveBaseUnk5008C({:08X}, {:08X}), unimplemented", buffer_ptr, + buffer_length); return X_E_FAIL; } + case 0x0005008F: { + // Called on blades dashboard v1888 + // Fixes accessing marketplace sub menus: + // All New Demos and Trailers + // More Videos and Downloads + XELOGD("XLiveBaseUnk5008F({:08X}, {:08X}) unimplemented", buffer_ptr, + buffer_length); + return X_E_SUCCESS; + } + case 0x00050090: { + // Called on blades dashboard v1888 + // Fixes accessing marketplace Game Downloads->All Games->Xbox Live Arcade + // sub menu. + XELOGD("XLiveBaseUnk50090({:08X}, {:08X}) unimplemented", buffer_ptr, + buffer_length); + return X_E_SUCCESS; + } + case 0x00050091: { + // Called on blades dashboard v1888 + // Fixes accessing marketplace Game Downloads. + XELOGD("XLiveBaseUnk50091({:08X}, {:08X}) unimplemented", buffer_ptr, + buffer_length); + return X_E_SUCCESS; + } case 0x00050094: { // Called on startup of blades dashboard v4532 to v4552 - XELOGD("XLiveBaseUnk50094, unimplemented"); + XELOGD("XLiveBaseUnk50094({:08X}, {:08X}), unimplemented", buffer_ptr, + buffer_length); return X_E_FAIL; } + case 0x00050097: { + // Called on blades dashboard v1888 + // Fixes accessing marketplace Memberships. + XELOGD("XLiveBaseUnk50097({:08X}, {:08X}) unimplemented", buffer_ptr, + buffer_length); + return X_E_SUCCESS; + } case 0x00058003: { // Called on startup of dashboard (netplay build) - XELOGD("XLiveBaseLogonGetHR, unimplemented"); - return X_E_SUCCESS; + // Always receives a buffer ptr and buffer length of zero + XELOGD("XLiveBaseLogonGetHR, implemented by netplay build"); + return 0x00151000L; // X_ONLINE_E_LOGON_NO_NETWORK_CONNECTION } case 0x00058004: { // Called on startup, seems to just return a bool in the buffer. @@ -64,6 +200,48 @@ X_HRESULT XLiveBaseApp::DispatchMessageSync(uint32_t message, buffer_length); return 0x80151802; // ERROR_CONNECTION_INVALID } + case 0x00058009: { + XELOGD("XContentGetMarketplaceCounts({:08X}, {:08X}) unimplemented", + buffer_ptr, buffer_length); + return X_E_SUCCESS; + } + case 0x0005800C: { + XELOGD( + "XUserMuteListSetState({:08X}, {:08X}), implemented by netplay build", + buffer_ptr, buffer_length); + + return X_E_FAIL; + } + case 0x0005800E: { + // Fixes Xbox Live error for 513107D9 + XELOGD("XUserMuteListQuery({:08X}, {:08X}) unimplemented", buffer_ptr, + buffer_length); + return X_E_SUCCESS; + } + case 0x00058017: { + XELOGD("XUserFindUsers({:08X}, {:08X}) unimplemented", buffer_ptr, + buffer_length); + return X_E_SUCCESS; + } + case 0x00058019: { + // 54510846 + XELOGD( + "XPresenceCreateEnumerator({:08X}, {:08X}), Stubbed by netplay build", + buffer_ptr, buffer_length); + return X_E_FAIL; + } + case 0x0005801C: { + // Called on blades dashboard v1888 + XELOGD("XLiveBaseUnk5801C({:08X}, {:08X}), Stubbed by netplay build", + buffer_ptr, buffer_length); + return X_E_FAIL; + } + case 0x0005801E: { + // 54510846 + XELOGD("XPresenceSubscribe({:08X}, {:08X}), Stubbed by netplay build", + buffer_ptr, buffer_length); + return X_E_FAIL; + } case 0x00058020: { // 0x00058004 is called right before this. // We should create a XamEnumerate-able empty list here, but I'm not @@ -75,31 +253,101 @@ X_HRESULT XLiveBaseApp::DispatchMessageSync(uint32_t message, } case 0x00058023: { XELOGD( - "CXLiveMessaging::XMessageGameInviteGetAcceptedInfo({:08X}, {:08X}) " + "CXLiveMessaging::XMessageGameInviteGetAcceptedInfo({:08X}, " + "{:08X}) " "unimplemented", buffer_ptr, buffer_length); return X_E_FAIL; } - case 0x00058037: { - XELOGD("XPresenceInitialize({:08X}, {:08X})", buffer_ptr, buffer_length); + case 0x00058024: { + // Called on blades dashboard v1888 + XELOGD("XLiveBaseUnk58024({:08X}, {:08X}), Stubbed by netplay build", + buffer_ptr, buffer_length); + return X_E_FAIL; + } + case 0x00058032: { + XELOGD("XGetTaskProgress({:08X}, {:08X}) unimplemented", buffer_ptr, + buffer_length); return X_E_SUCCESS; } + case 0x00058035: { + // Fixes Xbox Live error for 513107D9 + // Required for 534507D4 + XELOGD( + "XStorageBuildServerPath({:08X}, {:08X}), Stubbed by netplay " + "build", + buffer_ptr, buffer_length); + return X_E_FAIL; + } + case 0x00058037: { + // Used in older games such as Crackdown, FM2, Saints Row 1 + XELOGD("XPresenceInitializeLegacy({:08X}, {:08X})", buffer_ptr, + buffer_length); + return X_E_SUCCESS; + } + case 0x00058044: { + XELOGD("XPresenceUnsubscribe({:08X}, {:08X}), Stubbed by netplay build", + buffer_ptr, buffer_length); + return X_E_FAIL; + } case 0x00058046: { + // Used in newer games such as Forza 4, MW3, FH2 + // // Required to be successful for 4D530910 to detect signed-in profile - // Doesn't seem to set anything in the given buffer, probably only takes - // input - XELOGD("XLiveBaseUnk58046({:08X}, {:08X}) unimplemented", buffer_ptr, + // Doesn't seem to set anything in the given buffer, probably only + // takes input + XELOGD("XPresenceInitialize({:08X}, {:08X}) unimplemented", buffer_ptr, buffer_length); return X_E_SUCCESS; } } XELOGE( - "Unimplemented XLIVEBASE message app={:08X}, msg={:08X}, arg1={:08X}, " + "Unimplemented XLIVEBASE message app={:08X}, msg={:08X}, " + "arg1={:08X}, " "arg2={:08X}", app_id(), message, buffer_ptr, buffer_length); return X_E_FAIL; } +X_HRESULT XLiveBaseApp::XStringVerify(uint32_t buffer_ptr, + uint32_t buffer_length) { + if (!buffer_ptr) { + return X_E_INVALIDARG; + } + + // uint32_t* data_ptr = + // kernel_state_->memory()->TranslateVirtual(buffer_ptr); + + // TODO(Gliniak): Figure out structure after marshaling. + // Based on what game does there must be some structure that + // checks if string is proper. + return X_E_SUCCESS; +} + +X_HRESULT XLiveBaseApp::XStorageDownloadToMemory(uint32_t buffer_ptr) { + // 41560817, 513107D5, 513107D9 has issues with X_E_FAIL. + // 513107D5, 513107D9 prefer X_ERROR_FUNCTION_FAILED. + + if (!buffer_ptr) { + return X_E_INVALIDARG; + } + + // 415607DD has issues with X_E_SUCCESS and X_ERROR_FUNCTION_FAILED. + // if (kernel_state()->title_id() == 0x415607DD) { + // return X_E_FAIL; + // } + + return X_E_SUCCESS; +} + +X_HRESULT XLiveBaseApp::XStorageUploadFromMemory(uint32_t buffer_ptr) { + if (!buffer_ptr) { + return X_E_INVALIDARG; + } + + return X_E_SUCCESS; +} + } // namespace apps } // namespace xam } // namespace kernel diff --git a/src/xenia/kernel/xam/apps/xlivebase_app.h b/src/xenia/kernel/xam/apps/xlivebase_app.h index bd1fee3d5..b7c48a04e 100644 --- a/src/xenia/kernel/xam/apps/xlivebase_app.h +++ b/src/xenia/kernel/xam/apps/xlivebase_app.h @@ -24,6 +24,25 @@ class XLiveBaseApp : public App { X_HRESULT DispatchMessageSync(uint32_t message, uint32_t buffer_ptr, uint32_t buffer_length) override; + + private: + X_HRESULT XPresenceInitialize(uint32_t buffer_length); + X_HRESULT XPresenceSubscribe(uint32_t buffer_length); + X_HRESULT XPresenceUnsubscribe(uint32_t buffer_length); + X_HRESULT XPresenceCreateEnumerator(uint32_t buffer_length); + X_HRESULT GetServiceInfo(uint32_t service_id, uint32_t service_info); + + X_HRESULT CreateFriendsEnumerator(uint32_t buffer_args); + void UpdateFriendPresence(const uint32_t user_index); + void UpdatePresenceXUIDs(const std::vector& xuids, + const uint32_t user_index); + X_HRESULT XStringVerify(uint32_t buffer_ptr, uint32_t buffer_length); + X_HRESULT XStorageDownloadToMemory(uint32_t buffer_ptr); + X_HRESULT XStorageUploadFromMemory(uint32_t buffer_ptr); + X_HRESULT XStorageBuildServerPath(uint32_t buffer_ptr); + + X_HRESULT Unk58024(uint32_t buffer_length); + X_HRESULT Unk5801C(uint32_t buffer_length); }; } // namespace apps diff --git a/src/xenia/kernel/xam/apps/xmp_app.cc b/src/xenia/kernel/xam/apps/xmp_app.cc index 80ec50d71..fe1fef9e8 100644 --- a/src/xenia/kernel/xam/apps/xmp_app.cc +++ b/src/xenia/kernel/xam/apps/xmp_app.cc @@ -439,8 +439,10 @@ 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; + assert_true(!buffer_length || buffer_length == 20); + XELOGD("XMPUnk7002B({:08X}, {:08X}), unimplemented", buffer_ptr, + buffer_length); + return X_E_INVALIDARG; } case 0x0007002E: { assert_true(!buffer_length || buffer_length == 12); @@ -462,8 +464,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 +488,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_INVALIDARG; } } XELOGE(