Merge pull request #6269 from lioncash/file-shadow
file_sys: Resolve cases of variable shadowing
This commit is contained in:
commit
c17a59b58e
|
@ -176,26 +176,30 @@ u64 XCI::GetProgramTitleID() const {
|
||||||
|
|
||||||
u32 XCI::GetSystemUpdateVersion() {
|
u32 XCI::GetSystemUpdateVersion() {
|
||||||
const auto update = GetPartition(XCIPartition::Update);
|
const auto update = GetPartition(XCIPartition::Update);
|
||||||
if (update == nullptr)
|
if (update == nullptr) {
|
||||||
return 0;
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
for (const auto& file : update->GetFiles()) {
|
for (const auto& update_file : update->GetFiles()) {
|
||||||
NCA nca{file, nullptr, 0};
|
NCA nca{update_file, nullptr, 0};
|
||||||
|
|
||||||
if (nca.GetStatus() != Loader::ResultStatus::Success)
|
if (nca.GetStatus() != Loader::ResultStatus::Success) {
|
||||||
continue;
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
if (nca.GetType() == NCAContentType::Meta && nca.GetTitleId() == 0x0100000000000816) {
|
if (nca.GetType() == NCAContentType::Meta && nca.GetTitleId() == 0x0100000000000816) {
|
||||||
const auto dir = nca.GetSubdirectories()[0];
|
const auto dir = nca.GetSubdirectories()[0];
|
||||||
const auto cnmt = dir->GetFile("SystemUpdate_0100000000000816.cnmt");
|
const auto cnmt = dir->GetFile("SystemUpdate_0100000000000816.cnmt");
|
||||||
if (cnmt == nullptr)
|
if (cnmt == nullptr) {
|
||||||
continue;
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
CNMT cnmt_data{cnmt};
|
CNMT cnmt_data{cnmt};
|
||||||
|
|
||||||
const auto metas = cnmt_data.GetMetaRecords();
|
const auto metas = cnmt_data.GetMetaRecords();
|
||||||
if (metas.empty())
|
if (metas.empty()) {
|
||||||
continue;
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
return metas[0].title_version;
|
return metas[0].title_version;
|
||||||
}
|
}
|
||||||
|
@ -262,8 +266,8 @@ VirtualDir XCI::ConcatenatedPseudoDirectory() {
|
||||||
if (part == nullptr)
|
if (part == nullptr)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
for (const auto& file : part->GetFiles())
|
for (const auto& part_file : part->GetFiles())
|
||||||
out->AddFile(file);
|
out->AddFile(part_file);
|
||||||
}
|
}
|
||||||
|
|
||||||
return out;
|
return out;
|
||||||
|
@ -283,12 +287,12 @@ Loader::ResultStatus XCI::AddNCAFromPartition(XCIPartition part) {
|
||||||
return Loader::ResultStatus::ErrorXCIMissingPartition;
|
return Loader::ResultStatus::ErrorXCIMissingPartition;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (const VirtualFile& file : partition->GetFiles()) {
|
for (const VirtualFile& partition_file : partition->GetFiles()) {
|
||||||
if (file->GetExtension() != "nca") {
|
if (partition_file->GetExtension() != "nca") {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto nca = std::make_shared<NCA>(file, nullptr, 0);
|
auto nca = std::make_shared<NCA>(partition_file, nullptr, 0);
|
||||||
if (nca->IsUpdate()) {
|
if (nca->IsUpdate()) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include <optional>
|
#include <optional>
|
||||||
|
#include <ranges>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
|
|
||||||
#include "common/logging/log.h"
|
#include "common/logging/log.h"
|
||||||
|
@ -136,12 +137,11 @@ NCA::NCA(VirtualFile file_, VirtualFile bktr_base_romfs_, u64 bktr_base_ivfc_off
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
has_rights_id = std::any_of(header.rights_id.begin(), header.rights_id.end(),
|
has_rights_id = std::ranges::any_of(header.rights_id, [](char c) { return c != '\0'; });
|
||||||
[](char c) { return c != '\0'; });
|
|
||||||
|
|
||||||
const std::vector<NCASectionHeader> sections = ReadSectionHeaders();
|
const std::vector<NCASectionHeader> sections = ReadSectionHeaders();
|
||||||
is_update = std::any_of(sections.begin(), sections.end(), [](const NCASectionHeader& header) {
|
is_update = std::ranges::any_of(sections, [](const NCASectionHeader& nca_header) {
|
||||||
return header.raw.header.crypto_type == NCASectionCryptoType::BKTR;
|
return nca_header.raw.header.crypto_type == NCASectionCryptoType::BKTR;
|
||||||
});
|
});
|
||||||
|
|
||||||
if (!ReadSections(sections, bktr_base_ivfc_offset)) {
|
if (!ReadSections(sections, bktr_base_ivfc_offset)) {
|
||||||
|
@ -202,8 +202,9 @@ bool NCA::HandlePotentialHeaderDecryption() {
|
||||||
|
|
||||||
std::vector<NCASectionHeader> NCA::ReadSectionHeaders() const {
|
std::vector<NCASectionHeader> NCA::ReadSectionHeaders() const {
|
||||||
const std::ptrdiff_t number_sections =
|
const std::ptrdiff_t number_sections =
|
||||||
std::count_if(std::begin(header.section_tables), std::end(header.section_tables),
|
std::ranges::count_if(header.section_tables, [](const NCASectionTableEntry& entry) {
|
||||||
[](NCASectionTableEntry entry) { return entry.media_offset > 0; });
|
return entry.media_offset > 0;
|
||||||
|
});
|
||||||
|
|
||||||
std::vector<NCASectionHeader> sections(number_sections);
|
std::vector<NCASectionHeader> sections(number_sections);
|
||||||
const auto length_sections = SECTION_HEADER_SIZE * number_sections;
|
const auto length_sections = SECTION_HEADER_SIZE * number_sections;
|
||||||
|
@ -312,11 +313,11 @@ bool NCA::ReadRomFSSection(const NCASectionHeader& section, const NCASectionTabl
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<RelocationBucket> relocation_buckets(relocation_buckets_raw.size());
|
std::vector<RelocationBucket> relocation_buckets(relocation_buckets_raw.size());
|
||||||
std::transform(relocation_buckets_raw.begin(), relocation_buckets_raw.end(),
|
std::ranges::transform(relocation_buckets_raw, relocation_buckets.begin(),
|
||||||
relocation_buckets.begin(), &ConvertRelocationBucketRaw);
|
&ConvertRelocationBucketRaw);
|
||||||
std::vector<SubsectionBucket> subsection_buckets(subsection_buckets_raw.size());
|
std::vector<SubsectionBucket> subsection_buckets(subsection_buckets_raw.size());
|
||||||
std::transform(subsection_buckets_raw.begin(), subsection_buckets_raw.end(),
|
std::ranges::transform(subsection_buckets_raw, subsection_buckets.begin(),
|
||||||
subsection_buckets.begin(), &ConvertSubsectionBucketRaw);
|
&ConvertSubsectionBucketRaw);
|
||||||
|
|
||||||
u32 ctr_low;
|
u32 ctr_low;
|
||||||
std::memcpy(&ctr_low, section.raw.section_ctr.data(), sizeof(ctr_low));
|
std::memcpy(&ctr_low, section.raw.section_ctr.data(), sizeof(ctr_low));
|
||||||
|
|
|
@ -126,16 +126,17 @@ static u64 romfs_get_hash_table_count(u64 num_entries) {
|
||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
void RomFSBuildContext::VisitDirectory(VirtualDir root_romfs, VirtualDir ext,
|
void RomFSBuildContext::VisitDirectory(VirtualDir root_romfs, VirtualDir ext_dir,
|
||||||
std::shared_ptr<RomFSBuildDirectoryContext> parent) {
|
std::shared_ptr<RomFSBuildDirectoryContext> parent) {
|
||||||
std::vector<std::shared_ptr<RomFSBuildDirectoryContext>> child_dirs;
|
std::vector<std::shared_ptr<RomFSBuildDirectoryContext>> child_dirs;
|
||||||
|
|
||||||
VirtualDir dir;
|
VirtualDir dir;
|
||||||
|
|
||||||
if (parent->path_len == 0)
|
if (parent->path_len == 0) {
|
||||||
dir = root_romfs;
|
dir = root_romfs;
|
||||||
else
|
} else {
|
||||||
dir = root_romfs->GetDirectoryRelative(parent->path);
|
dir = root_romfs->GetDirectoryRelative(parent->path);
|
||||||
|
}
|
||||||
|
|
||||||
const auto entries = dir->GetEntries();
|
const auto entries = dir->GetEntries();
|
||||||
|
|
||||||
|
@ -147,8 +148,9 @@ void RomFSBuildContext::VisitDirectory(VirtualDir root_romfs, VirtualDir ext,
|
||||||
child->path_len = child->cur_path_ofs + static_cast<u32>(kv.first.size());
|
child->path_len = child->cur_path_ofs + static_cast<u32>(kv.first.size());
|
||||||
child->path = parent->path + "/" + kv.first;
|
child->path = parent->path + "/" + kv.first;
|
||||||
|
|
||||||
if (ext != nullptr && ext->GetFileRelative(child->path + ".stub") != nullptr)
|
if (ext_dir != nullptr && ext_dir->GetFileRelative(child->path + ".stub") != nullptr) {
|
||||||
continue;
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
// Sanity check on path_len
|
// Sanity check on path_len
|
||||||
ASSERT(child->path_len < FS_MAX_PATH);
|
ASSERT(child->path_len < FS_MAX_PATH);
|
||||||
|
@ -163,21 +165,20 @@ void RomFSBuildContext::VisitDirectory(VirtualDir root_romfs, VirtualDir ext,
|
||||||
child->path_len = child->cur_path_ofs + static_cast<u32>(kv.first.size());
|
child->path_len = child->cur_path_ofs + static_cast<u32>(kv.first.size());
|
||||||
child->path = parent->path + "/" + kv.first;
|
child->path = parent->path + "/" + kv.first;
|
||||||
|
|
||||||
if (ext != nullptr && ext->GetFileRelative(child->path + ".stub") != nullptr)
|
if (ext_dir != nullptr && ext_dir->GetFileRelative(child->path + ".stub") != nullptr) {
|
||||||
continue;
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
// Sanity check on path_len
|
// Sanity check on path_len
|
||||||
ASSERT(child->path_len < FS_MAX_PATH);
|
ASSERT(child->path_len < FS_MAX_PATH);
|
||||||
|
|
||||||
child->source = root_romfs->GetFileRelative(child->path);
|
child->source = root_romfs->GetFileRelative(child->path);
|
||||||
|
|
||||||
if (ext != nullptr) {
|
if (ext_dir != nullptr) {
|
||||||
const auto ips = ext->GetFileRelative(child->path + ".ips");
|
if (const auto ips = ext_dir->GetFileRelative(child->path + ".ips")) {
|
||||||
|
if (auto patched = PatchIPS(child->source, ips)) {
|
||||||
if (ips != nullptr) {
|
|
||||||
auto patched = PatchIPS(child->source, ips);
|
|
||||||
if (patched != nullptr)
|
|
||||||
child->source = std::move(patched);
|
child->source = std::move(patched);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -188,7 +189,7 @@ void RomFSBuildContext::VisitDirectory(VirtualDir root_romfs, VirtualDir ext,
|
||||||
}
|
}
|
||||||
|
|
||||||
for (auto& child : child_dirs) {
|
for (auto& child : child_dirs) {
|
||||||
this->VisitDirectory(root_romfs, ext, child);
|
this->VisitDirectory(root_romfs, ext_dir, child);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -59,7 +59,7 @@ private:
|
||||||
u64 file_hash_table_size = 0;
|
u64 file_hash_table_size = 0;
|
||||||
u64 file_partition_size = 0;
|
u64 file_partition_size = 0;
|
||||||
|
|
||||||
void VisitDirectory(VirtualDir filesys, VirtualDir ext,
|
void VisitDirectory(VirtualDir filesys, VirtualDir ext_dir,
|
||||||
std::shared_ptr<RomFSBuildDirectoryContext> parent);
|
std::shared_ptr<RomFSBuildDirectoryContext> parent);
|
||||||
|
|
||||||
bool AddDirectory(std::shared_ptr<RomFSBuildDirectoryContext> parent_dir_ctx,
|
bool AddDirectory(std::shared_ptr<RomFSBuildDirectoryContext> parent_dir_ctx,
|
||||||
|
|
|
@ -83,11 +83,14 @@ BKTR::~BKTR() = default;
|
||||||
|
|
||||||
std::size_t BKTR::Read(u8* data, std::size_t length, std::size_t offset) const {
|
std::size_t BKTR::Read(u8* data, std::size_t length, std::size_t offset) const {
|
||||||
// Read out of bounds.
|
// Read out of bounds.
|
||||||
if (offset >= relocation.size)
|
if (offset >= relocation.size) {
|
||||||
return 0;
|
return 0;
|
||||||
const auto relocation = GetRelocationEntry(offset);
|
}
|
||||||
const auto section_offset = offset - relocation.address_patch + relocation.address_source;
|
|
||||||
const auto bktr_read = relocation.from_patch;
|
const auto relocation_entry = GetRelocationEntry(offset);
|
||||||
|
const auto section_offset =
|
||||||
|
offset - relocation_entry.address_patch + relocation_entry.address_source;
|
||||||
|
const auto bktr_read = relocation_entry.from_patch;
|
||||||
|
|
||||||
const auto next_relocation = GetNextRelocationEntry(offset);
|
const auto next_relocation = GetNextRelocationEntry(offset);
|
||||||
|
|
||||||
|
@ -106,15 +109,16 @@ std::size_t BKTR::Read(u8* data, std::size_t length, std::size_t offset) const {
|
||||||
return bktr_romfs->Read(data, length, section_offset);
|
return bktr_romfs->Read(data, length, section_offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
const auto subsection = GetSubsectionEntry(section_offset);
|
const auto subsection_entry = GetSubsectionEntry(section_offset);
|
||||||
Core::Crypto::AESCipher<Core::Crypto::Key128> cipher(key, Core::Crypto::Mode::CTR);
|
Core::Crypto::AESCipher<Core::Crypto::Key128> cipher(key, Core::Crypto::Mode::CTR);
|
||||||
|
|
||||||
// Calculate AES IV
|
// Calculate AES IV
|
||||||
std::array<u8, 16> iv{};
|
std::array<u8, 16> iv{};
|
||||||
auto subsection_ctr = subsection.ctr;
|
auto subsection_ctr = subsection_entry.ctr;
|
||||||
auto offset_iv = section_offset + base_offset;
|
auto offset_iv = section_offset + base_offset;
|
||||||
for (std::size_t i = 0; i < section_ctr.size(); ++i)
|
for (std::size_t i = 0; i < section_ctr.size(); ++i) {
|
||||||
iv[i] = section_ctr[0x8 - i - 1];
|
iv[i] = section_ctr[0x8 - i - 1];
|
||||||
|
}
|
||||||
offset_iv >>= 4;
|
offset_iv >>= 4;
|
||||||
for (std::size_t i = 0; i < sizeof(u64); ++i) {
|
for (std::size_t i = 0; i < sizeof(u64); ++i) {
|
||||||
iv[0xF - i] = static_cast<u8>(offset_iv & 0xFF);
|
iv[0xF - i] = static_cast<u8>(offset_iv & 0xFF);
|
||||||
|
|
|
@ -281,14 +281,14 @@ NcaID PlaceholderCache::Generate() {
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
VirtualFile RegisteredCache::OpenFileOrDirectoryConcat(const VirtualDir& dir,
|
VirtualFile RegisteredCache::OpenFileOrDirectoryConcat(const VirtualDir& open_dir,
|
||||||
std::string_view path) const {
|
std::string_view path) const {
|
||||||
const auto file = dir->GetFileRelative(path);
|
const auto file = open_dir->GetFileRelative(path);
|
||||||
if (file != nullptr) {
|
if (file != nullptr) {
|
||||||
return file;
|
return file;
|
||||||
}
|
}
|
||||||
|
|
||||||
const auto nca_dir = dir->GetDirectoryRelative(path);
|
const auto nca_dir = open_dir->GetDirectoryRelative(path);
|
||||||
if (nca_dir == nullptr) {
|
if (nca_dir == nullptr) {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
@ -431,13 +431,15 @@ void RegisteredCache::ProcessFiles(const std::vector<NcaID>& ids) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void RegisteredCache::AccumulateYuzuMeta() {
|
void RegisteredCache::AccumulateYuzuMeta() {
|
||||||
const auto dir = this->dir->GetSubdirectory("yuzu_meta");
|
const auto meta_dir = dir->GetSubdirectory("yuzu_meta");
|
||||||
if (dir == nullptr)
|
if (meta_dir == nullptr) {
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
for (const auto& file : dir->GetFiles()) {
|
for (const auto& file : meta_dir->GetFiles()) {
|
||||||
if (file->GetExtension() != "cnmt")
|
if (file->GetExtension() != "cnmt") {
|
||||||
continue;
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
CNMT cnmt(file);
|
CNMT cnmt(file);
|
||||||
yuzu_meta.insert_or_assign(cnmt.GetTitleID(), std::move(cnmt));
|
yuzu_meta.insert_or_assign(cnmt.GetTitleID(), std::move(cnmt));
|
||||||
|
@ -445,8 +447,10 @@ void RegisteredCache::AccumulateYuzuMeta() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void RegisteredCache::Refresh() {
|
void RegisteredCache::Refresh() {
|
||||||
if (dir == nullptr)
|
if (dir == nullptr) {
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
const auto ids = AccumulateFiles();
|
const auto ids = AccumulateFiles();
|
||||||
ProcessFiles(ids);
|
ProcessFiles(ids);
|
||||||
AccumulateYuzuMeta();
|
AccumulateYuzuMeta();
|
||||||
|
@ -566,7 +570,7 @@ InstallResult RegisteredCache::InstallEntry(const NSP& nsp, bool overwrite_if_ex
|
||||||
}
|
}
|
||||||
|
|
||||||
const auto meta_id_raw = (*meta_iter)->GetName().substr(0, 32);
|
const auto meta_id_raw = (*meta_iter)->GetName().substr(0, 32);
|
||||||
const auto meta_id = Common::HexStringToArray<16>(meta_id_raw);
|
const auto meta_id_data = Common::HexStringToArray<16>(meta_id_raw);
|
||||||
|
|
||||||
if ((*meta_iter)->GetSubdirectories().empty()) {
|
if ((*meta_iter)->GetSubdirectories().empty()) {
|
||||||
LOG_ERROR(Loader,
|
LOG_ERROR(Loader,
|
||||||
|
@ -591,7 +595,7 @@ InstallResult RegisteredCache::InstallEntry(const NSP& nsp, bool overwrite_if_ex
|
||||||
const auto result = RemoveExistingEntry(title_id);
|
const auto result = RemoveExistingEntry(title_id);
|
||||||
|
|
||||||
// Install Metadata File
|
// Install Metadata File
|
||||||
const auto res = RawInstallNCA(**meta_iter, copy, overwrite_if_exists, meta_id);
|
const auto res = RawInstallNCA(**meta_iter, copy, overwrite_if_exists, meta_id_data);
|
||||||
if (res != InstallResult::Success) {
|
if (res != InstallResult::Success) {
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
@ -741,15 +745,15 @@ InstallResult RegisteredCache::RawInstallNCA(const NCA& nca, const VfsCopyFuncti
|
||||||
|
|
||||||
bool RegisteredCache::RawInstallYuzuMeta(const CNMT& cnmt) {
|
bool RegisteredCache::RawInstallYuzuMeta(const CNMT& cnmt) {
|
||||||
// Reasoning behind this method can be found in the comment for InstallEntry, NCA overload.
|
// Reasoning behind this method can be found in the comment for InstallEntry, NCA overload.
|
||||||
const auto dir = this->dir->CreateDirectoryRelative("yuzu_meta");
|
const auto meta_dir = dir->CreateDirectoryRelative("yuzu_meta");
|
||||||
const auto filename = GetCNMTName(cnmt.GetType(), cnmt.GetTitleID());
|
const auto filename = GetCNMTName(cnmt.GetType(), cnmt.GetTitleID());
|
||||||
if (dir->GetFile(filename) == nullptr) {
|
if (meta_dir->GetFile(filename) == nullptr) {
|
||||||
auto out = dir->CreateFile(filename);
|
auto out = meta_dir->CreateFile(filename);
|
||||||
const auto buffer = cnmt.Serialize();
|
const auto buffer = cnmt.Serialize();
|
||||||
out->Resize(buffer.size());
|
out->Resize(buffer.size());
|
||||||
out->WriteBytes(buffer);
|
out->WriteBytes(buffer);
|
||||||
} else {
|
} else {
|
||||||
auto out = dir->GetFile(filename);
|
auto out = meta_dir->GetFile(filename);
|
||||||
CNMT old_cnmt(out);
|
CNMT old_cnmt(out);
|
||||||
// Returns true on change
|
// Returns true on change
|
||||||
if (old_cnmt.UnionRecords(cnmt)) {
|
if (old_cnmt.UnionRecords(cnmt)) {
|
||||||
|
|
|
@ -182,7 +182,7 @@ private:
|
||||||
void AccumulateYuzuMeta();
|
void AccumulateYuzuMeta();
|
||||||
std::optional<NcaID> GetNcaIDFromMetadata(u64 title_id, ContentRecordType type) const;
|
std::optional<NcaID> GetNcaIDFromMetadata(u64 title_id, ContentRecordType type) const;
|
||||||
VirtualFile GetFileAtID(NcaID id) const;
|
VirtualFile GetFileAtID(NcaID id) const;
|
||||||
VirtualFile OpenFileOrDirectoryConcat(const VirtualDir& dir, std::string_view path) const;
|
VirtualFile OpenFileOrDirectoryConcat(const VirtualDir& open_dir, std::string_view path) const;
|
||||||
InstallResult RawInstallNCA(const NCA& nca, const VfsCopyFunction& copy,
|
InstallResult RawInstallNCA(const NCA& nca, const VfsCopyFunction& copy,
|
||||||
bool overwrite_if_exists, std::optional<NcaID> override_id = {});
|
bool overwrite_if_exists, std::optional<NcaID> override_id = {});
|
||||||
bool RawInstallYuzuMeta(const CNMT& cnmt);
|
bool RawInstallYuzuMeta(const CNMT& cnmt);
|
||||||
|
|
|
@ -33,8 +33,8 @@ RomFSFactory::RomFSFactory(Loader::AppLoader& app_loader, ContentProvider& provi
|
||||||
|
|
||||||
RomFSFactory::~RomFSFactory() = default;
|
RomFSFactory::~RomFSFactory() = default;
|
||||||
|
|
||||||
void RomFSFactory::SetPackedUpdate(VirtualFile update_raw) {
|
void RomFSFactory::SetPackedUpdate(VirtualFile update_raw_file) {
|
||||||
this->update_raw = std::move(update_raw);
|
update_raw = std::move(update_raw_file);
|
||||||
}
|
}
|
||||||
|
|
||||||
ResultVal<VirtualFile> RomFSFactory::OpenCurrentProcess(u64 current_process_title_id) const {
|
ResultVal<VirtualFile> RomFSFactory::OpenCurrentProcess(u64 current_process_title_id) const {
|
||||||
|
|
|
@ -40,7 +40,7 @@ public:
|
||||||
Service::FileSystem::FileSystemController& controller);
|
Service::FileSystem::FileSystemController& controller);
|
||||||
~RomFSFactory();
|
~RomFSFactory();
|
||||||
|
|
||||||
void SetPackedUpdate(VirtualFile update_raw);
|
void SetPackedUpdate(VirtualFile update_raw_file);
|
||||||
[[nodiscard]] ResultVal<VirtualFile> OpenCurrentProcess(u64 current_process_title_id) const;
|
[[nodiscard]] ResultVal<VirtualFile> OpenCurrentProcess(u64 current_process_title_id) const;
|
||||||
[[nodiscard]] ResultVal<VirtualFile> OpenPatchedRomFS(u64 title_id,
|
[[nodiscard]] ResultVal<VirtualFile> OpenPatchedRomFS(u64 title_id,
|
||||||
ContentRecordType type) const;
|
ContentRecordType type) const;
|
||||||
|
|
|
@ -170,26 +170,30 @@ std::string SaveDataFactory::GetFullPath(Core::System& system, SaveDataSpaceId s
|
||||||
SaveDataSize SaveDataFactory::ReadSaveDataSize(SaveDataType type, u64 title_id,
|
SaveDataSize SaveDataFactory::ReadSaveDataSize(SaveDataType type, u64 title_id,
|
||||||
u128 user_id) const {
|
u128 user_id) const {
|
||||||
const auto path = GetFullPath(system, SaveDataSpaceId::NandUser, type, title_id, user_id, 0);
|
const auto path = GetFullPath(system, SaveDataSpaceId::NandUser, type, title_id, user_id, 0);
|
||||||
const auto dir = GetOrCreateDirectoryRelative(this->dir, path);
|
const auto relative_dir = GetOrCreateDirectoryRelative(dir, path);
|
||||||
|
|
||||||
const auto size_file = dir->GetFile(SAVE_DATA_SIZE_FILENAME);
|
const auto size_file = relative_dir->GetFile(SAVE_DATA_SIZE_FILENAME);
|
||||||
if (size_file == nullptr || size_file->GetSize() < sizeof(SaveDataSize))
|
if (size_file == nullptr || size_file->GetSize() < sizeof(SaveDataSize)) {
|
||||||
return {0, 0};
|
return {0, 0};
|
||||||
|
}
|
||||||
|
|
||||||
SaveDataSize out;
|
SaveDataSize out;
|
||||||
if (size_file->ReadObject(&out) != sizeof(SaveDataSize))
|
if (size_file->ReadObject(&out) != sizeof(SaveDataSize)) {
|
||||||
return {0, 0};
|
return {0, 0};
|
||||||
|
}
|
||||||
|
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SaveDataFactory::WriteSaveDataSize(SaveDataType type, u64 title_id, u128 user_id,
|
void SaveDataFactory::WriteSaveDataSize(SaveDataType type, u64 title_id, u128 user_id,
|
||||||
SaveDataSize new_value) const {
|
SaveDataSize new_value) const {
|
||||||
const auto path = GetFullPath(system, SaveDataSpaceId::NandUser, type, title_id, user_id, 0);
|
const auto path = GetFullPath(system, SaveDataSpaceId::NandUser, type, title_id, user_id, 0);
|
||||||
const auto dir = GetOrCreateDirectoryRelative(this->dir, path);
|
const auto relative_dir = GetOrCreateDirectoryRelative(dir, path);
|
||||||
|
|
||||||
const auto size_file = dir->CreateFile(SAVE_DATA_SIZE_FILENAME);
|
const auto size_file = relative_dir->CreateFile(SAVE_DATA_SIZE_FILENAME);
|
||||||
if (size_file == nullptr)
|
if (size_file == nullptr) {
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
size_file->Resize(sizeof(SaveDataSize));
|
size_file->Resize(sizeof(SaveDataSize));
|
||||||
size_file->WriteObject(new_value);
|
size_file->WriteObject(new_value);
|
||||||
|
|
|
@ -232,15 +232,15 @@ void NSP::SetTicketKeys(const std::vector<VirtualFile>& files) {
|
||||||
void NSP::InitializeExeFSAndRomFS(const std::vector<VirtualFile>& files) {
|
void NSP::InitializeExeFSAndRomFS(const std::vector<VirtualFile>& files) {
|
||||||
exefs = pfs;
|
exefs = pfs;
|
||||||
|
|
||||||
const auto romfs_iter = std::find_if(files.begin(), files.end(), [](const VirtualFile& file) {
|
const auto iter = std::find_if(files.begin(), files.end(), [](const VirtualFile& entry) {
|
||||||
return file->GetName().rfind(".romfs") != std::string::npos;
|
return entry->GetName().rfind(".romfs") != std::string::npos;
|
||||||
});
|
});
|
||||||
|
|
||||||
if (romfs_iter == files.end()) {
|
if (iter == files.end()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
romfs = *romfs_iter;
|
romfs = *iter;
|
||||||
}
|
}
|
||||||
|
|
||||||
void NSP::ReadNCAs(const std::vector<VirtualFile>& files) {
|
void NSP::ReadNCAs(const std::vector<VirtualFile>& files) {
|
||||||
|
|
|
@ -136,7 +136,7 @@ std::size_t ConcatenatedVfsFile::Write(const u8* data, std::size_t length, std::
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ConcatenatedVfsFile::Rename(std::string_view name) {
|
bool ConcatenatedVfsFile::Rename(std::string_view new_name) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -36,7 +36,7 @@ public:
|
||||||
bool IsReadable() const override;
|
bool IsReadable() const override;
|
||||||
std::size_t Read(u8* data, std::size_t length, std::size_t offset) const override;
|
std::size_t Read(u8* data, std::size_t length, std::size_t offset) const override;
|
||||||
std::size_t Write(const u8* data, std::size_t length, std::size_t offset) override;
|
std::size_t Write(const u8* data, std::size_t length, std::size_t offset) override;
|
||||||
bool Rename(std::string_view name) override;
|
bool Rename(std::string_view new_name) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// Maps starting offset to file -- more efficient.
|
// Maps starting offset to file -- more efficient.
|
||||||
|
|
|
@ -45,12 +45,12 @@ VirtualDir LayeredVfsDirectory::GetDirectoryRelative(std::string_view path) cons
|
||||||
return MakeLayeredDirectory(std::move(out));
|
return MakeLayeredDirectory(std::move(out));
|
||||||
}
|
}
|
||||||
|
|
||||||
VirtualFile LayeredVfsDirectory::GetFile(std::string_view name) const {
|
VirtualFile LayeredVfsDirectory::GetFile(std::string_view file_name) const {
|
||||||
return GetFileRelative(name);
|
return GetFileRelative(file_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
VirtualDir LayeredVfsDirectory::GetSubdirectory(std::string_view name) const {
|
VirtualDir LayeredVfsDirectory::GetSubdirectory(std::string_view subdir_name) const {
|
||||||
return GetDirectoryRelative(name);
|
return GetDirectoryRelative(subdir_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string LayeredVfsDirectory::GetFullPath() const {
|
std::string LayeredVfsDirectory::GetFullPath() const {
|
||||||
|
@ -105,24 +105,24 @@ VirtualDir LayeredVfsDirectory::GetParentDirectory() const {
|
||||||
return dirs[0]->GetParentDirectory();
|
return dirs[0]->GetParentDirectory();
|
||||||
}
|
}
|
||||||
|
|
||||||
VirtualDir LayeredVfsDirectory::CreateSubdirectory(std::string_view name) {
|
VirtualDir LayeredVfsDirectory::CreateSubdirectory(std::string_view subdir_name) {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
VirtualFile LayeredVfsDirectory::CreateFile(std::string_view name) {
|
VirtualFile LayeredVfsDirectory::CreateFile(std::string_view file_name) {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool LayeredVfsDirectory::DeleteSubdirectory(std::string_view name) {
|
bool LayeredVfsDirectory::DeleteSubdirectory(std::string_view subdir_name) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool LayeredVfsDirectory::DeleteFile(std::string_view name) {
|
bool LayeredVfsDirectory::DeleteFile(std::string_view file_name) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool LayeredVfsDirectory::Rename(std::string_view name_) {
|
bool LayeredVfsDirectory::Rename(std::string_view new_name) {
|
||||||
name = name_;
|
name = new_name;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -23,8 +23,8 @@ public:
|
||||||
|
|
||||||
VirtualFile GetFileRelative(std::string_view path) const override;
|
VirtualFile GetFileRelative(std::string_view path) const override;
|
||||||
VirtualDir GetDirectoryRelative(std::string_view path) const override;
|
VirtualDir GetDirectoryRelative(std::string_view path) const override;
|
||||||
VirtualFile GetFile(std::string_view name) const override;
|
VirtualFile GetFile(std::string_view file_name) const override;
|
||||||
VirtualDir GetSubdirectory(std::string_view name) const override;
|
VirtualDir GetSubdirectory(std::string_view subdir_name) const override;
|
||||||
std::string GetFullPath() const override;
|
std::string GetFullPath() const override;
|
||||||
|
|
||||||
std::vector<VirtualFile> GetFiles() const override;
|
std::vector<VirtualFile> GetFiles() const override;
|
||||||
|
@ -33,11 +33,11 @@ public:
|
||||||
bool IsReadable() const override;
|
bool IsReadable() const override;
|
||||||
std::string GetName() const override;
|
std::string GetName() const override;
|
||||||
VirtualDir GetParentDirectory() const override;
|
VirtualDir GetParentDirectory() const override;
|
||||||
VirtualDir CreateSubdirectory(std::string_view name) override;
|
VirtualDir CreateSubdirectory(std::string_view subdir_name) override;
|
||||||
VirtualFile CreateFile(std::string_view name) override;
|
VirtualFile CreateFile(std::string_view file_name) override;
|
||||||
bool DeleteSubdirectory(std::string_view name) override;
|
bool DeleteSubdirectory(std::string_view subdir_name) override;
|
||||||
bool DeleteFile(std::string_view name) override;
|
bool DeleteFile(std::string_view file_name) override;
|
||||||
bool Rename(std::string_view name) override;
|
bool Rename(std::string_view new_name) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::vector<VirtualDir> dirs;
|
std::vector<VirtualDir> dirs;
|
||||||
|
|
|
@ -84,8 +84,8 @@ std::size_t OffsetVfsFile::WriteBytes(const std::vector<u8>& data, std::size_t r
|
||||||
return file->Write(data.data(), TrimToFit(data.size(), r_offset), offset + r_offset);
|
return file->Write(data.data(), TrimToFit(data.size(), r_offset), offset + r_offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool OffsetVfsFile::Rename(std::string_view name) {
|
bool OffsetVfsFile::Rename(std::string_view new_name) {
|
||||||
return file->Rename(name);
|
return file->Rename(new_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::size_t OffsetVfsFile::GetOffset() const {
|
std::size_t OffsetVfsFile::GetOffset() const {
|
||||||
|
|
|
@ -35,7 +35,7 @@ public:
|
||||||
bool WriteByte(u8 data, std::size_t offset) override;
|
bool WriteByte(u8 data, std::size_t offset) override;
|
||||||
std::size_t WriteBytes(const std::vector<u8>& data, std::size_t offset) override;
|
std::size_t WriteBytes(const std::vector<u8>& data, std::size_t offset) override;
|
||||||
|
|
||||||
bool Rename(std::string_view name) override;
|
bool Rename(std::string_view new_name) override;
|
||||||
|
|
||||||
std::size_t GetOffset() const;
|
std::size_t GetOffset() const;
|
||||||
|
|
||||||
|
|
|
@ -358,16 +358,16 @@ RealVfsDirectory::RealVfsDirectory(RealVfsFilesystem& base_, const std::string&
|
||||||
|
|
||||||
RealVfsDirectory::~RealVfsDirectory() = default;
|
RealVfsDirectory::~RealVfsDirectory() = default;
|
||||||
|
|
||||||
VirtualFile RealVfsDirectory::GetFileRelative(std::string_view path) const {
|
VirtualFile RealVfsDirectory::GetFileRelative(std::string_view relative_path) const {
|
||||||
const auto full_path = FS::SanitizePath(this->path + DIR_SEP + std::string(path));
|
const auto full_path = FS::SanitizePath(path + DIR_SEP + std::string(relative_path));
|
||||||
if (!FS::Exists(full_path) || FS::IsDirectory(full_path)) {
|
if (!FS::Exists(full_path) || FS::IsDirectory(full_path)) {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
return base.OpenFile(full_path, perms);
|
return base.OpenFile(full_path, perms);
|
||||||
}
|
}
|
||||||
|
|
||||||
VirtualDir RealVfsDirectory::GetDirectoryRelative(std::string_view path) const {
|
VirtualDir RealVfsDirectory::GetDirectoryRelative(std::string_view relative_path) const {
|
||||||
const auto full_path = FS::SanitizePath(this->path + DIR_SEP + std::string(path));
|
const auto full_path = FS::SanitizePath(path + DIR_SEP + std::string(relative_path));
|
||||||
if (!FS::Exists(full_path) || !FS::IsDirectory(full_path)) {
|
if (!FS::Exists(full_path) || !FS::IsDirectory(full_path)) {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
@ -382,13 +382,13 @@ VirtualDir RealVfsDirectory::GetSubdirectory(std::string_view name) const {
|
||||||
return GetDirectoryRelative(name);
|
return GetDirectoryRelative(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
VirtualFile RealVfsDirectory::CreateFileRelative(std::string_view path) {
|
VirtualFile RealVfsDirectory::CreateFileRelative(std::string_view relative_path) {
|
||||||
const auto full_path = FS::SanitizePath(this->path + DIR_SEP + std::string(path));
|
const auto full_path = FS::SanitizePath(path + DIR_SEP + std::string(relative_path));
|
||||||
return base.CreateFile(full_path, perms);
|
return base.CreateFile(full_path, perms);
|
||||||
}
|
}
|
||||||
|
|
||||||
VirtualDir RealVfsDirectory::CreateDirectoryRelative(std::string_view path) {
|
VirtualDir RealVfsDirectory::CreateDirectoryRelative(std::string_view relative_path) {
|
||||||
const auto full_path = FS::SanitizePath(this->path + DIR_SEP + std::string(path));
|
const auto full_path = FS::SanitizePath(path + DIR_SEP + std::string(relative_path));
|
||||||
return base.CreateDirectory(full_path, perms);
|
return base.CreateDirectory(full_path, perms);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -79,12 +79,12 @@ class RealVfsDirectory : public VfsDirectory {
|
||||||
public:
|
public:
|
||||||
~RealVfsDirectory() override;
|
~RealVfsDirectory() override;
|
||||||
|
|
||||||
VirtualFile GetFileRelative(std::string_view path) const override;
|
VirtualFile GetFileRelative(std::string_view relative_path) const override;
|
||||||
VirtualDir GetDirectoryRelative(std::string_view path) const override;
|
VirtualDir GetDirectoryRelative(std::string_view relative_path) const override;
|
||||||
VirtualFile GetFile(std::string_view name) const override;
|
VirtualFile GetFile(std::string_view name) const override;
|
||||||
VirtualDir GetSubdirectory(std::string_view name) const override;
|
VirtualDir GetSubdirectory(std::string_view name) const override;
|
||||||
VirtualFile CreateFileRelative(std::string_view path) override;
|
VirtualFile CreateFileRelative(std::string_view relative_path) override;
|
||||||
VirtualDir CreateDirectoryRelative(std::string_view path) override;
|
VirtualDir CreateDirectoryRelative(std::string_view relative_path) override;
|
||||||
bool DeleteSubdirectoryRecursive(std::string_view name) override;
|
bool DeleteSubdirectoryRecursive(std::string_view name) override;
|
||||||
std::vector<VirtualFile> GetFiles() const override;
|
std::vector<VirtualFile> GetFiles() const override;
|
||||||
std::vector<VirtualDir> GetSubdirectories() const override;
|
std::vector<VirtualDir> GetSubdirectories() const override;
|
||||||
|
|
|
@ -103,12 +103,12 @@ static bool FindAndRemoveVectorElement(std::vector<T>& vec, std::string_view nam
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool VectorVfsDirectory::DeleteSubdirectory(std::string_view name) {
|
bool VectorVfsDirectory::DeleteSubdirectory(std::string_view subdir_name) {
|
||||||
return FindAndRemoveVectorElement(dirs, name);
|
return FindAndRemoveVectorElement(dirs, subdir_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool VectorVfsDirectory::DeleteFile(std::string_view name) {
|
bool VectorVfsDirectory::DeleteFile(std::string_view file_name) {
|
||||||
return FindAndRemoveVectorElement(files, name);
|
return FindAndRemoveVectorElement(files, file_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool VectorVfsDirectory::Rename(std::string_view name_) {
|
bool VectorVfsDirectory::Rename(std::string_view name_) {
|
||||||
|
@ -116,11 +116,11 @@ bool VectorVfsDirectory::Rename(std::string_view name_) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
VirtualDir VectorVfsDirectory::CreateSubdirectory(std::string_view name) {
|
VirtualDir VectorVfsDirectory::CreateSubdirectory(std::string_view subdir_name) {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
VirtualFile VectorVfsDirectory::CreateFile(std::string_view name) {
|
VirtualFile VectorVfsDirectory::CreateFile(std::string_view file_name) {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -112,11 +112,11 @@ public:
|
||||||
bool IsReadable() const override;
|
bool IsReadable() const override;
|
||||||
std::string GetName() const override;
|
std::string GetName() const override;
|
||||||
VirtualDir GetParentDirectory() const override;
|
VirtualDir GetParentDirectory() const override;
|
||||||
bool DeleteSubdirectory(std::string_view name) override;
|
bool DeleteSubdirectory(std::string_view subdir_name) override;
|
||||||
bool DeleteFile(std::string_view name) override;
|
bool DeleteFile(std::string_view file_name) override;
|
||||||
bool Rename(std::string_view name) override;
|
bool Rename(std::string_view name) override;
|
||||||
VirtualDir CreateSubdirectory(std::string_view name) override;
|
VirtualDir CreateSubdirectory(std::string_view subdir_name) override;
|
||||||
VirtualFile CreateFile(std::string_view name) override;
|
VirtualFile CreateFile(std::string_view file_name) override;
|
||||||
|
|
||||||
virtual void AddFile(VirtualFile file);
|
virtual void AddFile(VirtualFile file);
|
||||||
virtual void AddDirectory(VirtualDir dir);
|
virtual void AddDirectory(VirtualDir dir);
|
||||||
|
|
Reference in New Issue