file_sys/content_archive: Detect sparse NCAs

This commit is contained in:
FearlessTobi 2023-07-07 16:16:44 +02:00
commit 9545dcf908
2 changed files with 26 additions and 4 deletions

View file

@ -57,10 +57,23 @@ struct NCASectionHeaderBlock {
}; };
static_assert(sizeof(NCASectionHeaderBlock) == 0x8, "NCASectionHeaderBlock has incorrect size."); static_assert(sizeof(NCASectionHeaderBlock) == 0x8, "NCASectionHeaderBlock has incorrect size.");
struct NCACompressionInfo { struct NCABucketInfo {
u64 table_offset; u64 table_offset;
u64 table_size; u64 table_size;
std::array<u8, 0x10> table_header; std::array<u8, 0x10> table_header;
};
static_assert(sizeof(NCABucketInfo) == 0x20, "NCABucketInfo has incorrect size.");
struct NCASparseInfo {
NCABucketInfo bucket;
u64 physical_offset;
u16 generation;
INSERT_PADDING_BYTES_NOINIT(0x6);
};
static_assert(sizeof(NCASparseInfo) == 0x30, "NCASparseInfo has incorrect size.");
struct NCACompressionInfo {
NCABucketInfo bucket;
INSERT_PADDING_BYTES_NOINIT(0x8); INSERT_PADDING_BYTES_NOINIT(0x8);
}; };
static_assert(sizeof(NCACompressionInfo) == 0x28, "NCACompressionInfo has incorrect size."); static_assert(sizeof(NCACompressionInfo) == 0x28, "NCACompressionInfo has incorrect size.");
@ -69,8 +82,8 @@ struct NCASectionRaw {
NCASectionHeaderBlock header; NCASectionHeaderBlock header;
std::array<u8, 0x138> block_data; std::array<u8, 0x138> block_data;
std::array<u8, 0x8> section_ctr; std::array<u8, 0x8> section_ctr;
INSERT_PADDING_BYTES_NOINIT(0x30); NCASparseInfo sparse_info;
NCACompressionInfo compression; NCACompressionInfo compression_info;
INSERT_PADDING_BYTES_NOINIT(0x60); INSERT_PADDING_BYTES_NOINIT(0x60);
}; };
static_assert(sizeof(NCASectionRaw) == 0x200, "NCASectionRaw has incorrect size."); static_assert(sizeof(NCASectionRaw) == 0x200, "NCASectionRaw has incorrect size.");
@ -235,7 +248,15 @@ bool NCA::ReadSections(const std::vector<NCASectionHeader>& sections, u64 bktr_b
for (std::size_t i = 0; i < sections.size(); ++i) { for (std::size_t i = 0; i < sections.size(); ++i) {
const auto& section = sections[i]; const auto& section = sections[i];
if (section.raw.compression.table_offset != 0 && section.raw.compression.table_size != 0) { if (section.raw.sparse_info.bucket.table_offset != 0 &&
section.raw.sparse_info.bucket.table_size != 0) {
LOG_ERROR(Loader, "Sparse NCAs are not supported.");
status = Loader::ResultStatus::ErrorSparseNCA;
return false;
}
if (section.raw.compression_info.bucket.table_offset != 0 &&
section.raw.compression_info.bucket.table_size != 0) {
LOG_ERROR(Loader, "Compressed NCAs are not supported."); LOG_ERROR(Loader, "Compressed NCAs are not supported.");
status = Loader::ResultStatus::ErrorCompressedNCA; status = Loader::ResultStatus::ErrorCompressedNCA;
return false; return false;

View file

@ -80,6 +80,7 @@ enum class ResultStatus : u16 {
ErrorIncorrectPFSFileSize, ErrorIncorrectPFSFileSize,
ErrorBadNCAHeader, ErrorBadNCAHeader,
ErrorCompressedNCA, ErrorCompressedNCA,
ErrorSparseNCA,
ErrorMissingProductionKeyFile, ErrorMissingProductionKeyFile,
ErrorMissingHeaderKey, ErrorMissingHeaderKey,
ErrorIncorrectHeaderKey, ErrorIncorrectHeaderKey,