file_sys/content_archive: Detect sparse NCAs
This commit is contained in:
parent
5439c7ea71
commit
9545dcf908
2 changed files with 26 additions and 4 deletions
|
@ -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;
|
||||||
|
|
|
@ -80,6 +80,7 @@ enum class ResultStatus : u16 {
|
||||||
ErrorIncorrectPFSFileSize,
|
ErrorIncorrectPFSFileSize,
|
||||||
ErrorBadNCAHeader,
|
ErrorBadNCAHeader,
|
||||||
ErrorCompressedNCA,
|
ErrorCompressedNCA,
|
||||||
|
ErrorSparseNCA,
|
||||||
ErrorMissingProductionKeyFile,
|
ErrorMissingProductionKeyFile,
|
||||||
ErrorMissingHeaderKey,
|
ErrorMissingHeaderKey,
|
||||||
ErrorIncorrectHeaderKey,
|
ErrorIncorrectHeaderKey,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue