Further clean-up of the patcher code

This commit is contained in:
Aurora 2016-03-29 22:43:15 +02:00
parent ac9bdc7665
commit c80ac985fe

View File

@ -70,7 +70,7 @@ static int file_open(IFile *file, FS_ArchiveID id, const char *path, int flags){
return IFile_Open(file, archive, ppath, flags); return IFile_Open(file, archive, ppath, flags);
} }
static int patch_secureinfo(){ static int load_secureinfo(){
IFile file; IFile file;
Result ret; Result ret;
u64 total; u64 total;
@ -78,20 +78,6 @@ static int patch_secureinfo(){
if(secureinfo[0] == 0xFF) if(secureinfo[0] == 0xFF)
return 0; return 0;
ret = file_open(&file, ARCHIVE_SDMC, "/SecureInfo_A", FS_OPEN_READ);
if(R_SUCCEEDED(ret)){
ret = IFile_Read(&file, &total, secureinfo, sizeof(secureinfo));
IFile_Close(&file);
if(R_SUCCEEDED(ret) && total == sizeof(secureinfo)){
ret = file_open(&file, ARCHIVE_NAND_RW, "/sys/SecureInfo_C", FS_OPEN_WRITE | FS_OPEN_CREATE);
if(R_SUCCEEDED(ret)){
ret = IFile_Write(&file, &total, secureinfo, sizeof(secureinfo), FS_WRITE_FLUSH);
IFile_Close(&file);
}
secureinfo[0] = 0xFF; // we repurpose this byte as status
}
}
else { // get file from NAND
ret = file_open(&file, ARCHIVE_NAND_RW, "/sys/SecureInfo_C", FS_OPEN_READ); ret = file_open(&file, ARCHIVE_NAND_RW, "/sys/SecureInfo_C", FS_OPEN_READ);
if(R_SUCCEEDED(ret)){ if(R_SUCCEEDED(ret)){
ret = IFile_Read(&file, &total, secureinfo, sizeof(secureinfo)); ret = IFile_Read(&file, &total, secureinfo, sizeof(secureinfo));
@ -99,12 +85,11 @@ static int patch_secureinfo(){
if(R_SUCCEEDED(ret) && total == sizeof(secureinfo)) if(R_SUCCEEDED(ret) && total == sizeof(secureinfo))
secureinfo[0] = 0xFF; secureinfo[0] = 0xFF;
} }
}
return ret; return ret;
} }
static int open_config(){ static int load_config(){
IFile file; IFile file;
Result ret; Result ret;
u64 total; u64 total;
@ -122,13 +107,15 @@ static int open_config(){
} }
u32 patch_code(u64 progid, u8 *code, u32 size){ u32 patch_code(u64 progid, u8 *code, u32 size){
if( progid == 0x0004003000008F02LL || // USA Menu switch(progid){
progid == 0x0004003000008202LL || // JPN Menu
progid == 0x0004003000009802LL || // EUR Menu case 0x0004003000008F02LL: // USA Menu
progid == 0x000400300000A102LL || // CHN Menu case 0x0004003000008202LL: // EUR Menu
progid == 0x000400300000A902LL || // KOR Menu case 0x0004003000009802LL: // JPN Menu
progid == 0x000400300000B102LL // TWN Menu case 0x000400300000A102LL: // CHN Menu
){ case 0x000400300000A902LL: // KOR Menu
case 0x000400300000B102LL: // TWN Menu
{
static const u8 regionFreePattern[] = { static const u8 regionFreePattern[] = {
0x00, 0x00, 0x55, 0xE3, 0x01, 0x10, 0xA0, 0xE3 0x00, 0x00, 0x55, 0xE3, 0x01, 0x10, 0xA0, 0xE3
}; };
@ -142,8 +129,11 @@ u32 patch_code(u64 progid, u8 *code, u32 size){
regionFreePatch, regionFreePatch,
sizeof(regionFreePatch), 1 sizeof(regionFreePatch), 1
); );
break;
} }
else if(progid == 0x0004013000002C02LL){ // NIM
case 0x0004013000002C02LL: // NIM
{
static const u8 blockAutoUpdatesPattern[] = { static const u8 blockAutoUpdatesPattern[] = {
0x25, 0x79, 0x0B, 0x99 0x25, 0x79, 0x0B, 0x99
}; };
@ -178,7 +168,7 @@ u32 patch_code(u64 progid, u8 *code, u32 size){
blockEShopUpdateCheckPatch, blockEShopUpdateCheckPatch,
sizeof(blockEShopUpdateCheckPatch), 1 sizeof(blockEShopUpdateCheckPatch), 1
); );
if(R_SUCCEEDED(patch_secureinfo())){ if(R_SUCCEEDED(load_secureinfo())){
switch(secureinfo[0x100]){ switch(secureinfo[0x100]){
case 1: country = "US"; break; case 1: country = "US"; break;
case 2: country = "GB"; break; // sorry rest-of-Europe, you have to change this case 2: country = "GB"; break; // sorry rest-of-Europe, you have to change this
@ -203,30 +193,34 @@ u32 patch_code(u64 progid, u8 *code, u32 size){
sizeof(countryRespPatch), 1 sizeof(countryRespPatch), 1
); );
} }
break;
} }
else if(
progid == 0x0004001000021000LL || // USA MSET case 0x0004001000021000LL: // USA MSET
progid == 0x0004001000020000LL || // JPN MSET case 0x0004001000020000LL: // JPN MSET
progid == 0x0004001000022000LL || // EUR MSET case 0x0004001000022000LL: // EUR MSET
progid == 0x0004001000026000LL || // CHN MSET case 0x0004001000026000LL: // CHN MSET
progid == 0x0004001000027000LL || // KOR MSET case 0x0004001000027000LL: // KOR MSET
progid == 0x0004001000028000LL // TWN MSET case 0x0004001000028000LL: // TWN MSET
){ {
if(R_SUCCEEDED(open_config()) && ((config >> 5) & 0x1)){ if(R_SUCCEEDED(load_config()) && ((config >> 5) & 0x1)){
static const u16 VerPattern[] = u"Ver."; static const u16 verPattern[] = u"Ver.";
const u32 currentFirm = ((config >> 12) & 0x1); const u32 currentFirm = ((config >> 12) & 0x1);
const u32 currentNand = ((config >> 13) & 0x3); const u32 currentNand = ((config >> 13) & 0x3);
patch_memory(code, size, patch_memory(code, size,
VerPattern, verPattern,
sizeof(VerPattern) - sizeof(u16), 0, sizeof(verPattern) - sizeof(u16), 0,
currentNand ? ((currentNand == 1) ? ((currentFirm == 1) ? u" Emu" : u"Emu9") : u"Emu2") : currentNand ? ((currentNand == 1) ? ((currentFirm == 1) ? u" Emu" : u"Emu9") : u"Emu2") :
((currentFirm == 1) ? u" Sys" : u"Sys9"), ((currentFirm == 1) ? u" Sys" : u"Sys9"),
sizeof(VerPattern) - sizeof(u16), 1 sizeof(verPattern) - sizeof(u16), 1
); );
} }
break;
} }
else if (progid == 0x0004013000008002LL){ // NS
case 0x0004013000008002LL: // NS
{
static const u8 stopCartUpdatesPattern[] = { static const u8 stopCartUpdatesPattern[] = {
0x0C, 0x18, 0xE1, 0xD8 0x0C, 0x18, 0xE1, 0xD8
}; };
@ -240,8 +234,11 @@ u32 patch_code(u64 progid, u8 *code, u32 size){
stopCartUpdatesPatch, stopCartUpdatesPatch,
sizeof(stopCartUpdatesPatch), 2 sizeof(stopCartUpdatesPatch), 2
); );
break;
} }
else if(progid == 0x0004013000001702LL){ // CFG
case 0x0004013000001702LL: // CFG
{
static const u8 secureinfoSigCheckPattern[] = { static const u8 secureinfoSigCheckPattern[] = {
0x06, 0x46, 0x10, 0x48, 0xFC 0x06, 0x46, 0x10, 0x48, 0xFC
}; };
@ -258,7 +255,7 @@ u32 patch_code(u64 progid, u8 *code, u32 size){
secureinfoSigCheckPatch, secureinfoSigCheckPatch,
sizeof(secureinfoSigCheckPatch), 1 sizeof(secureinfoSigCheckPatch), 1
); );
if(R_SUCCEEDED(patch_secureinfo())){ if(R_SUCCEEDED(load_secureinfo())){
// use SecureInfo_C // use SecureInfo_C
patch_memory(code, size, patch_memory(code, size,
secureinfoFilenamePattern, secureinfoFilenamePattern,
@ -268,6 +265,8 @@ u32 patch_code(u64 progid, u8 *code, u32 size){
sizeof(secureinfoFilenamePatch) - sizeof(u16), 2 sizeof(secureinfoFilenamePatch) - sizeof(u16), 2
); );
} }
break;
}
} }
return 0; return 0;