From 7927c742c6f6e683f9b0f7aa274521fdb5ab6e00 Mon Sep 17 00:00:00 2001 From: d0k3 Date: Mon, 5 Feb 2018 23:16:58 +0100 Subject: [PATCH] Fix all occurences of NAND_BUFFER & SDCRYPT_BUFFER --- arm9/source/common/common.h | 9 --------- arm9/source/filesys/fsutil.c | 10 ++++++++-- arm9/source/filesys/sddata.c | 16 +++++++++++----- arm9/source/nand/nand.c | 34 +++++++++++++++++----------------- 4 files changed, 36 insertions(+), 33 deletions(-) diff --git a/arm9/source/common/common.h b/arm9/source/common/common.h index 94bc1c3..4b2f654 100644 --- a/arm9/source/common/common.h +++ b/arm9/source/common/common.h @@ -49,15 +49,6 @@ // used in several places #define STD_BUFFER_SIZE 0x100000 // must be a multiple of 0x200 -// buffer area defines (in use by godmode.c) -#define DIR_BUFFER (0x20000000) -#define DIR_BUFFER_SIZE (0x100000) -// buffer area defines (in use by nand.c) -#define NAND_BUFFER ((u8*)0x20100000) -#define NAND_BUFFER_SIZE (0x100000) // must be multiple of 0x200 -// buffer area defines (in use by sddata.c) -#define SDCRYPT_BUFFER ((u8*)0x20200000) -#define SDCRYPT_BUFFER_SIZE (0x100000) // buffer area defines (in use by scripting.c) #define SCRIPT_BUFFER ((u8*)0x20300000) #define SCRIPT_BUFFER_SIZE (0x100000) diff --git a/arm9/source/filesys/fsutil.c b/arm9/source/filesys/fsutil.c index fa91841..7ecb58c 100644 --- a/arm9/source/filesys/fsutil.c +++ b/arm9/source/filesys/fsutil.c @@ -644,7 +644,10 @@ bool PathMoveCopy(const char* dest, const char* orig, u32* flags, bool move) { // setup buffer u8* buffer = (u8*) malloc(STD_BUFFER_SIZE); - if (!buffer) return false; + if (!buffer) { + ShowPrompt(false, "Out of memory."); + return false; + } // actual move / copy operation bool same_drv = (strncasecmp(lorig, ldest, 2) == 0); @@ -680,7 +683,10 @@ bool PathMoveCopy(const char* dest, const char* orig, u32* flags, bool move) { // setup buffer u8* buffer = (u8*) malloc(STD_BUFFER_SIZE); - if (!buffer) return false; + if (!buffer) { + ShowPrompt(false, "Out of memory."); + return false; + } // actual virtual copy operation if (force_unmount) DismountDriveType(DriveType(ldest)&(DRV_SYSNAND|DRV_EMUNAND|DRV_IMAGE)); diff --git a/arm9/source/filesys/sddata.c b/arm9/source/filesys/sddata.c index 90af467..645f36e 100644 --- a/arm9/source/filesys/sddata.c +++ b/arm9/source/filesys/sddata.c @@ -192,19 +192,25 @@ FRESULT fx_write (FIL* fp, const void* buff, UINT btw, UINT* bw) { FilCryptInfo* info = fx_find_cryptinfo(fp); FSIZE_t off = f_tell(fp); FRESULT res = FR_OK; + if (info && info->fptr) { if (memcmp(info->ctr, DSIWARE_MAGIC, 16) == 0) return FR_DENIED; + void* crypt_buff = (void*) malloc(min(btw, STD_BUFFER_SIZE)); + if (!crypt_buff) return FR_DENIED; + setup_aeskeyY(0x34, info->keyy); use_aeskey(0x34); *bw = 0; - for (UINT p = 0; (p < btw) && (res == FR_OK); p += SDCRYPT_BUFFER_SIZE) { - UINT pcount = min(SDCRYPT_BUFFER_SIZE, (btw - p)); + for (UINT p = 0; (p < btw) && (res == FR_OK); p += STD_BUFFER_SIZE) { + UINT pcount = min(STD_BUFFER_SIZE, (btw - p)); UINT bwl = 0; - memcpy(SDCRYPT_BUFFER, (u8*) buff + p, pcount); - ctr_decrypt_byte(SDCRYPT_BUFFER, SDCRYPT_BUFFER, pcount, off + p, AES_CNT_CTRNAND_MODE, info->ctr); - res = f_write(fp, (const void*) SDCRYPT_BUFFER, pcount, &bwl); + memcpy(crypt_buff, (u8*) buff + p, pcount); + ctr_decrypt_byte(crypt_buff, crypt_buff, pcount, off + p, AES_CNT_CTRNAND_MODE, info->ctr); + res = f_write(fp, (const void*) crypt_buff, pcount, &bwl); *bw += bwl; } + + free(crypt_buff); } else res = f_write(fp, buff, btw, bw); return res; } diff --git a/arm9/source/nand/nand.c b/arm9/source/nand/nand.c index eafceff..adc5928 100644 --- a/arm9/source/nand/nand.c +++ b/arm9/source/nand/nand.c @@ -352,32 +352,32 @@ int ReadNandSectors(void* buffer, u32 sector, u32 count, u32 keyslot, u32 nand_s int WriteNandSectors(const void* buffer, u32 sector, u32 count, u32 keyslot, u32 nand_dst) { - u8* buffer8 = (u8*) buffer; // buffer must not be changed, so this is a little complicated - for (u32 s = 0; s < count; s += (NAND_BUFFER_SIZE / 0x200)) { - u32 pcount = min((NAND_BUFFER_SIZE/0x200), (count - s)); - memcpy(NAND_BUFFER, buffer8 + (s*0x200), pcount * 0x200); - if ((keyslot == 0x11) && (sector == SECTOR_SECRET)) CryptSector0x96(NAND_BUFFER, true); - else if (keyslot < 0x40) CryptNand(NAND_BUFFER, sector + s, pcount, keyslot); + void* nand_buffer = (void*) malloc(min(STD_BUFFER_SIZE, count * 0x200)); + if (!nand_buffer) return -1; + int errorcode = 0; + + for (u32 s = 0; s < count; s += (STD_BUFFER_SIZE / 0x200)) { + u32 pcount = min((STD_BUFFER_SIZE/0x200), (count - s)); + memcpy(nand_buffer, ((u8*) buffer) + (s*0x200), pcount * 0x200); + if ((keyslot == 0x11) && (sector == SECTOR_SECRET)) CryptSector0x96(nand_buffer, true); + else if (keyslot < 0x40) CryptNand(nand_buffer, sector + s, pcount, keyslot); if (nand_dst == NAND_EMUNAND) { - int errorcode = 0; if ((sector + s == 0) && (emunand_base_sector % 0x200000 == 0)) { // GW EmuNAND header handling - errorcode = sdmmc_sdcard_writesectors(emunand_base_sector + getMMCDevice(0)->total_size, 1, NAND_BUFFER); - errorcode = (!errorcode && (pcount > 1)) ? sdmmc_sdcard_writesectors(emunand_base_sector + 1, pcount - 1, NAND_BUFFER + 0x200) : errorcode; - } else errorcode = sdmmc_sdcard_writesectors(emunand_base_sector + sector + s, pcount, NAND_BUFFER); - if (errorcode) return errorcode; + errorcode = sdmmc_sdcard_writesectors(emunand_base_sector + getMMCDevice(0)->total_size, 1, nand_buffer); + if (!errorcode && (pcount > 1)) errorcode = sdmmc_sdcard_writesectors(emunand_base_sector + 1, pcount - 1, ((u8*) nand_buffer) + 0x200); + } else errorcode = sdmmc_sdcard_writesectors(emunand_base_sector + sector + s, pcount, nand_buffer); } else if (nand_dst == NAND_IMGNAND) { - int errorcode = WriteImageSectors(NAND_BUFFER, sector + s, pcount); - if (errorcode) return errorcode; + errorcode = WriteImageSectors(nand_buffer, sector + s, pcount); } else if (nand_dst == NAND_SYSNAND) { - int errorcode = sdmmc_nand_writesectors(sector + s, pcount, NAND_BUFFER); - if (errorcode) return errorcode; + errorcode = sdmmc_nand_writesectors(sector + s, pcount, nand_buffer); } else { - return -1; + errorcode = -1; } } - return 0; + free(nand_buffer); + return errorcode; } u32 ValidateSecretSector(u8* sector)