|
|
@ -3,6 +3,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
#include "common/scope_exit.h"
|
|
|
|
#include "common/scope_exit.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/registered_cache.h"
|
|
|
|
#include "core/file_sys/registered_cache.h"
|
|
|
|
#include "core/hle/kernel/k_process.h"
|
|
|
|
#include "core/hle/kernel/k_process.h"
|
|
|
@ -20,7 +21,7 @@ Process::~Process() {
|
|
|
|
this->Finalize();
|
|
|
|
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.
|
|
|
|
// First, ensure we are not holding another process.
|
|
|
|
this->Finalize();
|
|
|
|
this->Finalize();
|
|
|
|
|
|
|
|
|
|
|
@ -29,21 +30,33 @@ bool Process::Initialize(u64 program_id) {
|
|
|
|
|
|
|
|
|
|
|
|
// Attempt to load program NCA.
|
|
|
|
// Attempt to load program NCA.
|
|
|
|
const FileSys::RegisteredCache* bis_system{};
|
|
|
|
const FileSys::RegisteredCache* bis_system{};
|
|
|
|
FileSys::VirtualFile nca{};
|
|
|
|
FileSys::VirtualFile nca_raw{};
|
|
|
|
|
|
|
|
|
|
|
|
// Get the program NCA from built-in storage.
|
|
|
|
// Get the program NCA from built-in storage.
|
|
|
|
bis_system = fsc.GetSystemNANDContents();
|
|
|
|
bis_system = fsc.GetSystemNANDContents();
|
|
|
|
if (bis_system) {
|
|
|
|
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.
|
|
|
|
// Ensure we retrieved a program NCA.
|
|
|
|
if (!nca) {
|
|
|
|
if (!nca_raw) {
|
|
|
|
return false;
|
|
|
|
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.
|
|
|
|
// 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.
|
|
|
|
// Ensure we have a loader which can parse the NCA.
|
|
|
|
if (!app_loader) {
|
|
|
|
if (!app_loader) {
|
|
|
|