mirror of
https://github.com/xenia-project/xenia.git
synced 2025-12-06 07:12:03 +01:00
[XAM] Added overlap to XamReadTile
This commit is contained in:
parent
f6d9e76fca
commit
de3b49e356
|
|
@ -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,
|
qword_t item_id, dword_t user_index,
|
||||||
lpdword_t output_ptr,
|
lpdword_t output_ptr,
|
||||||
lpdword_t buffer_size_ptr,
|
lpdword_t buffer_size_ptr,
|
||||||
dword_t overlapped_ptr) {
|
lpvoid_t overlapped_ptr) {
|
||||||
auto user = kernel_state()->xam_state()->GetUserProfile(user_index);
|
auto user = kernel_state()->xam_state()->GetUserProfile(user_index);
|
||||||
if (!user) {
|
if (!user) {
|
||||||
user = kernel_state()->xam_state()->GetUserProfile(item_id);
|
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;
|
return X_ERROR_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
auto run = [=](uint32_t& extended_error, uint32_t& length) {
|
||||||
std::span<const uint8_t> tile =
|
std::span<const uint8_t> tile =
|
||||||
kernel_state()->xam_state()->user_tracker()->GetIcon(
|
kernel_state()->xam_state()->user_tracker()->GetIcon(
|
||||||
user->xuid(), title_id, static_cast<XTileType>(tile_type.value()),
|
user->xuid(), title_id, static_cast<XTileType>(tile_type.value()),
|
||||||
item_id);
|
item_id);
|
||||||
|
|
||||||
|
auto result = X_ERROR_SUCCESS;
|
||||||
|
|
||||||
if (tile.empty()) {
|
if (tile.empty()) {
|
||||||
return X_ERROR_FILE_NOT_FOUND;
|
result = X_ERROR_FILE_NOT_FOUND;
|
||||||
}
|
}
|
||||||
|
|
||||||
*buffer_size_ptr = static_cast<uint32_t>(tile.size());
|
*buffer_size_ptr = static_cast<uint32_t>(tile.size());
|
||||||
|
|
||||||
auto result = X_ERROR_SUCCESS;
|
|
||||||
|
|
||||||
if (output_ptr) {
|
if (output_ptr) {
|
||||||
memcpy(output_ptr, tile.data(), tile.size());
|
memcpy(output_ptr, tile.data(), tile.size());
|
||||||
} else {
|
} else {
|
||||||
result = X_ERROR_INSUFFICIENT_BUFFER;
|
result = X_ERROR_INSUFFICIENT_BUFFER;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (overlapped_ptr) {
|
extended_error = X_HRESULT_FROM_WIN32(result);
|
||||||
kernel_state()->CompleteOverlappedImmediate(overlapped_ptr, result);
|
length = 0;
|
||||||
return X_ERROR_IO_PENDING;
|
|
||||||
}
|
|
||||||
return result;
|
return result;
|
||||||
|
};
|
||||||
|
|
||||||
|
if (!overlapped_ptr) {
|
||||||
|
uint32_t extended_error, length;
|
||||||
|
return run(extended_error, length);
|
||||||
|
}
|
||||||
|
|
||||||
|
kernel_state()->CompleteOverlappedDeferredEx(run, overlapped_ptr);
|
||||||
|
return X_ERROR_IO_PENDING;
|
||||||
}
|
}
|
||||||
DECLARE_XAM_EXPORT1(XamReadTile, kUserProfiles, kSketchy);
|
DECLARE_XAM_EXPORT1(XamReadTile, kUserProfiles, kSketchy);
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue