plumbing, cleanup and testing

This commit is contained in:
Zach Hilman
2018-06-16 19:42:51 -04:00
parent 9a5a8c767c
commit b3b69e994e
3 changed files with 30 additions and 11 deletions

View File

@@ -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<u8>& 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,

View File

@@ -37,7 +37,7 @@ public:
private:
struct Header {
std::array<char, 4> magic;
u32_le magic;
u32_le num_entries;
u32_le strtab_size;
INSERT_PADDING_BYTES(0x4);

View File

@@ -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<u64>(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);
}