From e0b9ee9b941f3fb47a5b219d27c37081f379d05a Mon Sep 17 00:00:00 2001 From: Zach Hilman Date: Sun, 13 Oct 2019 14:18:09 -0400 Subject: card_image: Implement system update commands in XCI --- src/core/file_sys/card_image.cpp | 36 +++++++++++++++++++++++++++++- src/core/file_sys/partition_filesystem.cpp | 4 ++-- 2 files changed, 37 insertions(+), 3 deletions(-) (limited to 'src/core/file_sys') 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(partition); auto raw = main_hfs.GetFile(partition_names[partition_idx]); - partitions_raw[static_cast(partition)] = raw; + partitions_raw[static_cast(partition)] = std::move(raw); } secure_partition = std::make_shared( @@ -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 file) { std::string name( reinterpret_cast(&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( file, entry.size, content_offset + entry.offset, std::move(name))); -- cgit v1.2.3