[XAM] Fixed crash related to incorrect buffer size in UserPlaylist enum

- Replaced unk_ptr in XMP_CREATE_USER_PLAYLIST_ENUMERATOR
- Simplified logic in achievements StringBuffer
This commit is contained in:
Gliniak
2026-01-07 20:10:27 +01:00
committed by Radosław Gliński
parent 4b73839bf1
commit dce4d38c0a
6 changed files with 32 additions and 37 deletions

View File

@@ -69,7 +69,8 @@ X_HRESULT XamApp::DispatchMessageSync(uint32_t message, uint32_t buffer_ptr,
reinterpret_cast<uint8_t*>(&cross_title_data);
uint32_t item_count = 0;
X_RESULT result = e->WriteItems(0, cross_title_data_ptr, &item_count);
X_RESULT result = e->WriteItems(cross_title_data_ptr,
data_ptr->buffer_size, &item_count);
XCONTENT_DATA_INTERNAL* content_data_ptr =
memory_->TranslateVirtual<XCONTENT_DATA_INTERNAL*>(

View File

@@ -403,7 +403,7 @@ X_HRESULT XmpApp::DispatchMessageSync(uint32_t message, uint32_t buffer_ptr,
XELOGD("XMPCreateUserPlaylistEnumerator({:08X}, {:08X}, {:08X})",
uint32_t(args->xmp_client), uint32_t(args->flags),
uint32_t(args->unk_ptr));
uint32_t(args->object_ptr));
return X_E_SUCCESS;
}
case 0x00070029: {

View File

@@ -133,7 +133,7 @@ static_assert_size(XMP_GET_PLAYBACK_CONTROLLER, 0xC);
struct XMP_CREATE_USER_PLAYLIST_ENUMERATOR {
xe::be<uint32_t> xmp_client;
xe::be<uint32_t> flags;
xe::be<uint32_t> unk_ptr;
xe::be<uint32_t> object_ptr;
};
static_assert_size(XMP_CREATE_USER_PLAYLIST_ENUMERATOR, 0xC);

View File

@@ -30,15 +30,15 @@ uint32_t xeXamEnumerate(uint32_t handle, uint32_t flags, lpvoid_t buffer_ptr,
return X_ERROR_INVALID_HANDLE;
}
auto run = [e, buffer_ptr, overlapped_ptr](uint32_t& extended_error,
uint32_t& length) -> X_RESULT {
auto run = [e, buffer_ptr, buffer_size, overlapped_ptr](
uint32_t& extended_error, uint32_t& length) -> X_RESULT {
X_RESULT result;
uint32_t item_count = 0;
if (!buffer_ptr) {
result = X_ERROR_INVALID_PARAMETER;
} else {
result = e->WriteItems(buffer_ptr.guest_address(),
buffer_ptr.as<uint8_t*>(), &item_count);
result =
e->WriteItems(buffer_ptr.as<uint8_t*>(), buffer_size, &item_count);
}
extended_error = X_HRESULT_FROM_WIN32(result);
length = item_count;