From 0547e5258937aee8d33f0a214755e29421fe34f7 Mon Sep 17 00:00:00 2001 From: Adrian <78108584+AdrianCassar@users.noreply.github.com> Date: Sat, 15 Mar 2025 19:39:25 +0000 Subject: [PATCH] [XAM] Improved XContentQueryVolumeDeviceType --- src/xenia/kernel/xam/apps/xam_app.cc | 44 ++++++++++++++++------- src/xenia/kernel/xam/xam_content_device.h | 1 + 2 files changed, 33 insertions(+), 12 deletions(-) diff --git a/src/xenia/kernel/xam/apps/xam_app.cc b/src/xenia/kernel/xam/apps/xam_app.cc index e6f0645d9..650360a47 100644 --- a/src/xenia/kernel/xam/apps/xam_app.cc +++ b/src/xenia/kernel/xam/apps/xam_app.cc @@ -12,6 +12,7 @@ #include "xenia/base/logging.h" #include "xenia/base/threading.h" #include "xenia/kernel/kernel_state.h" +#include "xenia/kernel/xam/xam_content_device.h" #include "xenia/kernel/xenumerator.h" // Notes: @@ -79,18 +80,37 @@ X_HRESULT XamApp::DispatchMessageSync(uint32_t message, uint32_t buffer_ptr, return X_E_NO_MORE_FILES; } case 0x00020021: { - struct message_data { - char unk_00[64]; - xe::be unk_40; // KeGetCurrentProcessType() < 1 ? 1 : 0 - xe::be unk_44; // ? output_ptr ? - xe::be unk_48; // ? overlapped_ptr ? - }* data = reinterpret_cast(buffer); - assert_true(buffer_length == sizeof(message_data)); - auto unk = memory_->TranslateVirtual*>(data->unk_44); - *unk = 0; - XELOGD("XamApp(0x00020021)('{}', {:08X}, {:08X}, {:08X})", data->unk_00, - (uint32_t)data->unk_40, (uint32_t)data->unk_44, - (uint32_t)data->unk_48); + struct XContentQueryVolumeDeviceType { + char root_name[64]; + xe::be is_title_process; + xe::be device_type_ptr; + xe::be overlapped_ptr; + }* data = reinterpret_cast(buffer); + assert_true(buffer_length == sizeof(XContentQueryVolumeDeviceType)); + + xe::be* device_type_ptr = + memory_->TranslateVirtual*>( + static_cast(data->device_type_ptr.get())); + + switch (kernel_state_->deployment_type_) { + case XDeploymentType::kGoD: + case XDeploymentType::kHardDrive: { + *device_type_ptr = DeviceType::HDD; + } break; + case XDeploymentType::kOpticalDisc: { + *device_type_ptr = DeviceType::ODD; + } break; + default: { + *device_type_ptr = DeviceType::Invalid; + } break; + } + + XELOGD("XContentQueryVolumeDeviceType('{}', {:08X}, {:08X}, {:08X})", + data->root_name, + static_cast(data->is_title_process.get()), + static_cast(data->device_type_ptr.get()), + static_cast(data->overlapped_ptr.get())); + return X_E_SUCCESS; } case 0x00021012: { diff --git a/src/xenia/kernel/xam/xam_content_device.h b/src/xenia/kernel/xam/xam_content_device.h index a895cbcca..c4bb57982 100644 --- a/src/xenia/kernel/xam/xam_content_device.h +++ b/src/xenia/kernel/xam/xam_content_device.h @@ -17,6 +17,7 @@ namespace kernel { namespace xam { enum class DeviceType : uint32_t { + Invalid = 0, HDD = 1, ODD = 4, };