Compare commits

...

3 Commits

Author SHA1 Message Date
Adrian 3347b4495e
Merge fbac8dc0e5 into 3d79874828 2024-12-21 17:04:04 +00:00
Adrian 3d79874828 [XAM] Fixed profile setting for preferred color
Fixes Supreme Commander from crashing.
2024-12-21 14:58:16 +01:00
Adrian fbac8dc0e5 [XAM] Implemented XamUserLogon 2024-11-28 17:55:03 +00:00
4 changed files with 97 additions and 2 deletions

View File

@ -52,9 +52,9 @@ UserProfile::UserProfile(uint64_t xuid, X_XAMACCOUNTINFO* account_info)
// XPROFILE_GAMER_CONTROL_SENSITIVITY
AddSetting(std::make_unique<UserSetting>(0x10040018, 0));
// Preferred color 1
AddSetting(std::make_unique<UserSetting>(0x1004001D, 0xFFFF0000u));
AddSetting(std::make_unique<UserSetting>(0x1004001D, PREFERRED_COLOR_NONE));
// Preferred color 2
AddSetting(std::make_unique<UserSetting>(0x1004001E, 0xFF00FF00u));
AddSetting(std::make_unique<UserSetting>(0x1004001E, PREFERRED_COLOR_NONE));
// XPROFILE_GAMER_ACTION_AUTO_AIM
AddSetting(std::make_unique<UserSetting>(0x10040022, 1));
// XPROFILE_GAMER_ACTION_AUTO_CENTER

View File

@ -35,6 +35,21 @@ enum class X_USER_PROFILE_SETTING_SOURCE : uint32_t {
UNKNOWN = 3,
};
enum PREFERRED_COLOR_OPTIONS : uint32_t {
PREFERRED_COLOR_NONE,
PREFERRED_COLOR_BLACK,
PREFERRED_COLOR_WHITE,
PREFERRED_COLOR_YELLOW,
PREFERRED_COLOR_ORANGE,
PREFERRED_COLOR_PINK,
PREFERRED_COLOR_RED,
PREFERRED_COLOR_PURPLE,
PREFERRED_COLOR_BLUE,
PREFERRED_COLOR_GREEN,
PREFERRED_COLOR_BROWN,
PREFERRED_COLOR_SILVER
};
// Each setting contains 0x18 bytes long header
struct X_USER_PROFILE_SETTING_HEADER {
xe::be<uint32_t> setting_id;

View File

@ -861,6 +861,79 @@ dword_result_t XamProfileFindAccount_entry(
}
DECLARE_XAM_EXPORT1(XamProfileFindAccount, kUserProfiles, kImplemented);
// https://github.com/TeaModz/XeLiveStealth-Full-Source/blob/d4a7439ac6241c4a13e883a6f156623d1c08f6eb/XeLive/Utils.cpp#L416
dword_result_t XamUserLogon_entry(lpqword_t xuids_ptr, dword_t flags,
pointer_t<XAM_OVERLAPPED> overlapped_ptr) {
assert_true(flags == X_USER_LOGON_SIGNIN || flags == X_USER_LOGON_SIGNIN_2 ||
flags == X_USER_LOGON_SIGNOUT ||
flags == X_USER_LOGON_SIGNOUT_2 ||
flags == X_USER_LOGON_SIGNOUT_3);
if (!xuids_ptr) {
return X_ERROR_INVALID_PARAMETER;
}
auto run = [xuids_ptr, flags](uint32_t& extended_error,
uint32_t& length) -> X_RESULT {
auto const profile_manager = kernel_state()->xam_state()->profile_manager();
X_STATUS result = X_ERROR_FUNCTION_FAILED;
for (uint32_t user_index = 0; user_index < XUserMaxUserCount;
user_index++) {
const uint64_t xuid = xuids_ptr[user_index];
const bool xuid_entry = xuid;
if ((flags & X_USER_LOGON_SIGNIN) == X_USER_LOGON_SIGNIN ||
(flags & X_USER_LOGON_SIGNIN_2) == X_USER_LOGON_SIGNIN_2) {
// XUID available
if (xuid_entry) {
if (!kernel_state()->xam_state()->IsUserSignedIn(xuid)) {
profile_manager->Login(xuid, XUserIndexAny, true);
}
}
result = X_ERROR_SUCCESS;
} else if ((flags & X_USER_LOGON_SIGNOUT) == X_USER_LOGON_SIGNOUT) {
// XUID not available
if (!xuid_entry) {
if (kernel_state()->xam_state()->IsUserSignedIn(user_index)) {
profile_manager->Logout(user_index, true);
}
}
result = X_ERROR_SUCCESS;
} else if ((flags & X_USER_LOGON_SIGNOUT_2) == X_USER_LOGON_SIGNOUT_2 ||
(flags & X_USER_LOGON_SIGNOUT_3) == X_USER_LOGON_SIGNOUT_3) {
// XUID available
if (kernel_state()->xam_state()->IsUserSignedIn(xuid)) {
const uint8_t assigned_index =
profile_manager->GetUserIndexAssignedToProfile(xuid);
profile_manager->Logout(assigned_index, true);
}
result = X_ERROR_SUCCESS;
}
}
extended_error = X_HRESULT_FROM_WIN32(result);
length = 0;
return result;
};
if (!overlapped_ptr) {
uint32_t extended_error, length = 0;
return run(extended_error, length);
} else {
kernel_state()->CompleteOverlappedDeferredEx(run, overlapped_ptr);
return X_ERROR_IO_PENDING;
}
}
DECLARE_XAM_EXPORT1(XamUserLogon, kUserProfiles, kImplemented);
} // namespace xam
} // namespace kernel
} // namespace xe

View File

@ -128,6 +128,13 @@ typedef uint32_t X_HRESULT;
#define X_E_NOTFOUND X_HRESULT_FROM_WIN32(X_ERROR_NOT_FOUND)
#define X_E_NO_SUCH_USER X_HRESULT_FROM_WIN32(X_ERROR_NO_SUCH_USER)
#define X_USER_LOGON_SIGNOUT 0x23
#define X_USER_LOGON_SIGNOUT_2 0x48 // Blades
#define X_USER_LOGON_SIGNOUT_3 0x13 // Testing Network
#define X_USER_LOGON_SIGNIN 0x424
#define X_USER_LOGON_SIGNIN_2 0x25 // NXE
#define X_USER_LOGON_SIGNIN_3 0x14 // Blades OOBE profile creation
//IOCTL_, used by NtDeviceIoControlFile
constexpr uint32_t X_IOCTL_DISK_GET_DRIVE_GEOMETRY = 0x70000;
constexpr uint32_t X_IOCTL_DISK_GET_PARTITION_INFO = 0x74004;