[XAM/USER] - Implement XamUserIsParentalControlled

- Implement XamUserIsParentalControlled which is used in 584807F7
- Move some structs into xam.h
This commit is contained in:
The-Little-Wolf
2025-12-16 16:31:01 -08:00
committed by Radosław Gliński
parent ccd5c50c74
commit 2e61df76f0
2 changed files with 38 additions and 24 deletions

View File

@@ -222,6 +222,22 @@ static_assert_size(X_PASSPORT_SESSION_TOKEN, 0x1C);
#pragma pack(pop) #pragma pack(pop)
struct X_USER_SIGNIN_INFO {
xe::be<uint64_t> xuid;
xe::be<uint32_t> flags;
xe::be<uint32_t> signin_state;
xe::be<uint32_t> guest_num;
xe::be<uint32_t> sponsor_user_index;
char name[16];
};
static_assert_size(X_USER_SIGNIN_INFO, 40);
struct X_USER_READ_PROFILE_SETTINGS {
xe::be<uint32_t> setting_count;
xe::be<uint32_t> settings_ptr;
};
static_assert_size(X_USER_READ_PROFILE_SETTINGS, 8);
// clang-format off // clang-format off
#define XMBox_NOICON 0x00000000 #define XMBox_NOICON 0x00000000
#define XMBox_ERRORICON 0x00000001 #define XMBox_ERRORICON 0x00000001
@@ -343,6 +359,15 @@ struct XMP_USER_PLAYLIST_INFO {
}; };
static_assert_size(XMP_USER_PLAYLIST_INFO, 0x334); static_assert_size(XMP_USER_PLAYLIST_INFO, 0x334);
constexpr uint8_t kStatsMaxAmount = 64;
struct X_STATS_DETAILS {
xe::be<uint32_t> id;
xe::be<uint32_t> stats_amount;
xe::be<uint16_t> stats[kStatsMaxAmount];
};
static_assert_size(X_STATS_DETAILS, 8 + kStatsMaxAmount * 2);
} // namespace xam } // namespace xam
} // namespace kernel } // namespace kernel
} // namespace xe } // namespace xe

View File

@@ -103,16 +103,6 @@ dword_result_t XamUserGetSigninState_entry(dword_t user_index) {
DECLARE_XAM_EXPORT2(XamUserGetSigninState, kUserProfiles, kImplemented, DECLARE_XAM_EXPORT2(XamUserGetSigninState, kUserProfiles, kImplemented,
kHighFrequency); kHighFrequency);
typedef struct {
xe::be<uint64_t> xuid;
xe::be<uint32_t> flags;
xe::be<uint32_t> signin_state;
xe::be<uint32_t> guest_num;
xe::be<uint32_t> sponsor_user_index;
char name[16];
} X_USER_SIGNIN_INFO;
static_assert_size(X_USER_SIGNIN_INFO, 40);
X_HRESULT_result_t XamUserGetSigninInfo_entry( X_HRESULT_result_t XamUserGetSigninInfo_entry(
dword_t user_index, dword_t flags, pointer_t<X_USER_SIGNIN_INFO> info) { dword_t user_index, dword_t flags, pointer_t<X_USER_SIGNIN_INFO> info) {
if (!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); DECLARE_XAM_EXPORT1(XamUserGetGamerTag, kUserProfiles, kImplemented);
typedef struct {
xe::be<uint32_t> setting_count;
xe::be<uint32_t> 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 // 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 XamUserReadProfileSettingsEx(uint32_t title_id, uint32_t user_index,
uint32_t xuid_count, be<uint64_t>* xuids, uint32_t xuid_count, be<uint64_t>* xuids,
@@ -993,14 +977,19 @@ dword_result_t XamUserGetOnlineCountryFromXUID_entry(qword_t xuid) {
DECLARE_XAM_EXPORT1(XamUserGetOnlineCountryFromXUID, kUserProfiles, DECLARE_XAM_EXPORT1(XamUserGetOnlineCountryFromXUID, kUserProfiles,
kImplemented); kImplemented);
constexpr uint8_t kStatsMaxAmount = 64; dword_result_t XamUserIsParentalControlled_entry(dword_t user_index) {
/* Notes:
struct X_STATS_DETAILS { - if (data_address < 1 || XamExecutingOnBehalfOfTitle == 0 || title id ==
xe::be<uint32_t> id; kDashboardID || user_type != offline) (type mask used in XamUserGetXUID) go
xe::be<uint32_t> stats_amount; forward else return false
xe::be<uint16_t> stats[kStatsMaxAmount]; */
}; const auto& user = kernel_state()->xam_state()->GetUserProfile(user_index);
static_assert_size(X_STATS_DETAILS, 8 + kStatsMaxAmount * 2); if (!user || !user->IsParentalControlled()) {
return false;
}
return true;
}
DECLARE_XAM_EXPORT1(XamUserIsParentalControlled, kUserProfiles, kImplemented);
dword_result_t XamUserCreateStatsEnumerator_entry( dword_result_t XamUserCreateStatsEnumerator_entry(
dword_t title_id, dword_t user_index, dword_t count, dword_t flags, dword_t title_id, dword_t user_index, dword_t count, dword_t flags,