diff --git a/src/xenia/kernel/xam/xam.h b/src/xenia/kernel/xam/xam.h index 438c1a47d..a03ce098e 100644 --- a/src/xenia/kernel/xam/xam.h +++ b/src/xenia/kernel/xam/xam.h @@ -199,6 +199,11 @@ struct X_DASH_APP_INFO { }; static_assert_size(X_DASH_APP_INFO, 0xC); +struct X_DASH_BACKSTACK_DATA { + uint8_t unk1[0x314]; +}; +static_assert_size(X_DASH_BACKSTACK_DATA, 0x314); + struct X_GUID { xe::be Data1; xe::be Data2; diff --git a/src/xenia/kernel/xam/xam_info.cc b/src/xenia/kernel/xam/xam_info.cc index 5af9a8cdb..6adbedac6 100644 --- a/src/xenia/kernel/xam/xam_info.cc +++ b/src/xenia/kernel/xam/xam_info.cc @@ -788,6 +788,22 @@ void XamGetActiveDashAppInfo_entry(pointer_t dash_app) { } DECLARE_XAM_EXPORT1(XamGetActiveDashAppInfo, kNone, kImplemented); +dword_result_t XamGetDashBackstackData_entry( + pointer_t backstack_data, lpdword_t count) { + auto xam_state_ = kernel_state()->xam_state(); + uint32_t total = xam_state_->dash_backstack_nodes_count_; + if (total) { + if (*count <= total) { + total = *count; + } + std::memcpy(backstack_data, &xam_state_->dash_backstack_data_, + sizeof(X_DASH_BACKSTACK_DATA) * total); + xam_state_->dash_backstack_nodes_count_ = 0; + } + return X_ERROR_SUCCESS; +} +DECLARE_XAM_EXPORT1(XamGetDashBackstackData, kNone, kImplemented); + void XampWebInstrumentationSetProfileCounts_entry(dword_t live_profiles, dword_t local_profiles, dword_t adult_profiles, diff --git a/src/xenia/kernel/xam/xam_state.h b/src/xenia/kernel/xam/xam_state.h index caf450f9d..4b0a7f618 100644 --- a/src/xenia/kernel/xam/xam_state.h +++ b/src/xenia/kernel/xam/xam_state.h @@ -58,6 +58,8 @@ class XamState { void LoadSpaInfo(const SpaInfo* info); X_DASH_APP_INFO dash_app_info_ = {}; + uint32_t dash_backstack_nodes_count_ = 0; + X_DASH_BACKSTACK_DATA dash_backstack_data_[2] = {}; std::atomic xam_dialogs_shown_ = {0}; std::atomic xam_nui_dialogs_shown_ = {0};