diff options
Diffstat (limited to 'src/core')
-rw-r--r-- | src/core/file_sys/card_image.cpp | 36 | ||||
-rw-r--r-- | src/core/file_sys/partition_filesystem.cpp | 4 |
2 files changed, 37 insertions, 3 deletions
diff --git a/src/core/file_sys/card_image.cpp b/src/core/file_sys/card_image.cpp index a6a68b748..07d0c8d5d 100644 --- a/src/core/file_sys/card_image.cpp +++ b/src/core/file_sys/card_image.cpp @@ -57,7 +57,7 @@ XCI::XCI(VirtualFile file_) const auto partition_idx = static_cast<std::size_t>(partition); auto raw = main_hfs.GetFile(partition_names[partition_idx]); - partitions_raw[static_cast<std::size_t>(partition)] = raw; + partitions_raw[static_cast<std::size_t>(partition)] = std::move(raw); } secure_partition = std::make_shared<NSP>( @@ -172,6 +172,40 @@ u64 XCI::GetProgramTitleID() const { return secure_partition->GetProgramTitleID(); } +u32 XCI::GetSystemUpdateVersion() { + const auto update = GetPartition(XCIPartition::Update); + if (update == nullptr) + return 0; + + for (const auto& file : update->GetFiles()) { + NCA nca{file, nullptr, 0, keys}; + + if (nca.GetStatus() != Loader::ResultStatus::Success) + continue; + + if (nca.GetType() == NCAContentType::Meta && nca.GetTitleId() == 0x0100000000000816) { + const auto dir = nca.GetSubdirectories()[0]; + const auto cnmt = dir->GetFile("SystemUpdate_0100000000000816.cnmt"); + if (cnmt == nullptr) + continue; + + CNMT cnmt_data{cnmt}; + + const auto metas = cnmt_data.GetMetaRecords(); + if (metas.empty()) + continue; + + return metas[0].title_version; + } + } + + return 0; +} + +u64 XCI::GetSystemUpdateTitleID() const { + return 0x0100000000000816; +} + bool XCI::HasProgramNCA() const { return program != nullptr; } diff --git a/src/core/file_sys/partition_filesystem.cpp b/src/core/file_sys/partition_filesystem.cpp index 932409d79..846986736 100644 --- a/src/core/file_sys/partition_filesystem.cpp +++ b/src/core/file_sys/partition_filesystem.cpp @@ -65,8 +65,8 @@ PartitionFilesystem::PartitionFilesystem(std::shared_ptr<VfsFile> file) { std::string name( reinterpret_cast<const char*>(&file_data[strtab_offset + entry.strtab_offset])); - offsets[name] = content_offset + entry.offset; - sizes[name] = entry.size; + offsets.insert_or_assign(name, content_offset + entry.offset); + sizes.insert_or_assign(name, entry.size); pfs_files.emplace_back(std::make_shared<OffsetVfsFile>( file, entry.size, content_offset + entry.offset, std::move(name))); |