From 8947db2037f366eb55650b6d2bf8c5ce5ee037b2 Mon Sep 17 00:00:00 2001 From: d0k3 Date: Fri, 9 Dec 2016 15:40:13 +0100 Subject: [PATCH] Fix detection of trimmed NCSD images --- source/filetype.c | 2 +- source/game/ncsd.c | 12 ++++++++++++ source/game/ncsd.h | 1 + 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/source/filetype.c b/source/filetype.c index c9153fb..c224ac0 100644 --- a/source/filetype.c +++ b/source/filetype.c @@ -40,7 +40,7 @@ u32 IdentifyFileType(const char* path) { return GAME_CIA; // CIA file } else if (ValidateNcsdHeader((NcsdHeader*) (void*) header) == 0) { NcsdHeader* ncsd = (NcsdHeader*) (void*) header; - if (fsize >= (ncsd->size * NCSD_MEDIA_UNIT)) + if (fsize >= GetNcsdTrimmedSize(ncsd)) return GAME_NCSD; // NCSD (".3DS") file } else if (ValidateNcchHeader((NcchHeader*) (void*) header) == 0) { NcchHeader* ncch = (NcchHeader*) (void*) header; diff --git a/source/game/ncsd.c b/source/game/ncsd.c index ad7797f..bedadd2 100644 --- a/source/game/ncsd.c +++ b/source/game/ncsd.c @@ -20,3 +20,15 @@ u32 ValidateNcsdHeader(NcsdHeader* header) { 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; +} diff --git a/source/game/ncsd.h b/source/game/ncsd.h index 14ab3ea..2a08a46 100644 --- a/source/game/ncsd.h +++ b/source/game/ncsd.h @@ -32,3 +32,4 @@ typedef struct { } __attribute__((packed)) NcsdHeader; u32 ValidateNcsdHeader(NcsdHeader* header); +u32 GetNcsdTrimmedSize(NcsdHeader* header);