[Kernel] Check XAM is attached using bounding path

This commit is contained in:
Adrian 2025-08-15 22:37:13 +01:00 committed by Radosław Gliński
parent a9fb32a2fd
commit e66028f0ff
3 changed files with 20 additions and 1 deletions

View file

@ -589,6 +589,7 @@ X_STATUS Emulator::LaunchXexFile(const std::filesystem::path& path) {
file_system_->RegisterSymbolicLink("font:", mount_path);
auto module = kernel_state_->LoadUserModule("xam.xex");
if (!module) {
module = kernel_state_->LoadUserModule("$flash_xam.xex");
}
@ -596,6 +597,7 @@ X_STATUS Emulator::LaunchXexFile(const std::filesystem::path& path) {
if (module) {
result = kernel_state_->FinishLoadingUserModule(module, false);
}
return result;
}

View file

@ -35,6 +35,22 @@ uint32_t UserModule::title_id() const {
return 0;
}
std::string UserModule::bounding_filename() const {
std::string bounding_filename = "";
if (module_format_ != kModuleFormatXex) {
return bounding_filename;
}
xex2_opt_bound_path* bounding_path = nullptr;
if (xex_module()->GetOptHeader(XEX_HEADER_BOUNDING_PATH, &bounding_path)) {
bounding_filename =
utf8::find_base_name_from_guest_path(std::string(bounding_path->path));
}
return bounding_filename;
}
uint32_t UserModule::disc_number() const {
if (module_format_ != kModuleFormatXex) {
return 1;

View file

@ -61,6 +61,7 @@ class UserModule : public XModule {
uint32_t guest_xex_header() const { return guest_xex_header_; }
// The title ID in the xex header or 0 if this is not a xex.
uint32_t title_id() const;
std::string bounding_filename() const;
uint32_t disc_number() const;
bool is_multi_disc_title() const;
@ -68,7 +69,7 @@ class UserModule : public XModule {
bool is_dll_module() const { return is_dll_module_; }
bool is_attached() const {
// Special case for skipping real XAM initialization as it will fail.
if (name_ == "xam" || name_ == "$flash_xam") {
if (bounding_filename() == "xam") {
return true;
}
return is_attached_;