diff options
Diffstat (limited to 'src/core/loader/deconstructed_rom_directory.cpp')
| -rw-r--r-- | src/core/loader/deconstructed_rom_directory.cpp | 39 |
1 files changed, 36 insertions, 3 deletions
diff --git a/src/core/loader/deconstructed_rom_directory.cpp b/src/core/loader/deconstructed_rom_directory.cpp index 5e2ec7e0b9..1dce245f7f 100644 --- a/src/core/loader/deconstructed_rom_directory.cpp +++ b/src/core/loader/deconstructed_rom_directory.cpp @@ -13,6 +13,7 @@ #include "core/file_sys/control_metadata.h" #include "core/file_sys/patch_manager.h" #include "core/file_sys/romfs_factory.h" +#include "core/file_sys/romfs.h" #include "core/hle/kernel/k_page_table.h" #include "core/hle/kernel/k_process.h" #include "core/hle/service/filesystem/filesystem.h" @@ -129,10 +130,14 @@ AppLoader_DeconstructedRomDirectory::AppLoader_DeconstructedRomDirectory( : AppLoader(directory->GetFile("main")) , dir(std::move(directory)) , override_update(override_update_) + , standalone(false) {} FileType AppLoader_DeconstructedRomDirectory::IdentifyType(const FileSys::VirtualFile& dir_file) { - if (FileSys::IsDirectoryExeFS(dir_file->GetContainingDirectory())) { + const auto directory = dir_file->GetContainingDirectory(); + if (dir_file->GetName() == "main" && directory && + AppLoader_NSO::IdentifyType(dir_file) == FileType::NSO && + FileSys::IsDirectoryExeFS(directory)) { return FileType::DeconstructedRomDirectory; } @@ -182,11 +187,11 @@ AppLoader_DeconstructedRomDirectory::LoadResult AppLoader_DeconstructedRomDirect } metadata.Print(); - // Enable NCE only for applications with 39-bit address space. + // Extended ACID programs currently require the Dynarmic compatibility path. const bool is_39bit = metadata.GetAddressSpaceType() == FileSys::ProgramAddressSpaceType::Is39Bit; const bool is_application = metadata.GetPoolPartition() == FileSys::PoolPartition::Application; - Settings::SetNceEnabled(is_39bit); + Settings::SetNceEnabled(is_39bit && !metadata.UsesExtendedAcid()); const std::array static_modules = {"rtld", "main", "subsdk0", "subsdk1", "subsdk2", "subsdk3", "subsdk4", "subsdk5", "subsdk6", "subsdk7", @@ -267,11 +272,39 @@ AppLoader_DeconstructedRomDirectory::LoadResult AppLoader_DeconstructedRomDirect } is_loaded = true; + if (standalone) { + title_id = metadata.GetTitleID(); + system.GetFileSystemController().RegisterProcess( + process.GetProcessId(), {}, + std::make_shared<FileSys::RomFSFactory>(*this, system.GetContentProvider(), + system.GetFileSystemController())); + } return {ResultStatus::Success, LoadParameters{metadata.GetMainThreadPriority(), metadata.GetMainThreadStackSize()}}; } ResultStatus AppLoader_DeconstructedRomDirectory::ReadRomFS(FileSys::VirtualFile& out_dir) { + if (romfs == nullptr && standalone) { + const auto directory = file->GetContainingDirectory(); + for (const auto& entry : directory->GetFiles()) { + if (entry->GetExtension() == "romfs") { + romfs = entry; + break; + } + } + if (romfs == nullptr) { + auto loose = directory->GetSubdirectory("romfs"); + if (!loose && directory->GetName() == "exefs") { + const auto parent = directory->GetParentDirectory(); + if (parent) { + loose = parent->GetSubdirectory("romfs"); + } + } + if (loose) { + romfs = FileSys::CreateRomFS(std::move(loose)); + } + } + } if (romfs == nullptr) { return ResultStatus::ErrorNoRomFS; } |
