Fix detection of trimmed NCSD images

This commit is contained in:
d0k3 2016-12-09 15:40:13 +01:00
parent baf1a645ca
commit 8947db2037
3 changed files with 14 additions and 1 deletions

View File

@ -40,7 +40,7 @@ u32 IdentifyFileType(const char* path) {
return GAME_CIA; // CIA file return GAME_CIA; // CIA file
} else if (ValidateNcsdHeader((NcsdHeader*) (void*) header) == 0) { } else if (ValidateNcsdHeader((NcsdHeader*) (void*) header) == 0) {
NcsdHeader* ncsd = (NcsdHeader*) (void*) header; NcsdHeader* ncsd = (NcsdHeader*) (void*) header;
if (fsize >= (ncsd->size * NCSD_MEDIA_UNIT)) if (fsize >= GetNcsdTrimmedSize(ncsd))
return GAME_NCSD; // NCSD (".3DS") file return GAME_NCSD; // NCSD (".3DS") file
} else if (ValidateNcchHeader((NcchHeader*) (void*) header) == 0) { } else if (ValidateNcchHeader((NcchHeader*) (void*) header) == 0) {
NcchHeader* ncch = (NcchHeader*) (void*) header; NcchHeader* ncch = (NcchHeader*) (void*) header;

View File

@ -20,3 +20,15 @@ u32 ValidateNcsdHeader(NcsdHeader* header) {
return 0; return 0;
} }
u32 GetNcsdTrimmedSize(NcsdHeader* header) {
u32 data_units = 0;
for (u32 i = 0; i < 8; i++) {
NcchPartition* partition = header->partitions + i;
u32 partition_end = partition->offset + partition->size;
if (!partition->size) continue;
data_units = (partition_end > data_units) ? partition_end : data_units;
}
return data_units * NCSD_MEDIA_UNIT;
}

View File

@ -32,3 +32,4 @@ typedef struct {
} __attribute__((packed)) NcsdHeader; } __attribute__((packed)) NcsdHeader;
u32 ValidateNcsdHeader(NcsdHeader* header); u32 ValidateNcsdHeader(NcsdHeader* header);
u32 GetNcsdTrimmedSize(NcsdHeader* header);