|
|
|
@ -3,6 +3,7 @@ |
|
|
|
|
|
|
|
#include "common/scope_exit.h"
|
|
|
|
|
|
|
|
#include "core/file_sys/content_archive.h"
|
|
|
|
#include "core/file_sys/nca_metadata.h"
|
|
|
|
#include "core/file_sys/registered_cache.h"
|
|
|
|
#include "core/hle/kernel/k_process.h"
|
|
|
|
@ -20,7 +21,7 @@ Process::~Process() { |
|
|
|
this->Finalize(); |
|
|
|
} |
|
|
|
|
|
|
|
bool Process::Initialize(u64 program_id) { |
|
|
|
bool Process::Initialize(u64 program_id, u8 minimum_key_generation, u8 maximum_key_generation) { |
|
|
|
// First, ensure we are not holding another process.
|
|
|
|
this->Finalize(); |
|
|
|
|
|
|
|
@ -29,21 +30,33 @@ bool Process::Initialize(u64 program_id) { |
|
|
|
|
|
|
|
// Attempt to load program NCA.
|
|
|
|
const FileSys::RegisteredCache* bis_system{}; |
|
|
|
FileSys::VirtualFile nca{}; |
|
|
|
FileSys::VirtualFile nca_raw{}; |
|
|
|
|
|
|
|
// Get the program NCA from built-in storage.
|
|
|
|
bis_system = fsc.GetSystemNANDContents(); |
|
|
|
if (bis_system) { |
|
|
|
nca = bis_system->GetEntryRaw(program_id, FileSys::ContentRecordType::Program); |
|
|
|
nca_raw = bis_system->GetEntryRaw(program_id, FileSys::ContentRecordType::Program); |
|
|
|
} |
|
|
|
|
|
|
|
// Ensure we retrieved a program NCA.
|
|
|
|
if (!nca) { |
|
|
|
if (!nca_raw) { |
|
|
|
return false; |
|
|
|
} |
|
|
|
|
|
|
|
// Ensure we have a suitable version.
|
|
|
|
if (minimum_key_generation > 0) { |
|
|
|
FileSys::NCA nca(nca_raw); |
|
|
|
if (nca.GetStatus() == Loader::ResultStatus::Success && |
|
|
|
(nca.GetKeyGeneration() < minimum_key_generation || |
|
|
|
nca.GetKeyGeneration() > maximum_key_generation)) { |
|
|
|
LOG_WARNING(Service_LDR, "Skipping program {:016X} with generation {}", program_id, |
|
|
|
nca.GetKeyGeneration()); |
|
|
|
return false; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// Get the appropriate loader to parse this NCA.
|
|
|
|
auto app_loader = Loader::GetLoader(m_system, nca, program_id, 0); |
|
|
|
auto app_loader = Loader::GetLoader(m_system, nca_raw, program_id, 0); |
|
|
|
|
|
|
|
// Ensure we have a loader which can parse the NCA.
|
|
|
|
if (!app_loader) { |
|
|
|
|