From decffac7e18c6d174a84143ad3c47204871019c1 Mon Sep 17 00:00:00 2001 From: root <182859762@qq.com> Date: Wed, 24 Apr 2024 16:30:43 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=84=E7=90=86boot.firm=E4=B8=8D=E5=AD=98?= =?UTF-8?q?=E5=9C=A8=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Makefile | 3 +- include/arm11/open_agb_firm.h | 1 + resources/boot.firm | Bin 282624 -> 279040 bytes source/arm11/open_agb_firm.c | 81 +++++++++++++++++++++++++++++++++- source/arm11/pages.c | 5 +++ 5 files changed, 87 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index f7f7bbe..f6e2a60 100644 --- a/Makefile +++ b/Makefile @@ -82,5 +82,6 @@ endif @7z u -mx -m0=LZMA $(TARGET)$(VERS_STRING).7z resources/gba_db.bin @7z u -mx -m0=LZMA $(TARGET)$(VERS_STRING).7z resources/wqy11.fnt @7z u -mx -m0=LZMA $(TARGET)$(VERS_STRING).7z resources/gba.acl + @7z u -mx -m0=LZMA $(TARGET)$(VERS_STRING).7z resources/boot.firm @7z u -mx -m0=PPMD $(TARGET)$(VERS_STRING).7z libn3ds/thirdparty/fatfs/LICENSE.txt thirdparty/inih/LICENSE.txt LICENSE.txt README.md - @7z rn $(TARGET)$(VERS_STRING).7z resources/gba_db.bin 3ds/open_agb_firm/gba_db.bin resources/wqy11.fnt 3ds/open_agb_firm/wqy11.fnt libn3ds/thirdparty/fatfs/LICENSE.txt LICENSE_fatfs.txt thirdparty/inih/LICENSE.txt LICENSE_inih.txt resources/gba.acl 3ds/open_agb_firm/gba.acl + @7z rn $(TARGET)$(VERS_STRING).7z resources/gba_db.bin 3ds/open_agb_firm/gba_db.bin resources/wqy11.fnt 3ds/open_agb_firm/wqy11.fnt libn3ds/thirdparty/fatfs/LICENSE.txt LICENSE_fatfs.txt thirdparty/inih/LICENSE.txt LICENSE_inih.txt resources/gba.acl 3ds/open_agb_firm/gba.acl resources/boot.firm 3ds/open_agb_firm/boot.firm diff --git a/include/arm11/open_agb_firm.h b/include/arm11/open_agb_firm.h index 25e47bd..7d42e78 100644 --- a/include/arm11/open_agb_firm.h +++ b/include/arm11/open_agb_firm.h @@ -67,5 +67,6 @@ Result oafInitAndRun( char * ); void oafUpdate(void); void oafFinish(void); Result oafPreboot( const char * ); +bool oafRebootReady( void ); int oafCheatMode(void); int oafHaltMode(void); diff --git a/resources/boot.firm b/resources/boot.firm index 334ecdb2766cb264fa6e0e1ec93110be9d5986c8..8c885b6bfa20b216807a928873db909d5f8f2b4c 100644 GIT binary patch delta 9705 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 bwHOsHj~o;h-Fr|R=JNeFxc1=@G5!Al{r1M% diff --git a/source/arm11/open_agb_firm.c b/source/arm11/open_agb_firm.c index 8e202ff..ae33b62 100644 --- a/source/arm11/open_agb_firm.c +++ b/source/arm11/open_agb_firm.c @@ -1094,6 +1094,41 @@ void oafFinish(void) } static const char *autorun = "sdmc:/luma/payloads/autorun.luma"; + +static u32 luma_reboot_ctx = 0; +#define LUMA_REBOOT_READY 1 +#define LUMA_REBOOT_LOCAL 2 +#define LUMA_REBOOT_GLOBAL 4 +static bool checkLumaFirm( const char *file ) +{ + FHandle h; + char text[64]; // 比length大就行 + u32 readed; + u32 length = strlen( autorun ); + Result res = fOpen(&h, file, FA_OPEN_EXISTING | FA_READ); + if( RES_OK != res ) return false; + + res = fLseek(h, 0x3bd50); // 有疑问,就自己用16进制编辑器看这个地址 + if( RES_OK != res ) + { + fClose(h); + return false; + } + + res = fRead(h, text, length, &readed); + fClose(h); + + if( RES_OK != res || readed != length) + { + return false; + } + else + { + text[length] = '\0'; + return 0 == strcmp(text, autorun); + } +} + static void repairBootFirm( char *firm_path ) { if( 0 == strcmp(firm_path, autorun) ) @@ -1112,14 +1147,56 @@ static void repairBootFirm( char *firm_path ) } firm_path[0x3f] = '\0'; } + + // 把Preboot存档的boot.firm恢复回去 + char tmp[5]; + if( RES_OK == fsQuickRead("luma.firm", tmp, 4) ) + { + tmp[4] = '\0'; + if( strcmp(tmp, "FIRM") == 0 ){ + fRename("sdmc:/boot.firm", "sdmc:/3ds/open_agb_firm/boot.firm"); + fRename("sdmc:/3ds/open_agb_firm/luma.firm", "sdmc:/boot.firm"); + } + } + + // 检查哪个boot.firm是支持autorun.luma文件的 + if( checkLumaFirm("sdmc:/3ds/open_agb_firm/boot.firm") ) + { + luma_reboot_ctx |= LUMA_REBOOT_LOCAL; + } + + if( checkLumaFirm( "sdmc:/boot.firm" ) ) + { + luma_reboot_ctx |= LUMA_REBOOT_GLOBAL; + } + + luma_reboot_ctx |= LUMA_REBOOT_READY; + + if( !oafRebootReady() ) + g_oafConfig.haltMode = HALT_MODE_POWEROFF; } Result oafPreboot( const char *firm_path ) { // 记下来要恢复的文件名。加上\n是因为fsLoadPathFromFile靠它来识别路径结尾 - char memo[0x50]; - ee_snprintf(memo, 0x49, "%s\n", firm_path); + char memo[FIRMPATH_SIZELIMIT+0x10]; + ee_snprintf(memo, FIRMPATH_SIZELIMIT+0xF, "%s\n", firm_path); fsQuickWrite("autorun", memo, strlen(memo)); + // 用户的boot.firm没有执行autorun.luma的功能。 + // 这里要用改版的boot.firm替换用户原来的boot.firm,然后在repairBootFirm还原 + if( 0 == (luma_reboot_ctx & LUMA_REBOOT_GLOBAL) ){ + fRename("sdmc:/boot.firm", "sdmc:/3ds/open_agb_firm/luma.firm"); + fRename("sdmc:/3ds/open_agb_firm/boot.firm", "sdmc:/boot.firm"); + } + return fRename(firm_path, autorun); +} + +bool oafRebootReady( void ) +{ + return (luma_reboot_ctx & LUMA_REBOOT_READY) + && ( (luma_reboot_ctx & LUMA_REBOOT_LOCAL) + || (luma_reboot_ctx & LUMA_REBOOT_GLOBAL ) + ); } \ No newline at end of file diff --git a/source/arm11/pages.c b/source/arm11/pages.c index 3146bf0..388f08b 100644 --- a/source/arm11/pages.c +++ b/source/arm11/pages.c @@ -182,6 +182,11 @@ static atp_pageopt_t config_adjust( atp_callerdata_t gblcfg, atp_counter_t index { g_oafConfig->haltMode = ( HALT_MODE_SIZE + (g_oafConfig->haltMode+(l?-1:1) ) ) % HALT_MODE_SIZE; } + else if( !oafRebootReady() ) + { + return ATP_POWER_OFF == atp_show(1, disp_str, "请正确放置boot.firm文件") + ? ATP_POWER_OFF : ATP_PAGE_REFRESH; + } else { return ATP_POWER_OFF == atp_show(1, disp_str, "SD卡的open_agb_firm文件名太长")