diff --git a/src/xenia/kernel/xam/xam_user.cc b/src/xenia/kernel/xam/xam_user.cc index 1ecfe7771..055cc23b8 100644 --- a/src/xenia/kernel/xam/xam_user.cc +++ b/src/xenia/kernel/xam/xam_user.cc @@ -568,11 +568,11 @@ dword_result_t XamUserCreateAchievementEnumerator_entry( } if (buffer_size_ptr) { - *buffer_size_ptr = static_cast(entry_size) * count; + *buffer_size_ptr = static_cast(entry_size * count); } auto e = object_ref( - new XAchievementEnumerator(kernel_state(), count, flags)); + new XAchievementEnumerator(kernel_state(), count, offset, flags)); auto result = e->Initialize(user_index, 0xFB, 0xB000A, 0xB000B, 0); if (XFAILED(result)) { return result; @@ -595,15 +595,11 @@ dword_result_t XamUserCreateAchievementEnumerator_entry( kernel_state()->achievement_manager()->GetTitleAchievements( requester_xuid, title_id_); - const auto requested_achievements = user_title_achievements | - std::views::drop(offset) | - std::views::take(count); - - if (requested_achievements.empty()) { + if (user_title_achievements.empty()) { return X_ERROR_INVALID_PARAMETER; } - for (const auto& entry : requested_achievements) { + for (const auto& entry : user_title_achievements) { auto unlock_time = X_FILETIME(); if (entry.IsUnlocked() && entry.unlock_time.is_valid()) { unlock_time = entry.unlock_time; diff --git a/src/xenia/kernel/xenumerator.cc b/src/xenia/kernel/xenumerator.cc index 076886c33..fc21e483a 100644 --- a/src/xenia/kernel/xenumerator.cc +++ b/src/xenia/kernel/xenumerator.cc @@ -83,13 +83,12 @@ uint32_t XStaticUntypedEnumerator::WriteItems(uint8_t* buffer_data, uint32_t XAchievementEnumerator::WriteItems(uint8_t* buffer_data, uint32_t buffer_size, uint32_t* written_count) { - size_t count = std::min(items_.size() - current_item_, items_per_enumerate()); - if (!count) { + if (items_.size() - current_item_ <= 0) { return X_ERROR_NO_MORE_FILES; } - size_t size = count * item_size(); - + const size_t count = + std::min(items_.size() - current_item_, items_per_enumerate()); auto details = reinterpret_cast(buffer_data); size_t string_offset = items_per_enumerate() * sizeof(xam::X_ACHIEVEMENT_DETAILS); diff --git a/src/xenia/kernel/xenumerator.h b/src/xenia/kernel/xenumerator.h index 59a8b9578..7f8a8b8a7 100644 --- a/src/xenia/kernel/xenumerator.h +++ b/src/xenia/kernel/xenumerator.h @@ -139,12 +139,13 @@ class XStaticEnumerator : public XStaticUntypedEnumerator { class XAchievementEnumerator : public XEnumerator { public: XAchievementEnumerator(KernelState* kernel_state, size_t items_per_enumerate, - uint32_t flags) + size_t enumeration_offset, uint32_t flags) : XEnumerator( kernel_state, items_per_enumerate, sizeof(xam::X_ACHIEVEMENT_DETAILS) + (!!(flags & 7) ? xam::X_ACHIEVEMENT_DETAILS::kStringBufferSize : 0)), + current_item_(enumeration_offset), flags_(flags) {} void AppendItem(xam::AchievementDetails item) {