summaryrefslogtreecommitdiff
path: root/src/core/loader/xci.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/loader/xci.cpp')
-rw-r--r--src/core/loader/xci.cpp36
1 files changed, 34 insertions, 2 deletions
diff --git a/src/core/loader/xci.cpp b/src/core/loader/xci.cpp
index eda67a8c8..ee5452eb9 100644
--- a/src/core/loader/xci.cpp
+++ b/src/core/loader/xci.cpp
@@ -9,7 +9,11 @@
9#include "core/file_sys/content_archive.h" 9#include "core/file_sys/content_archive.h"
10#include "core/file_sys/control_metadata.h" 10#include "core/file_sys/control_metadata.h"
11#include "core/file_sys/patch_manager.h" 11#include "core/file_sys/patch_manager.h"
12#include "core/file_sys/registered_cache.h"
13#include "core/file_sys/romfs.h"
14#include "core/file_sys/submission_package.h"
12#include "core/hle/kernel/process.h" 15#include "core/hle/kernel/process.h"
16#include "core/hle/service/filesystem/filesystem.h"
13#include "core/loader/nca.h" 17#include "core/loader/nca.h"
14#include "core/loader/xci.h" 18#include "core/loader/xci.h"
15 19
@@ -63,13 +67,41 @@ ResultStatus AppLoader_XCI::Load(Kernel::Process& process) {
63 if (result != ResultStatus::Success) 67 if (result != ResultStatus::Success)
64 return result; 68 return result;
65 69
70 FileSys::VirtualFile update_raw;
71 if (ReadUpdateRaw(update_raw) == ResultStatus::Success && update_raw != nullptr)
72 Service::FileSystem::SetPackedUpdate(std::move(update_raw));
73
66 is_loaded = true; 74 is_loaded = true;
67 75
68 return ResultStatus::Success; 76 return ResultStatus::Success;
69} 77}
70 78
71ResultStatus AppLoader_XCI::ReadRomFS(FileSys::VirtualFile& dir) { 79ResultStatus AppLoader_XCI::ReadRomFS(FileSys::VirtualFile& file) {
72 return nca_loader->ReadRomFS(dir); 80 return nca_loader->ReadRomFS(file);
81}
82
83u64 AppLoader_XCI::ReadRomFSIVFCOffset() const {
84 return nca_loader->ReadRomFSIVFCOffset();
85}
86
87ResultStatus AppLoader_XCI::ReadUpdateRaw(FileSys::VirtualFile& file) {
88 u64 program_id{};
89 nca_loader->ReadProgramId(program_id);
90 if (program_id == 0)
91 return ResultStatus::ErrorXCIMissingProgramNCA;
92
93 const auto read = xci->GetSecurePartitionNSP()->GetNCAFile(
94 FileSys::GetUpdateTitleID(program_id), FileSys::ContentRecordType::Program);
95
96 if (read == nullptr)
97 return ResultStatus::ErrorNoPackedUpdate;
98 const auto nca_test = std::make_shared<FileSys::NCA>(read);
99
100 if (nca_test->GetStatus() != ResultStatus::ErrorMissingBKTRBaseRomFS)
101 return nca_test->GetStatus();
102
103 file = read;
104 return ResultStatus::Success;
73} 105}
74 106
75ResultStatus AppLoader_XCI::ReadProgramId(u64& out_program_id) { 107ResultStatus AppLoader_XCI::ReadProgramId(u64& out_program_id) {