From b3b69e994e0b953b24d25a134745431d18124b25 Mon Sep 17 00:00:00 2001 From: Zach Hilman Date: Sat, 16 Jun 2018 19:42:51 -0400 Subject: [PATCH] plumbing, cleanup and testing --- src/core/file_sys/partition_filesystem.cpp | 21 ++++++++++++++++++--- src/core/file_sys/partition_filesystem.h | 2 +- src/core/loader/nca.cpp | 18 +++++++++++------- 3 files changed, 30 insertions(+), 11 deletions(-) diff --git a/src/core/file_sys/partition_filesystem.cpp b/src/core/file_sys/partition_filesystem.cpp index 884faf4755..bed53d9753 100644 --- a/src/core/file_sys/partition_filesystem.cpp +++ b/src/core/file_sys/partition_filesystem.cpp @@ -26,7 +26,16 @@ Loader::ResultStatus PartitionFilesystem::Load(const std::string& file_path, siz if (!file.ReadBytes(&pfs_header, sizeof(Header))) return Loader::ResultStatus::Error; - bool is_hfs = (memcmp(pfs_header.magic.data(), "HFS", 3) == 0); + bool is_hfs; + + if (pfs_header.magic == Common::MakeMagic('H', 'F', 'S', '0')) { + is_hfs = true; + } else if (pfs_header.magic == Common::MakeMagic('P', 'F', 'S', '0')) { + is_hfs = false; + } else { + return Loader::ResultStatus::ErrorInvalidFormat; + } + size_t entry_size = is_hfs ? sizeof(HFSEntry) : sizeof(PFSEntry); size_t metadata_size = sizeof(Header) + (pfs_header.num_entries * entry_size) + pfs_header.strtab_size; @@ -51,7 +60,13 @@ Loader::ResultStatus PartitionFilesystem::Load(const std::vector& file_data, return Loader::ResultStatus::Error; memcpy(&pfs_header, &file_data[offset], sizeof(Header)); - is_hfs = (memcmp(pfs_header.magic.data(), "HFS", 3) == 0); + if (pfs_header.magic == Common::MakeMagic('H', 'F', 'S', '0')) { + is_hfs = true; + } else if (pfs_header.magic == Common::MakeMagic('P', 'F', 'S', '0')) { + is_hfs = false; + } else { + return Loader::ResultStatus::ErrorInvalidFormat; + } size_t entries_offset = offset + sizeof(Header); size_t entry_size = is_hfs ? sizeof(HFSEntry) : sizeof(PFSEntry); @@ -114,7 +129,7 @@ u64 PartitionFilesystem::GetFileSize(const std::string& name) const { } void PartitionFilesystem::Print() const { - NGLOG_DEBUG(Service_FS, "Magic: {:.4}", pfs_header.magic.data()); + NGLOG_DEBUG(Service_FS, "Magic: {}", pfs_header.magic); NGLOG_DEBUG(Service_FS, "Files: {}", pfs_header.num_entries); for (u32 i = 0; i < pfs_header.num_entries; i++) { NGLOG_DEBUG(Service_FS, " > File {}: {} (0x{:X} bytes, at 0x{:X})", i, diff --git a/src/core/file_sys/partition_filesystem.h b/src/core/file_sys/partition_filesystem.h index 573c90057f..133e9cabcf 100644 --- a/src/core/file_sys/partition_filesystem.h +++ b/src/core/file_sys/partition_filesystem.h @@ -37,7 +37,7 @@ public: private: struct Header { - std::array magic; + u32_le magic; u32_le num_entries; u32_le strtab_size; INSERT_PADDING_BYTES(0x4); diff --git a/src/core/loader/nca.cpp b/src/core/loader/nca.cpp index ba2ec4e654..9624567276 100644 --- a/src/core/loader/nca.cpp +++ b/src/core/loader/nca.cpp @@ -118,11 +118,15 @@ Nca::Nca(FileUtil::IOFile&& in_file, std::string path) : file(std::move(in_file) if (0x200 != file.ReadBytes(&sb, 0x200)) NGLOG_CRITICAL(Loader, "File reader errored out during header read."); - pfs.emplace_back(); - pfs[pfs.size() - 1].Load(path, (header.section_tables[i].media_offset << 9) + - sb.pfs0_header_offset); - pfs_offset.emplace_back((header.section_tables[i].media_offset << 9) + - sb.pfs0_header_offset); + u64 offset = (static_cast(header.section_tables[i].media_offset) << 9) + + sb.pfs0_header_offset; + FileSys::PartitionFilesystem npfs{}; + ResultStatus status = npfs.Load(path, offset); + + if (status == ResultStatus::Success) { + pfs.emplace_back(std::move(npfs)); + pfs_offset.emplace_back(offset); + } } } } @@ -146,13 +150,13 @@ u8 Nca::GetExeFsPfsId() { } u64 Nca::GetExeFsFileOffset(const std::string& file_name) { - if (GetExeFsPfsId() < 0) + if (GetExeFsPfsId() == 255) return 0; return pfs[GetExeFsPfsId()].GetFileOffset(file_name) + pfs_offset[GetExeFsPfsId()]; } u64 Nca::GetExeFsFileSize(const std::string& file_name) { - if (GetExeFsPfsId() < 0) + if (GetExeFsPfsId() == 255) return 0; return pfs[GetExeFsPfsId()].GetFileSize(file_name); }