aboutsummaryrefslogtreecommitdiff
path: root/src/core/core.cpp
diff options
context:
space:
mode:
authorAssuka <59313695+a55uka@users.noreply.github.com>2026-11-01 23:05:04 +0000
committerGitHub <noreply@github.com>2026-11-01 23:05:04 +0000
commit8eaea9d3769fecff3dd7202884f66423ed2c83b1 (patch)
tree789cce85b9d5bb3f5ba8a52cc0dab9701fc35826 /src/core/core.cpp
parent350c64706510b610bef4f925fe64c3d40f4fb86a (diff)
parentf6d03bc69d5bcda45bd054edda24521820c42deb (diff)
Merge pull request #258 from Djihads80/nx2
bring nx2-experimental up to date
Diffstat (limited to 'src/core/core.cpp')
-rw-r--r--src/core/core.cpp21
1 files changed, 20 insertions, 1 deletions
diff --git a/src/core/core.cpp b/src/core/core.cpp
index 41871df870..3842ee25a8 100644
--- a/src/core/core.cpp
+++ b/src/core/core.cpp
@@ -25,6 +25,7 @@
#include "core/debugger/debugger.h"
#include "core/device_memory.h"
#include "core/file_sys/fs_filesystem.h"
+#include "core/file_sys/nup_container.h"
#include "core/file_sys/patch_manager.h"
#include "core/file_sys/program_metadata.h"
#include "core/file_sys/registered_cache.h"
@@ -116,9 +117,27 @@ namespace {
// Switch 2 titles boot as a loose ExeFS, with main.npdm next to main.
bool IsSwitch2Program(const FileSys::VirtualFile& file) {
+ FileSys::ProgramMetadata metadata;
+ if (FileSys::NupContainer::IsNupFile(file)) {
+ FileSys::NupContainer nup{file};
+ if (nup.GetStatus() != Loader::ResultStatus::Success) {
+ return false;
+ }
+ std::optional<std::size_t> program;
+ if (const auto base = nup.FindBasePackage();
+ base && nup.GetExeFSDir(*base) != nullptr) {
+ program = base;
+ } else if (const auto update = nup.FindBestUpdatePackage();
+ update && nup.GetExeFSDir(*update) != nullptr) {
+ program = update;
+ }
+ const auto exefs = program ? nup.GetExeFSDir(*program) : nullptr;
+ const auto npdm = exefs != nullptr ? exefs->GetFile("main.npdm") : nullptr;
+ return npdm != nullptr && metadata.Load(npdm) == Loader::ResultStatus::Success &&
+ metadata.IsSwitch2();
+ }
const auto dir = file != nullptr ? file->GetContainingDirectory() : nullptr;
const auto npdm = dir != nullptr ? dir->GetFile("main.npdm") : nullptr;
- FileSys::ProgramMetadata metadata;
return npdm != nullptr && metadata.Load(npdm) == Loader::ResultStatus::Success &&
metadata.IsSwitch2();
}