This commit is contained in:
Aurora 2016-04-14 17:10:55 +02:00
parent a0334120a6
commit 939965b5a0
10 changed files with 38 additions and 61 deletions

View File

@ -33,6 +33,8 @@ objects = $(patsubst $(dir_source)/%.s, $(dir_build)/%.o, \
$(patsubst $(dir_source)/%.c, $(dir_build)/%.o, \
$(call rwildcard, $(dir_source), *.s *.c)))
bundled = $(dir_build)/patches.h $(dir_build)/loader.h $(dir_build)/screeninit.h
.PHONY: all
all: launcher a9lh ninjhax
@ -82,6 +84,12 @@ $(dir_out)/3ds/$(name): $(dir_out)
$(dir_out)/$(name).zip: launcher a9lh ninjhax
@cd "$(@D)" && zip -9 -r $(name) *
$(dir_build)/main.bin: $(dir_build)/main.elf
$(OC) -S -O binary $< $@
$(dir_build)/main.elf: $(objects)
$(CC) $(LDFLAGS) -T linker.ld $(OUTPUT_OPTION) $^
$(dir_build)/patches.h: $(dir_patches)/emunand.s $(dir_patches)/reboot.s $(dir_injector)/Makefile
@mkdir -p "$(@D)"
@armips $<
@ -100,16 +108,10 @@ $(dir_build)/screeninit.h: $(dir_screeninit)/Makefile
@mv $(dir_screeninit)/screeninit.bin $(@D)
@bin2c -o $@ -n screeninit $(@D)/screeninit.bin
$(dir_build)/main.bin: $(dir_build)/main.elf
$(OC) -S -O binary $< $@
$(dir_build)/main.elf: $(objects)
$(CC) $(LDFLAGS) -T linker.ld $(OUTPUT_OPTION) $^
$(dir_build)/memory.o : CFLAGS += -O3
$(dir_build)/config.o : CFLAGS += -DCONFIG_TITLE="\"$(name) $(version) configuration\""
$(dir_build)/%.o: $(dir_source)/%.c $(dir_build)/patches.h $(dir_build)/loader.h $(dir_build)/screeninit.h
$(dir_build)/%.o: $(dir_source)/%.c $(bundled)
@mkdir -p "$(@D)"
$(COMPILE.c) $(OUTPUT_OPTION) $<

View File

@ -125,10 +125,9 @@ static int loadTitleLocaleConfig(u64 progId, u8 *regionId, u8 *languageId)
char path[] = "/aurei/locales/0000000000000000.txt";
u32 i = 30;
while(progId > 0)
{
static u32 i = 30;
static const char hexDigits[] = "0123456789ABCDEF";
path[i--] = hexDigits[(u32)(progId & 0xF)];
progId >>= 4;
@ -146,22 +145,27 @@ static int loadTitleLocaleConfig(u64 progId, u8 *regionId, u8 *languageId)
if(!R_SUCCEEDED(ret) || total < 6) return -1;
static const char *regions[] = {"JPN", "USA", "EUR", "AUS", "CHN", "KOR", "TWN"};
static const char *languages[] = {"JP", "EN", "FR", "DE", "IT", "ES", "ZH", "KO", "NL", "PT", "RU", "TW"};
for(u32 i = 0; i < 7; ++i)
{
static const char *regions[] = {"JPN", "USA", "EUR", "AUS", "CHN", "KOR", "TWN"};
if(memcmp(buf, regions[i], 3) == 0)
{
*regionId = (u8)i;
break;
}
}
for(u32 i = 0; i < 12; ++i)
{
static const char *languages[] = {"JP", "EN", "FR", "DE", "IT", "ES", "ZH", "KO", "NL", "PT", "RU", "TW"};
if(memcmp(buf + 4, languages[i], 2) == 0)
{
*languageId = (u8)i;
break;
}
}
}
return ret;

View File

