plumbing, cleanup and testing
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user