mirror of
https://github.com/xenia-project/xenia.git
synced 2025-12-06 07:12:03 +01:00
[XAM] Cleanup XEnumerateCrossTitle
This commit is contained in:
parent
c83522060e
commit
d9092fb232
|
|
@ -36,51 +36,52 @@ X_HRESULT XamApp::DispatchMessageSync(uint32_t message, uint32_t buffer_ptr,
|
|||
auto buffer = memory_->TranslateVirtual(buffer_ptr);
|
||||
switch (message) {
|
||||
case 0x0002000E: {
|
||||
struct message_data {
|
||||
xe::be<uint32_t> user_index;
|
||||
xe::be<uint32_t> unk_04;
|
||||
xe::be<uint32_t> extra_ptr;
|
||||
xe::be<uint32_t> buffer_ptr;
|
||||
xe::be<uint32_t> buffer_size;
|
||||
xe::be<uint32_t> unk_14;
|
||||
xe::be<uint32_t> length_ptr;
|
||||
xe::be<uint32_t> unk_1C;
|
||||
}* data = reinterpret_cast<message_data*>(buffer);
|
||||
X_ENUMERATE_PARAM* data_ptr =
|
||||
reinterpret_cast<X_ENUMERATE_PARAM*>(buffer);
|
||||
|
||||
XELOGD(
|
||||
"XamAppEnumerateContentAggregate({}, {:08X}, {:08X}, {:08X}, {}, "
|
||||
"{:08X}, {:08X}, {:08X})",
|
||||
(uint32_t)data->user_index, (uint32_t)data->unk_04,
|
||||
(uint32_t)data->extra_ptr, (uint32_t)data->buffer_ptr,
|
||||
(uint32_t)data->buffer_size, (uint32_t)data->unk_14,
|
||||
(uint32_t)data->length_ptr, (uint32_t)data->unk_1C);
|
||||
if (!data->buffer_ptr || !data->extra_ptr) {
|
||||
"XEnumerateCrossTitle({:04X}, {:04X}, {:04X}, {:04X}, {}, {}, "
|
||||
"{:04X})",
|
||||
data_ptr->user_index.get(), data_ptr->flags.get(),
|
||||
data_ptr->private_enum_structure_ptr.get(),
|
||||
data_ptr->buffer_ptr.get(), data_ptr->buffer_size.get(),
|
||||
data_ptr->items_requested.get(), data_ptr->items_returned_ptr.get());
|
||||
|
||||
if (!data_ptr->buffer_ptr || !data_ptr->private_enum_structure_ptr) {
|
||||
return X_E_INVALIDARG;
|
||||
}
|
||||
|
||||
auto extra = memory_->TranslateVirtual<X_KENUMERATOR_CONTENT_AGGREGATE*>(
|
||||
data->extra_ptr);
|
||||
auto buffer = memory_->TranslateVirtual(data->buffer_ptr);
|
||||
auto enum_struct =
|
||||
memory_->TranslateVirtual<X_KENUMERATOR_CONTENT_AGGREGATE*>(
|
||||
data_ptr->private_enum_structure_ptr);
|
||||
|
||||
auto e = kernel_state_->object_table()->LookupObject<XEnumerator>(
|
||||
extra->handle);
|
||||
enum_struct->handle);
|
||||
|
||||
if (!e) {
|
||||
return X_E_INVALIDARG;
|
||||
}
|
||||
assert_true(extra->magic == kXObjSignature);
|
||||
if (data->buffer_size) {
|
||||
std::memset(buffer, 0, data->buffer_size);
|
||||
}
|
||||
uint32_t item_count = 0;
|
||||
auto result = e->WriteItems(data->buffer_ptr, buffer, &item_count);
|
||||
|
||||
if (result == X_ERROR_SUCCESS && item_count >= 1) {
|
||||
if (data->length_ptr) {
|
||||
auto length_ptr =
|
||||
memory_->TranslateVirtual<be<uint32_t>*>(data->length_ptr);
|
||||
*length_ptr = 1;
|
||||
}
|
||||
return X_E_SUCCESS;
|
||||
assert_true(enum_struct->magic == kXObjSignature);
|
||||
|
||||
// This is a struct of XCONTENT_AGGREGATE_DATA
|
||||
uint8_t* content_data_ptr =
|
||||
memory_->TranslateVirtual<uint8_t*>(data_ptr->buffer_ptr);
|
||||
|
||||
std::memset(content_data_ptr, 0, data_ptr->buffer_size);
|
||||
|
||||
uint32_t item_count = 0;
|
||||
X_RESULT result = e->WriteItems(0, content_data_ptr, &item_count);
|
||||
|
||||
result = X_HRESULT_FROM_WIN32(result);
|
||||
|
||||
if (result == X_E_SUCCESS && data_ptr->items_returned_ptr &&
|
||||
item_count >= 1) {
|
||||
xe::store_and_swap<uint32_t>(
|
||||
memory_->TranslateVirtual(data_ptr->items_returned_ptr), 1);
|
||||
}
|
||||
return X_E_NO_MORE_FILES;
|
||||
|
||||
return result;
|
||||
}
|
||||
case 0x00020021: {
|
||||
struct XContentQueryVolumeDeviceType {
|
||||
|
|
|
|||
|
|
@ -76,6 +76,7 @@ void AddODDContentTest(object_ref<XStaticEnumerator<XCONTENT_AGGREGATE_DATA>> e,
|
|||
}
|
||||
}
|
||||
|
||||
// Alias XContentCreateCrossTitleEnumerator
|
||||
dword_result_t XamContentAggregateCreateEnumerator_entry(qword_t xuid,
|
||||
dword_t device_id,
|
||||
dword_t content_type,
|
||||
|
|
|
|||
|
|
@ -19,6 +19,15 @@
|
|||
namespace xe {
|
||||
namespace kernel {
|
||||
|
||||
enum X_ENUMERATION_FLAGS : uint32_t {
|
||||
None = 0x0,
|
||||
Back = 0x1,
|
||||
Foreground = 0x2,
|
||||
MatchingInstance = 0x4,
|
||||
IncludePartialDownloads = 0x8,
|
||||
IncludeCorruptContent = 0x10,
|
||||
};
|
||||
|
||||
struct X_KENUMERATOR {
|
||||
be<uint32_t> app_id;
|
||||
be<uint32_t> open_message;
|
||||
|
|
@ -29,10 +38,22 @@ struct X_KENUMERATOR {
|
|||
};
|
||||
static_assert_size(X_KENUMERATOR, 0x18);
|
||||
|
||||
struct X_ENUMERATE_PARAM {
|
||||
xe::be<uint32_t> user_index;
|
||||
xe::be<uint32_t> flags;
|
||||
xe::be<uint32_t> private_enum_structure_ptr;
|
||||
xe::be<uint32_t> buffer_ptr; // XCONTENT_DATA_INTERNAL
|
||||
xe::be<uint32_t> buffer_size;
|
||||
xe::be<uint32_t> items_requested;
|
||||
xe::be<uint32_t> items_returned_ptr;
|
||||
};
|
||||
static_assert_size(X_ENUMERATE_PARAM, 0x1C);
|
||||
|
||||
struct X_KENUMERATOR_CONTENT_AGGREGATE {
|
||||
be<uint32_t> magic;
|
||||
be<uint32_t> handle;
|
||||
};
|
||||
static_assert_size(X_KENUMERATOR_CONTENT_AGGREGATE, 0x8);
|
||||
|
||||
class XEnumerator : public XObject {
|
||||
public:
|
||||
|
|
|
|||
Loading…
Reference in a new issue