[XAM] Add some proper error codes to a few XamUser functions

It might be worth finding games/apps that use these functions and see what error codes they check against...
This commit is contained in:
emoose 2020-01-10 23:43:27 +00:00
parent 82ada32647
commit d5bd7a8c8b
1 changed files with 14 additions and 5 deletions

View File

@ -589,9 +589,15 @@ dword_result_t XamUserCreateAchievementEnumerator(dword_t title_id,
dword_t offset, dword_t count,
lpdword_t buffer_size_ptr,
lpdword_t handle_ptr) {
if (!count || !buffer_size_ptr || !handle_ptr) {
// TODO: this should also happen if user_index >= 4, but dash seems to use
// 0xFF for some reason.. maybe a problem with some other piece of code?
return X_ERROR_INVALID_PARAMETER;
}
auto user_profile = kernel_state()->user_profile(user_index);
if (!user_profile) {
return X_ERROR_INVALID_PARAMETER; // TODO: proper error code!
return X_ERROR_FUNCTION_FAILED; // TODO: proper error code!
}
if (buffer_size_ptr) {
@ -610,12 +616,15 @@ dword_result_t XamUserCreateAchievementEnumerator(dword_t title_id,
XELOGE(
"XamUserCreateAchievementEnumerator failed to find GPD for title %X!",
title_id);
return X_ERROR_SUCCESS;
return X_ERROR_FUNCTION_FAILED;
}
std::vector<xdbf::Achievement> achievements;
game_gpd->GetAchievements(&achievements);
// TODO: sort by achieved date, and so achieved come before unachieved
// (maybe only if flags == -1?)
for (auto ach : achievements) {
auto* details = (X_XACHIEVEMENT_DETAILS*)e->AppendItem();
details->id = ach.id;
@ -776,7 +785,7 @@ dword_result_t XamReadTile(dword_t tile_type, dword_t game_id, qword_t item_id,
auto user_profile = kernel_state()->user_profile(image_id);
if (!user_profile) {
return X_ERROR_INVALID_PARAMETER; // TODO: proper error code!
return X_ERROR_FILE_NOT_FOUND; // TODO: proper error code!
}
auto file_path = user_profile->path();
@ -791,7 +800,7 @@ dword_result_t XamReadTile(dword_t tile_type, dword_t game_id, qword_t item_id,
} else {
auto user_profile = kernel_state()->user_profile(user_index);
if (!user_profile) {
return X_ERROR_INVALID_PARAMETER; // TODO: proper error code!
return X_ERROR_FILE_NOT_FOUND; // TODO: proper error code!
}
auto gpd = user_profile->GetTitleGpd(game_id.value());
@ -818,7 +827,7 @@ dword_result_t XamReadTile(dword_t tile_type, dword_t game_id, qword_t item_id,
auto passed_size = *buffer_size_ptr;
*buffer_size_ptr = (uint32_t)data_len;
auto ret_val = X_ERROR_INVALID_PARAMETER;
auto ret_val = X_ERROR_INSUFFICIENT_BUFFER;
if (passed_size >= *buffer_size_ptr) {
memcpy_s(output_ptr, *buffer_size_ptr, data, data_len);