@ -72,11 +72,11 @@ void configureCFW(const char *configPath)
}
endPos += SPACING_Y / 2;
u32 color = COLOR_RED;
//Display all the normal options in white except for the first one
for(u32 i = 0; i < singleOptionsAmount; i++)
{
static u32 color = COLOR_RED;
singleOptions[i].posY = endPos + SPACING_Y;
endPos = drawString(singleOptionsText[i], 10, singleOptions[i].posY, color);
if(singleOptions[i].enabled) drawCharacter(selected, 10 + SPACING_X, singleOptions[i].posY, color);

View File

@ -284,11 +284,11 @@ static u32 fatStart;
//Initialize the CTRNAND crypto
void ctrNandInit(void)
{
u8 nandCid[0x10];
u8 cid[0x10];
u8 shaSum[0x20];
sdmmc_get_cid(1, (u32 *)nandCid);
sha(shaSum, nandCid, 0x10, SHA_256_MODE);
sdmmc_get_cid(1, (u32 *)cid);
sha(shaSum, cid, 0x10, SHA_256_MODE);
memcpy(nandCTR, shaSum, 0x10);
if(console)
@ -329,33 +329,13 @@ u32 ctrNandRead(u32 sector, u32 sectorCount, u8 *outbuf)
return result;
}
//Encrypt and write to the selected CTRNAND
u32 ctrNandWrite(u32 sector, u32 sectorCount, u8 *inbuf)
{
u8 tmpCTR[0x10];
memcpy(tmpCTR, nandCTR, 0x10);
aes_advctr(tmpCTR, (sector + fatStart) * 0x200 / AES_BLOCK_SIZE, AES_INPUT_BE | AES_INPUT_NORMAL);
//Encrypt
aes_use_keyslot(nandSlot);
aes(inbuf, inbuf, sectorCount * 0x200 / AES_BLOCK_SIZE, tmpCTR, AES_CTR_MODE, AES_INPUT_BE | AES_INPUT_NORMAL);
//Write
if(!firmSource)
return sdmmc_nand_writesectors(sector + fatStart, sectorCount, inbuf);
sector += emuOffset;
return sdmmc_sdcard_writesectors(sector + fatStart, sectorCount, inbuf);
}
//Decrypt a FIRM ExeFS
void decryptExeFs(u8 *inbuf)
{
u8 *exeFsOffset = inbuf + *(u32 *)(inbuf + 0x1A0) * 0x200;
u32 exeFsSize = *(u32 *)(inbuf + 0x1A4) * 0x200;
u8 ncchCTR[0x10];
u8 ncchCTR[0x10] = {0};
memset32(ncchCTR, 0, 0x10);
for(u32 i = 0; i < 8; i++)
ncchCTR[7 - i] = *(inbuf + 0x108 + i);
ncchCTR[8] = 2;

View File

@ -85,6 +85,5 @@ extern u32 emuOffset, console, firmSource;
void ctrNandInit(void);
u32 ctrNandRead(u32 sector, u32 sectorCount, u8 *outbuf);
u32 ctrNandWrite(u32 sector, u32 sectorCount, u8 *inbuf);
void decryptExeFs(u8 *inbuf);
void arm9Loader(u8 *arm9Section, u32 mode);

View File

@ -10,7 +10,7 @@
void getEmunandSect(u32 *off, u32 *head, u32 *emuNAND)
{
u8 *const temp = (u8 *)0x24300000;
static u8 *const temp = (u8 *)0x24300000;
const u32 nandSize = getMMCDevice(0)->total_size;
u32 nandOffset = *emuNAND == 1 ? 0 :

View File

@ -94,17 +94,8 @@ DRESULT disk_write (
UINT count /* Number of sectors to write */
)
{
switch(pdrv)
{
case SDCARD:
if(sdmmc_sdcard_writesectors(sector, count, (BYTE *)buff))
return RES_PARERR;
break;
case CTRNAND:
if(ctrNandWrite(sector, count, (BYTE *)buff))
return RES_PARERR;
break;
}
if(pdrv == SDCARD && sdmmc_sdcard_writesectors(sector, count, (BYTE *)buff))
return RES_PARERR;
return RES_OK;
}

View File

@ -21,13 +21,10 @@
static firmHeader *const firm = (firmHeader *)0x24000000;
static const firmSectionHeader *section;
static const char *firmFolders[3][2] = {{ "00000002", "20000002" },
{ "00000102", "20000102" },
{ "00000202", "20000202" }};
u32 config,
console,
emuOffset,
firmSource;
firmSource,
emuOffset;
void main(void)
{
@ -175,7 +172,7 @@ void main(void)
Just the no-forcing flag being set is not enough */
if((newConfig & 0x2F) != (config & 0x3F))
{
//Preserve user settings (first 2 bytes)
//Preserve user settings (last 26 bits)
newConfig |= config & 0xFFFFFFC0;
fileWrite(&newConfig, configPath, 4);
@ -215,6 +212,10 @@ static inline void loadFirm(u32 firmType, u32 externalFirm)
if(!firmSize)
{
const char *firmFolders[3][2] = {{ "00000002", "20000002" },
{ "00000102", "20000102" },
{ "00000202", "20000202" }};
firmRead(firm, firmFolders[firmType][console]);
decryptExeFs((u8 *)firm);
}
@ -363,7 +364,7 @@ static inline void patchTwlAgbFirm(u32 firmType)
firm->arm9Entry = (u8 *)0x801301C;
}
static const patchData twlPatches[] = {
const patchData twlPatches[] = {
{{0x1650C0, 0x165D64}, {{ 6, 0x00, 0x20, 0x4E, 0xB0, 0x70, 0xBD }}, 0},
{{0x173A0E, 0x17474A}, { .type1 = 0x2001 }, 1},
{{0x174802, 0x17553E}, { .type1 = 0x2000 }, 2},

View File

@ -114,12 +114,11 @@ void firmRead(void *dest, const char *firmFolder)
//Complete the string with the .app name
memcpy(&path[34], "/00000000.app", 14);
//Last digit of the .app
u32 i = 42;
//Convert back the .app name from integer to array
while(id > 0)
{
//Last digit of the .app
static u32 i = 42;
static const char hexDigits[] = "0123456789ABCDEF";
path[i--] = hexDigits[id & 0xF];
id >>= 4;

View File

@ -18,7 +18,8 @@ u32 waitInput(void)
//Wait for no keys to be pressed
while(HID_PAD);
do {
do
{
//Wait for a key to be pressed
while(!HID_PAD);