From de3b49e356ffdafa365afad49f3ed4a6959a5990 Mon Sep 17 00:00:00 2001 From: Gliniak Date: Wed, 7 May 2025 20:41:34 +0200 Subject: [PATCH] [XAM] Added overlap to XamReadTile --- src/xenia/kernel/xam/xam_user.cc | 52 ++++++++++++++++++-------------- 1 file changed, 30 insertions(+), 22 deletions(-) diff --git a/src/xenia/kernel/xam/xam_user.cc b/src/xenia/kernel/xam/xam_user.cc index ccb3c6318..a5802f7b8 100644 --- a/src/xenia/kernel/xam/xam_user.cc +++ b/src/xenia/kernel/xam/xam_user.cc @@ -640,7 +640,7 @@ 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) { + lpvoid_t overlapped_ptr) { auto user = kernel_state()->xam_state()->GetUserProfile(user_index); if (!user) { user = kernel_state()->xam_state()->GetUserProfile(item_id); @@ -653,30 +653,38 @@ dword_result_t XamReadTile_entry(dword_t tile_type, dword_t title_id, 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); + auto run = [=](uint32_t& extended_error, uint32_t& length) { + 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; + auto result = X_ERROR_SUCCESS; + + if (tile.empty()) { + result = X_ERROR_FILE_NOT_FOUND; + } + + *buffer_size_ptr = static_cast(tile.size()); + + if (output_ptr) { + memcpy(output_ptr, tile.data(), tile.size()); + } else { + result = X_ERROR_INSUFFICIENT_BUFFER; + } + + extended_error = X_HRESULT_FROM_WIN32(result); + length = 0; + return result; + }; + + if (!overlapped_ptr) { + uint32_t extended_error, length; + return run(extended_error, length); } - *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; + kernel_state()->CompleteOverlappedDeferredEx(run, overlapped_ptr); + return X_ERROR_IO_PENDING; } DECLARE_XAM_EXPORT1(XamReadTile, kUserProfiles, kSketchy);