| | |
| | |
| |
|
| | #include "core/file_sys/content_archive.h" |
| | #include "core/file_sys/romfs.h" |
| | #include "core/file_sys/xts_archive.h" |
| | #include "core/hle/kernel/k_process.h" |
| | #include "core/loader/nax.h" |
| | #include "core/loader/nca.h" |
| |
|
| | namespace Loader { |
| | namespace { |
| | FileType IdentifyTypeImpl(const FileSys::NAX& nax) { |
| | if (nax.GetStatus() != ResultStatus::Success) { |
| | return FileType::Error; |
| | } |
| |
|
| | const auto nca = nax.AsNCA(); |
| | if (nca == nullptr || nca->GetStatus() != ResultStatus::Success) { |
| | return FileType::Error; |
| | } |
| |
|
| | return FileType::NAX; |
| | } |
| | } |
| |
|
| | AppLoader_NAX::AppLoader_NAX(FileSys::VirtualFile file_) |
| | : AppLoader(file_), nax(std::make_unique<FileSys::NAX>(file_)), |
| | nca_loader(std::make_unique<AppLoader_NCA>(nax->GetDecrypted())) {} |
| |
|
| | AppLoader_NAX::~AppLoader_NAX() = default; |
| |
|
| | FileType AppLoader_NAX::IdentifyType(const FileSys::VirtualFile& nax_file) { |
| | const FileSys::NAX nax(nax_file); |
| | return IdentifyTypeImpl(nax); |
| | } |
| |
|
| | FileType AppLoader_NAX::GetFileType() const { |
| | return IdentifyTypeImpl(*nax); |
| | } |
| |
|
| | AppLoader_NAX::LoadResult AppLoader_NAX::Load(Kernel::KProcess& process, Core::System& system) { |
| | if (is_loaded) { |
| | return {ResultStatus::ErrorAlreadyLoaded, {}}; |
| | } |
| |
|
| | const auto nax_status = nax->GetStatus(); |
| | if (nax_status != ResultStatus::Success) { |
| | return {nax_status, {}}; |
| | } |
| |
|
| | const auto nca = nax->AsNCA(); |
| | if (nca == nullptr) { |
| | if (!Core::Crypto::KeyManager::KeyFileExists(false)) { |
| | return {ResultStatus::ErrorMissingProductionKeyFile, {}}; |
| | } |
| |
|
| | return {ResultStatus::ErrorNAXInconvertibleToNCA, {}}; |
| | } |
| |
|
| | const auto nca_status = nca->GetStatus(); |
| | if (nca_status != ResultStatus::Success) { |
| | return {nca_status, {}}; |
| | } |
| |
|
| | const auto result = nca_loader->Load(process, system); |
| | if (result.first != ResultStatus::Success) { |
| | return result; |
| | } |
| |
|
| | is_loaded = true; |
| | return result; |
| | } |
| |
|
| | ResultStatus AppLoader_NAX::ReadRomFS(FileSys::VirtualFile& dir) { |
| | return nca_loader->ReadRomFS(dir); |
| | } |
| |
|
| | ResultStatus AppLoader_NAX::ReadProgramId(u64& out_program_id) { |
| | return nca_loader->ReadProgramId(out_program_id); |
| | } |
| |
|
| | ResultStatus AppLoader_NAX::ReadBanner(std::vector<u8>& buffer) { |
| | return nca_loader->ReadBanner(buffer); |
| | } |
| |
|
| | ResultStatus AppLoader_NAX::ReadLogo(std::vector<u8>& buffer) { |
| | return nca_loader->ReadLogo(buffer); |
| | } |
| |
|
| | ResultStatus AppLoader_NAX::ReadNSOModules(Modules& modules) { |
| | return nca_loader->ReadNSOModules(modules); |
| | } |
| |
|
| | } |
| |
|