|
|
@ -33,11 +33,55 @@ Loader::ResultStatus ProgramMetadata::Load(VirtualFile file) {
|
|
|
|
return Loader::ResultStatus::ErrorBadACIHeader;
|
|
|
|
return Loader::ResultStatus::ErrorBadACIHeader;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (sizeof(FileAccessControl) != file->ReadObject(&acid_file_access, acid_header.fac_offset)) {
|
|
|
|
// Load acid_file_access per-component instead of the entire struct, since this struct does not
|
|
|
|
|
|
|
|
// reflect the layout of the real data.
|
|
|
|
|
|
|
|
std::size_t current_offset = acid_header.fac_offset;
|
|
|
|
|
|
|
|
if (sizeof(FileAccessControl::version) != file->ReadBytes(&acid_file_access.version,
|
|
|
|
|
|
|
|
sizeof(FileAccessControl::version),
|
|
|
|
|
|
|
|
current_offset)) {
|
|
|
|
|
|
|
|
return Loader::ResultStatus::ErrorBadFileAccessControl;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
if (sizeof(FileAccessControl::permissions) !=
|
|
|
|
|
|
|
|
file->ReadBytes(&acid_file_access.permissions, sizeof(FileAccessControl::permissions),
|
|
|
|
|
|
|
|
current_offset += sizeof(FileAccessControl::version) + 3)) {
|
|
|
|
|
|
|
|
return Loader::ResultStatus::ErrorBadFileAccessControl;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
if (sizeof(FileAccessControl::unknown) !=
|
|
|
|
|
|
|
|
file->ReadBytes(&acid_file_access.unknown, sizeof(FileAccessControl::unknown),
|
|
|
|
|
|
|
|
current_offset + sizeof(FileAccessControl::permissions))) {
|
|
|
|
return Loader::ResultStatus::ErrorBadFileAccessControl;
|
|
|
|
return Loader::ResultStatus::ErrorBadFileAccessControl;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (sizeof(FileAccessHeader) != file->ReadObject(&aci_file_access, aci_header.fah_offset)) {
|
|
|
|
// Load aci_file_access per-component instead of the entire struct, same as acid_file_access
|
|
|
|
|
|
|
|
current_offset = aci_header.fah_offset;
|
|
|
|
|
|
|
|
if (sizeof(FileAccessHeader::version) != file->ReadBytes(&aci_file_access.version,
|
|
|
|
|
|
|
|
sizeof(FileAccessHeader::version),
|
|
|
|
|
|
|
|
current_offset)) {
|
|
|
|
|
|
|
|
return Loader::ResultStatus::ErrorBadFileAccessHeader;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
if (sizeof(FileAccessHeader::permissions) !=
|
|
|
|
|
|
|
|
file->ReadBytes(&aci_file_access.permissions, sizeof(FileAccessHeader::permissions),
|
|
|
|
|
|
|
|
current_offset += sizeof(FileAccessHeader::version) + 3)) {
|
|
|
|
|
|
|
|
return Loader::ResultStatus::ErrorBadFileAccessHeader;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
if (sizeof(FileAccessHeader::unk_offset) !=
|
|
|
|
|
|
|
|
file->ReadBytes(&aci_file_access.unk_offset, sizeof(FileAccessHeader::unk_offset),
|
|
|
|
|
|
|
|
current_offset += sizeof(FileAccessHeader::permissions))) {
|
|
|
|
|
|
|
|
return Loader::ResultStatus::ErrorBadFileAccessHeader;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
if (sizeof(FileAccessHeader::unk_size) !=
|
|
|
|
|
|
|
|
file->ReadBytes(&aci_file_access.unk_size, sizeof(FileAccessHeader::unk_size),
|
|
|
|
|
|
|
|
current_offset += sizeof(FileAccessHeader::unk_offset))) {
|
|
|
|
|
|
|
|
return Loader::ResultStatus::ErrorBadFileAccessHeader;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
if (sizeof(FileAccessHeader::unk_offset_2) !=
|
|
|
|
|
|
|
|
file->ReadBytes(&aci_file_access.unk_offset_2, sizeof(FileAccessHeader::unk_offset_2),
|
|
|
|
|
|
|
|
current_offset += sizeof(FileAccessHeader::unk_size))) {
|
|
|
|
|
|
|
|
return Loader::ResultStatus::ErrorBadFileAccessHeader;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
if (sizeof(FileAccessHeader::unk_size_2) !=
|
|
|
|
|
|
|
|
file->ReadBytes(&aci_file_access.unk_size_2, sizeof(FileAccessHeader::unk_size_2),
|
|
|
|
|
|
|
|
current_offset + sizeof(FileAccessHeader::unk_offset_2))) {
|
|
|
|
return Loader::ResultStatus::ErrorBadFileAccessHeader;
|
|
|
|
return Loader::ResultStatus::ErrorBadFileAccessHeader;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -152,9 +196,7 @@ void ProgramMetadata::Print() const {
|
|
|
|
LOG_DEBUG(Service_FS, " > Is Retail: {}", acid_header.is_retail ? "YES" : "NO");
|
|
|
|
LOG_DEBUG(Service_FS, " > Is Retail: {}", acid_header.is_retail ? "YES" : "NO");
|
|
|
|
LOG_DEBUG(Service_FS, "Title ID Min: 0x{:016X}", acid_header.title_id_min);
|
|
|
|
LOG_DEBUG(Service_FS, "Title ID Min: 0x{:016X}", acid_header.title_id_min);
|
|
|
|
LOG_DEBUG(Service_FS, "Title ID Max: 0x{:016X}", acid_header.title_id_max);
|
|
|
|
LOG_DEBUG(Service_FS, "Title ID Max: 0x{:016X}", acid_header.title_id_max);
|
|
|
|
u64_le permissions_l; // local copy to fix alignment error
|
|
|
|
LOG_DEBUG(Service_FS, "Filesystem Access: 0x{:016X}\n", acid_file_access.permissions);
|
|
|
|
std::memcpy(&permissions_l, &acid_file_access.permissions, sizeof(permissions_l));
|
|
|
|
|
|
|
|
LOG_DEBUG(Service_FS, "Filesystem Access: 0x{:016X}\n", permissions_l);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Begin ACI0 printing (actual perms, unsigned)
|
|
|
|
// Begin ACI0 printing (actual perms, unsigned)
|
|
|
|
LOG_DEBUG(Service_FS, "Magic: {:.4}", aci_header.magic.data());
|
|
|
|
LOG_DEBUG(Service_FS, "Magic: {:.4}", aci_header.magic.data());
|
|
|
|