Skip to content
Snippets Groups Projects
Commit b957a486 authored by Zach Hilman's avatar Zach Hilman
Browse files

nsp: Correct status codes for extracted NSPs

Avoids all extracted NSPs being marked as error file type because they don't have program NCAs.
parent 1c75945d
No related branches found
No related tags found
No related merge requests found
...@@ -14,6 +14,7 @@ ...@@ -14,6 +14,7 @@
#include "core/file_sys/content_archive.h" #include "core/file_sys/content_archive.h"
#include "core/file_sys/nca_metadata.h" #include "core/file_sys/nca_metadata.h"
#include "core/file_sys/partition_filesystem.h" #include "core/file_sys/partition_filesystem.h"
#include "core/file_sys/program_metadata.h"
#include "core/file_sys/submission_package.h" #include "core/file_sys/submission_package.h"
#include "core/loader/loader.h" #include "core/loader/loader.h"
...@@ -78,6 +79,10 @@ Loader::ResultStatus NSP::GetStatus() const { ...@@ -78,6 +79,10 @@ Loader::ResultStatus NSP::GetStatus() const {
} }
Loader::ResultStatus NSP::GetProgramStatus(u64 title_id) const { Loader::ResultStatus NSP::GetProgramStatus(u64 title_id) const {
if (IsExtractedType() && GetExeFS() != nullptr && FileSys::IsDirectoryExeFS(GetExeFS())) {
return Loader::ResultStatus::Success;
}
const auto iter = program_status.find(title_id); const auto iter = program_status.find(title_id);
if (iter == program_status.end()) if (iter == program_status.end())
return Loader::ResultStatus::ErrorNSPMissingProgramNCA; return Loader::ResultStatus::ErrorNSPMissingProgramNCA;
......
...@@ -26,20 +26,18 @@ AppLoader_NSP::AppLoader_NSP(FileSys::VirtualFile file) ...@@ -26,20 +26,18 @@ AppLoader_NSP::AppLoader_NSP(FileSys::VirtualFile file)
if (nsp->GetStatus() != ResultStatus::Success) if (nsp->GetStatus() != ResultStatus::Success)
return; return;
if (nsp->IsExtractedType())
return;
const auto control_nca =
nsp->GetNCA(nsp->GetProgramTitleID(), FileSys::ContentRecordType::Control);
if (control_nca == nullptr || control_nca->GetStatus() != ResultStatus::Success)
return;
std::tie(nacp_file, icon_file) =
FileSys::PatchManager(nsp->GetProgramTitleID()).ParseControlNCA(*control_nca);
if (nsp->IsExtractedType()) { if (nsp->IsExtractedType()) {
secondary_loader = std::make_unique<AppLoader_DeconstructedRomDirectory>(nsp->GetExeFS()); secondary_loader = std::make_unique<AppLoader_DeconstructedRomDirectory>(nsp->GetExeFS());
} else { } else {
const auto control_nca =
nsp->GetNCA(nsp->GetProgramTitleID(), FileSys::ContentRecordType::Control);
if (control_nca == nullptr || control_nca->GetStatus() != ResultStatus::Success)
return;
std::tie(nacp_file, icon_file) =
FileSys::PatchManager(nsp->GetProgramTitleID()).ParseControlNCA(*control_nca);
if (title_id == 0) if (title_id == 0)
return; return;
...@@ -56,11 +54,11 @@ FileType AppLoader_NSP::IdentifyType(const FileSys::VirtualFile& file) { ...@@ -56,11 +54,11 @@ FileType AppLoader_NSP::IdentifyType(const FileSys::VirtualFile& file) {
if (nsp.GetStatus() == ResultStatus::Success) { if (nsp.GetStatus() == ResultStatus::Success) {
// Extracted Type case // Extracted Type case
if (nsp.IsExtractedType() && nsp.GetExeFS() != nullptr && if (nsp.IsExtractedType() && nsp.GetExeFS() != nullptr &&
FileSys::IsDirectoryExeFS(nsp.GetExeFS()) && nsp.GetRomFS() != nullptr) { FileSys::IsDirectoryExeFS(nsp.GetExeFS())) {
return FileType::NSP; return FileType::NSP;
} }
// Non-Ectracted Type case // Non-Extracted Type case
if (!nsp.IsExtractedType() && if (!nsp.IsExtractedType() &&
nsp.GetNCA(nsp.GetFirstTitleID(), FileSys::ContentRecordType::Program) != nullptr && nsp.GetNCA(nsp.GetFirstTitleID(), FileSys::ContentRecordType::Program) != nullptr &&
AppLoader_NCA::IdentifyType(nsp.GetNCAFile( AppLoader_NCA::IdentifyType(nsp.GetNCAFile(
...@@ -91,7 +89,8 @@ AppLoader_NSP::LoadResult AppLoader_NSP::Load(Kernel::Process& process) { ...@@ -91,7 +89,8 @@ AppLoader_NSP::LoadResult AppLoader_NSP::Load(Kernel::Process& process) {
return {nsp_program_status, {}}; return {nsp_program_status, {}};
} }
if (nsp->GetNCA(title_id, FileSys::ContentRecordType::Program) == nullptr) { if (!nsp->IsExtractedType() &&
nsp->GetNCA(title_id, FileSys::ContentRecordType::Program) == nullptr) {
if (!Core::Crypto::KeyManager::KeyFileExists(false)) { if (!Core::Crypto::KeyManager::KeyFileExists(false)) {
return {ResultStatus::ErrorMissingProductionKeyFile, {}}; return {ResultStatus::ErrorMissingProductionKeyFile, {}};
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment