diff --git a/include/arm9/firm.h b/include/arm9/firm.h index c405b10..1d91cf4 100644 --- a/include/arm9/firm.h +++ b/include/arm9/firm.h @@ -52,7 +52,7 @@ { #endif -bool firm_size(size_t *size); +bool firm_size(size_t *size, const firm_header *const hdr); s32 loadVerifyFirm(const char *const path, bool skipHashCheck, bool installMode); noreturn void firmLaunch(void); diff --git a/source/arm9/firm.c b/source/arm9/firm.c index f6f618f..f21a40c 100644 --- a/source/arm9/firm.c +++ b/source/arm9/firm.c @@ -85,9 +85,8 @@ /* Calculates the actual firm partition size by using its header */ -bool firm_size(size_t *size) +bool firm_size(size_t *size, const firm_header *const hdr) { - firm_header *firm_hdr = (firm_header*)FIRM_LOAD_ADDR; u32 curLen = sizeof(firm_header); u32 curOffset = 0; *size = 0; @@ -95,7 +94,7 @@ /* scan sections in reverse order */ for(int i=3; i>=0; i--) { - firm_sectionheader *section = &firm_hdr->section[i]; + const firm_sectionheader *const section = &hdr->section[i]; if(section->size == 0) continue; @@ -201,7 +200,7 @@ if(!partitionGetSectorOffset(partInd, §or)) return -3; if(!dev_decnand->read_sector(sector, 1, (void*)FIRM_LOAD_ADDR)) return -4; - if(!firm_size((size_t*)&firmSize)) return -5; + if(!firm_size((size_t*)&firmSize, firmHdr)) return -5; sector++; if(!dev_decnand->read_sector(sector, (firmSize>>9) - 1, (void*)(FIRM_LOAD_ADDR + sizeof(firm_header)))) return -4; @@ -211,7 +210,7 @@ firm_header *const ramBootHdr = (firm_header*)RAM_FIRM_BOOT_ADDR; if(memcmp(&ramBootHdr->magic, "FIRM", 4) == 0) { - if(!firm_size((size_t*)&firmSize)) return -5; + if(!firm_size((size_t*)&firmSize, ramBootHdr)) return -5; NDMA_copy((u32*)FIRM_LOAD_ADDR, (u32*)RAM_FIRM_BOOT_ADDR, firmSize); ramBootHdr->magic = 0; } diff --git a/source/arm9/firmwriter.c b/source/arm9/firmwriter.c index 12a6634..2cbb2be 100644 --- a/source/arm9/firmwriter.c +++ b/source/arm9/firmwriter.c @@ -86,7 +86,7 @@ if(!partitionGetSectorOffset(partInd, §or)) return -4; size_t firmSize; - if(!firm_size(&firmSize)) return -5; + if(!firm_size(&firmSize, (firm_header*)FIRM_LOAD_ADDR)) return -5; u8 *firmBuf = (u8*)FIRM_LOAD_ADDR; if(replaceSig)