Compare commits

...

1 Commits

Author SHA1 Message Date
Feng Chen bcb602bdb0 Fix load by program index invalid 2021-06-29 22:43:50 +08:00
4 changed files with 22 additions and 19 deletions
+4 -5
View File
@@ -62,13 +62,12 @@ XCI::XCI(VirtualFile file_, std::size_t program_index)
}
secure_partition = std::make_shared<NSP>(
main_hfs.GetFile(partition_names[static_cast<std::size_t>(XCIPartition::Secure)]),
program_index);
main_hfs.GetFile(partition_names[static_cast<std::size_t>(XCIPartition::Secure)]));
ncas = secure_partition->GetNCAsCollapsed();
program =
secure_partition->GetNCA(secure_partition->GetProgramTitleID(), ContentRecordType::Program);
program_nca_status = secure_partition->GetProgramStatus(secure_partition->GetProgramTitleID());
const auto title_id = secure_partition->GetProgramTitleID(program_index);
program = secure_partition->GetNCA(title_id, ContentRecordType::Program);
program_nca_status = secure_partition->GetProgramStatus(title_id);
if (program_nca_status == Loader::ResultStatus::ErrorNSPMissingProgramNCA) {
program_nca_status = Loader::ResultStatus::ErrorXCIMissingProgramNCA;
}
+14 -8
View File
@@ -20,8 +20,8 @@
namespace FileSys {
NSP::NSP(VirtualFile file_, std::size_t program_index_)
: file(std::move(file_)), program_index(program_index_), status{Loader::ResultStatus::Success},
NSP::NSP(VirtualFile file_)
: file(std::move(file_)), status{Loader::ResultStatus::Success},
pfs(std::make_shared<PartitionFilesystem>(file)), keys{Core::Crypto::KeyManager::Instance()} {
if (pfs->GetStatus() != Loader::ResultStatus::Success) {
status = pfs->GetStatus();
@@ -62,12 +62,14 @@ u64 NSP::GetFirstTitleID() const {
return GetProgramTitleID();
}
if (program_status.empty())
const auto ids = GetTitleIDs();
if (ids.empty())
return 0;
return program_status.begin()->first;
return ids[0];
}
u64 NSP::GetProgramTitleID() const {
u64 NSP::GetProgramTitleID(std::size_t index) const {
if (IsExtractedType()) {
if (GetExeFS() == nullptr || !IsDirectoryExeFS(GetExeFS())) {
return 0;
@@ -81,11 +83,15 @@ u64 NSP::GetProgramTitleID() const {
}
}
const auto out = GetFirstTitleID();
const auto ids = GetTitleIDs();
if (index > ids.size()) {
return 0;
}
const auto out = ids[index];
if ((out & 0x800) == 0)
return out;
const auto ids = GetTitleIDs();
const auto iter =
std::find_if(ids.begin(), ids.end(), [](u64 tid) { return (tid & 0x800) == 0; });
return iter == ids.end() ? out : *iter;
@@ -146,7 +152,7 @@ std::shared_ptr<NCA> NSP::GetNCA(u64 title_id, ContentRecordType type, TitleType
if (extracted)
LOG_WARNING(Service_FS, "called on an NSP that is of type extracted.");
const auto title_id_iter = ncas.find(title_id + program_index);
const auto title_id_iter = ncas.find(title_id);
if (title_id_iter == ncas.end())
return nullptr;
+2 -4
View File
@@ -27,14 +27,14 @@ enum class ContentRecordType : u8;
class NSP : public ReadOnlyVfsDirectory {
public:
explicit NSP(VirtualFile file_, std::size_t program_index_ = 0);
explicit NSP(VirtualFile file_);
~NSP() override;
Loader::ResultStatus GetStatus() const;
Loader::ResultStatus GetProgramStatus(u64 title_id) const;
// Should only be used when one title id can be assured.
u64 GetFirstTitleID() const;
u64 GetProgramTitleID() const;
u64 GetProgramTitleID(std::size_t program_index = 0) const;
std::vector<u64> GetTitleIDs() const;
bool IsExtractedType() const;
@@ -69,8 +69,6 @@ private:
VirtualFile file;
const std::size_t program_index;
bool extracted = false;
Loader::ResultStatus status;
std::map<u64, Loader::ResultStatus> program_status;
+2 -2
View File
@@ -25,8 +25,8 @@ AppLoader_NSP::AppLoader_NSP(FileSys::VirtualFile file_,
const Service::FileSystem::FileSystemController& fsc,
const FileSys::ContentProvider& content_provider,
std::size_t program_index)
: AppLoader(file_), nsp(std::make_unique<FileSys::NSP>(file_, program_index)),
title_id(nsp->GetProgramTitleID()) {
: AppLoader(file_), nsp(std::make_unique<FileSys::NSP>(file_)),
title_id(nsp->GetProgramTitleID(program_index)) {
if (nsp->GetStatus() != ResultStatus::Success) {
return;