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)))
|
if (!file.ReadBytes(&pfs_header, sizeof(Header)))
|
||||||
return Loader::ResultStatus::Error;
|
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 entry_size = is_hfs ? sizeof(HFSEntry) : sizeof(PFSEntry);
|
||||||
size_t metadata_size =
|
size_t metadata_size =
|
||||||
sizeof(Header) + (pfs_header.num_entries * entry_size) + pfs_header.strtab_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;
|
return Loader::ResultStatus::Error;
|
||||||
|
|
||||||
memcpy(&pfs_header, &file_data[offset], sizeof(Header));
|
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 entries_offset = offset + sizeof(Header);
|
||||||
size_t entry_size = is_hfs ? sizeof(HFSEntry) : sizeof(PFSEntry);
|
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 {
|
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);
|
NGLOG_DEBUG(Service_FS, "Files: {}", pfs_header.num_entries);
|
||||||
for (u32 i = 0; i < pfs_header.num_entries; i++) {
|
for (u32 i = 0; i < pfs_header.num_entries; i++) {
|
||||||
NGLOG_DEBUG(Service_FS, " > File {}: {} (0x{:X} bytes, at 0x{:X})", i,
|
NGLOG_DEBUG(Service_FS, " > File {}: {} (0x{:X} bytes, at 0x{:X})", i,
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ public:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
struct Header {
|
struct Header {
|
||||||
std::array<char, 4> magic;
|
u32_le magic;
|
||||||
u32_le num_entries;
|
u32_le num_entries;
|
||||||
u32_le strtab_size;
|
u32_le strtab_size;
|
||||||
INSERT_PADDING_BYTES(0x4);
|
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))
|
if (0x200 != file.ReadBytes(&sb, 0x200))
|
||||||
NGLOG_CRITICAL(Loader, "File reader errored out during header read.");
|
NGLOG_CRITICAL(Loader, "File reader errored out during header read.");
|
||||||
|
|
||||||
pfs.emplace_back();
|
u64 offset = (static_cast<u64>(header.section_tables[i].media_offset) << 9) +
|
||||||
pfs[pfs.size() - 1].Load(path, (header.section_tables[i].media_offset << 9) +
|
sb.pfs0_header_offset;
|
||||||
sb.pfs0_header_offset);
|
FileSys::PartitionFilesystem npfs{};
|
||||||
pfs_offset.emplace_back((header.section_tables[i].media_offset << 9) +
|
ResultStatus status = npfs.Load(path, offset);
|
||||||
sb.pfs0_header_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) {
|
u64 Nca::GetExeFsFileOffset(const std::string& file_name) {
|
||||||
if (GetExeFsPfsId() < 0)
|
if (GetExeFsPfsId() == 255)
|
||||||
return 0;
|
return 0;
|
||||||
return pfs[GetExeFsPfsId()].GetFileOffset(file_name) + pfs_offset[GetExeFsPfsId()];
|
return pfs[GetExeFsPfsId()].GetFileOffset(file_name) + pfs_offset[GetExeFsPfsId()];
|
||||||
}
|
}
|
||||||
|
|
||||||
u64 Nca::GetExeFsFileSize(const std::string& file_name) {
|
u64 Nca::GetExeFsFileSize(const std::string& file_name) {
|
||||||
if (GetExeFsPfsId() < 0)
|
if (GetExeFsPfsId() == 255)
|
||||||
return 0;
|
return 0;
|
||||||
return pfs[GetExeFsPfsId()].GetFileSize(file_name);
|
return pfs[GetExeFsPfsId()].GetFileSize(file_name);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user