diff --git a/src/xenia/kernel/xam/xam.h b/src/xenia/kernel/xam/xam.h index d111fbef9..2b57e842b 100644 --- a/src/xenia/kernel/xam/xam.h +++ b/src/xenia/kernel/xam/xam.h @@ -222,6 +222,22 @@ static_assert_size(X_PASSPORT_SESSION_TOKEN, 0x1C); #pragma pack(pop) +struct X_USER_SIGNIN_INFO { + xe::be xuid; + xe::be flags; + xe::be signin_state; + xe::be guest_num; + xe::be sponsor_user_index; + char name[16]; +}; +static_assert_size(X_USER_SIGNIN_INFO, 40); + +struct X_USER_READ_PROFILE_SETTINGS { + xe::be setting_count; + xe::be settings_ptr; +}; +static_assert_size(X_USER_READ_PROFILE_SETTINGS, 8); + // clang-format off #define XMBox_NOICON 0x00000000 #define XMBox_ERRORICON 0x00000001 @@ -343,6 +359,15 @@ struct XMP_USER_PLAYLIST_INFO { }; static_assert_size(XMP_USER_PLAYLIST_INFO, 0x334); +constexpr uint8_t kStatsMaxAmount = 64; + +struct X_STATS_DETAILS { + xe::be id; + xe::be stats_amount; + xe::be stats[kStatsMaxAmount]; +}; +static_assert_size(X_STATS_DETAILS, 8 + kStatsMaxAmount * 2); + } // namespace xam } // namespace kernel } // namespace xe diff --git a/src/xenia/kernel/xam/xam_user.cc b/src/xenia/kernel/xam/xam_user.cc index afcae57f7..84a51b9b6 100644 --- a/src/xenia/kernel/xam/xam_user.cc +++ b/src/xenia/kernel/xam/xam_user.cc @@ -103,16 +103,6 @@ dword_result_t XamUserGetSigninState_entry(dword_t user_index) { DECLARE_XAM_EXPORT2(XamUserGetSigninState, kUserProfiles, kImplemented, kHighFrequency); -typedef struct { - xe::be xuid; - xe::be flags; - xe::be signin_state; - xe::be guest_num; - xe::be sponsor_user_index; - char name[16]; -} X_USER_SIGNIN_INFO; -static_assert_size(X_USER_SIGNIN_INFO, 40); - X_HRESULT_result_t XamUserGetSigninInfo_entry( dword_t user_index, dword_t flags, pointer_t info) { if (!info) { @@ -199,12 +189,6 @@ dword_result_t XamUserGetGamerTag_entry(dword_t user_index, dword_t buffer, } DECLARE_XAM_EXPORT1(XamUserGetGamerTag, kUserProfiles, kImplemented); -typedef struct { - xe::be setting_count; - xe::be settings_ptr; -} X_USER_READ_PROFILE_SETTINGS; -static_assert_size(X_USER_READ_PROFILE_SETTINGS, 8); - // https://github.com/oukiar/freestyledash/blob/master/Freestyle/Tools/Generic/xboxtools.cpp uint32_t XamUserReadProfileSettingsEx(uint32_t title_id, uint32_t user_index, uint32_t xuid_count, be* xuids, @@ -993,14 +977,19 @@ dword_result_t XamUserGetOnlineCountryFromXUID_entry(qword_t xuid) { DECLARE_XAM_EXPORT1(XamUserGetOnlineCountryFromXUID, kUserProfiles, kImplemented); -constexpr uint8_t kStatsMaxAmount = 64; - -struct X_STATS_DETAILS { - xe::be id; - xe::be stats_amount; - xe::be stats[kStatsMaxAmount]; -}; -static_assert_size(X_STATS_DETAILS, 8 + kStatsMaxAmount * 2); +dword_result_t XamUserIsParentalControlled_entry(dword_t user_index) { + /* Notes: + - if (data_address < 1 || XamExecutingOnBehalfOfTitle == 0 || title id == + kDashboardID || user_type != offline) (type mask used in XamUserGetXUID) go + forward else return false + */ + const auto& user = kernel_state()->xam_state()->GetUserProfile(user_index); + if (!user || !user->IsParentalControlled()) { + return false; + } + return true; +} +DECLARE_XAM_EXPORT1(XamUserIsParentalControlled, kUserProfiles, kImplemented); dword_result_t XamUserCreateStatsEnumerator_entry( dword_t title_id, dword_t user_index, dword_t count, dword_t flags,