From d18f80457db1901a6aa8d743e6dc164d24936413 Mon Sep 17 00:00:00 2001 From: Gliniak Date: Mon, 5 May 2025 22:55:49 +0200 Subject: [PATCH] [XAM] Implemented: XamReadTile(Ex) - Added missing param to XamContentAggregateCreateEnumerator --- src/xenia/kernel/xam/xam_content_aggregate.cc | 10 ++-- src/xenia/kernel/xam/xam_user.cc | 51 +++++++++++++++++++ 2 files changed, 57 insertions(+), 4 deletions(-) diff --git a/src/xenia/kernel/xam/xam_content_aggregate.cc b/src/xenia/kernel/xam/xam_content_aggregate.cc index 7c81ba97d..389b21bef 100644 --- a/src/xenia/kernel/xam/xam_content_aggregate.cc +++ b/src/xenia/kernel/xam/xam_content_aggregate.cc @@ -79,7 +79,7 @@ void AddODDContentTest(object_ref> e, dword_result_t XamContentAggregateCreateEnumerator_entry(qword_t xuid, dword_t device_id, dword_t content_type, - unknown_t unk3, + dword_t title_id, lpdword_t handle_out) { assert_not_null(handle_out); @@ -99,12 +99,14 @@ dword_result_t XamContentAggregateCreateEnumerator_entry(qword_t xuid, extra->magic = kXObjSignature; extra->handle = e->handle(); - auto content_type_enum = XContentType(uint32_t(content_type)); + const XContentType content_type_enum = + static_cast(content_type.value()); if (!device_info || device_info->device_type == DeviceType::HDD) { // Fetch any alternate title IDs defined in the XEX header // (used by games to load saves from other titles, etc) - std::vector title_ids{kCurrentlyRunningTitleId}; + std::vector title_ids{title_id ? title_id.value() + : kCurrentlyRunningTitleId}; auto exe_module = kernel_state()->GetExecutableModule(); if (exe_module && exe_module->xex_module()) { const auto& alt_ids = exe_module->xex_module()->opt_alternate_title_ids(); @@ -112,7 +114,7 @@ dword_result_t XamContentAggregateCreateEnumerator_entry(qword_t xuid, std::back_inserter(title_ids)); } - for (auto& title_id : title_ids) { + for (const auto& title_id : title_ids) { // Get all content data. auto content_datas = kernel_state()->content_manager()->ListContent( static_cast(DummyDeviceId::HDD), diff --git a/src/xenia/kernel/xam/xam_user.cc b/src/xenia/kernel/xam/xam_user.cc index 971560bd3..e7cbe1690 100644 --- a/src/xenia/kernel/xam/xam_user.cc +++ b/src/xenia/kernel/xam/xam_user.cc @@ -631,6 +631,57 @@ dword_result_t XamUserCreateTitlesPlayedEnumerator_entry( } DECLARE_XAM_EXPORT1(XamUserCreateTitlesPlayedEnumerator, kUserProfiles, kStub); +dword_result_t XamReadTile_entry(dword_t tile_type, dword_t title_id, + qword_t item_id, dword_t user_index, + lpdword_t output_ptr, + lpdword_t buffer_size_ptr, + dword_t overlapped_ptr) { + auto user = kernel_state()->xam_state()->GetUserProfile(user_index); + if (!user) { + return X_ERROR_INVALID_PARAMETER; + } + + if (!buffer_size_ptr) { + return X_ERROR_INVALID_PARAMETER; + } + + std::span tile = + kernel_state()->xam_state()->user_tracker()->GetIcon( + user->xuid(), title_id, static_cast(tile_type.value()), + item_id); + + if (tile.empty()) { + return X_ERROR_FILE_NOT_FOUND; + } + + *buffer_size_ptr = static_cast(tile.size()); + + auto result = X_ERROR_SUCCESS; + + if (output_ptr) { + memcpy(output_ptr, tile.data(), tile.size()); + } else { + result = X_ERROR_INSUFFICIENT_BUFFER; + } + + if (overlapped_ptr) { + kernel_state()->CompleteOverlappedImmediate(overlapped_ptr, result); + return X_ERROR_IO_PENDING; + } + return result; +} +DECLARE_XAM_EXPORT1(XamReadTile, kUserProfiles, kSketchy); + +dword_result_t XamReadTileEx_entry(dword_t tile_type, dword_t game_id, + qword_t item_id, dword_t offset, + dword_t unk1, dword_t unk2, + lpdword_t output_ptr, + lpdword_t buffer_size_ptr) { + return XamReadTile_entry(tile_type, game_id, item_id, offset, output_ptr, + buffer_size_ptr, 0); +} +DECLARE_XAM_EXPORT1(XamReadTileEx, kUserProfiles, kSketchy); + dword_result_t XamParseGamerTileKey_entry(pointer_t key_ptr, lpdword_t title_id_ptr, lpdword_t big_tile_id_ptr,