From 4c9abef1a90c9f09029bf6b4941289f91cf0d8bd Mon Sep 17 00:00:00 2001 From: smea Date: Sun, 24 Aug 2014 23:25:54 -0700 Subject: [PATCH] APT WORKAROUND (update 3dsx_crt0.s to https://gist.github.com/smealum/305802b2b9bf4c877ddb and recompile everything please) --- libctru/include/3ds/APT.h | 5 ++- libctru/source/services/apt.c | 71 +++++++++++++++++++++-------------- 2 files changed, 46 insertions(+), 30 deletions(-) diff --git a/libctru/include/3ds/APT.h b/libctru/include/3ds/APT.h index 3a42e9f..aae153c 100644 --- a/libctru/include/3ds/APT.h +++ b/libctru/include/3ds/APT.h @@ -1,6 +1,9 @@ #ifndef APT_H #define APT_H +// TODO : find a better place to put this +#define RUNFLAG_APTWORKAROUND (BIT(0)) + typedef enum{ APPID_HOMEMENU = 0x101, // Home Menu APPID_CAMERA = 0x110, // Camera applet @@ -35,7 +38,7 @@ enum { extern Handle aptEvents[3]; -Result aptInit(NS_APPID appID); +Result aptInit(); void aptExit(); void aptOpenSession(); void aptCloseSession(); diff --git a/libctru/source/services/apt.c b/libctru/source/services/apt.c index 786fb68..80b975b 100644 --- a/libctru/source/services/apt.c +++ b/libctru/source/services/apt.c @@ -12,6 +12,10 @@ #define APT_HANDLER_STACKSIZE (0x1000) +//TODO : better place to put this ? +extern u32 __apt_appid; +extern u32 __system_runflags; + NS_APPID currentAppId; Handle aptLockHandle; @@ -292,7 +296,7 @@ void aptEventHandler(u32 arg) svcExitThread(); } -Result aptInit(NS_APPID appID) +Result aptInit(void) { Result ret=0; @@ -301,19 +305,22 @@ Result aptInit(NS_APPID appID) if((ret=APT_GetLockHandle(&aptuHandle, 0x0, &aptLockHandle)))return ret; svcCloseHandle(aptuHandle); - currentAppId = appID; + currentAppId = __apt_appid; aptOpenSession(); if((ret=APT_Initialize(NULL, currentAppId, &aptEvents[0], &aptEvents[1])))return ret; aptCloseSession(); - - aptOpenSession(); - if((ret=APT_Enable(NULL, 0x0)))return ret; - aptCloseSession(); - - aptOpenSession(); - if((ret=APT_NotifyToWait(NULL, currentAppId)))return ret; - aptCloseSession(); + + if(!(__system_runflags&RUNFLAG_APTWORKAROUND)) + { + aptOpenSession(); + if((ret=APT_Enable(NULL, 0x0)))return ret; + aptCloseSession(); + + aptOpenSession(); + if((ret=APT_NotifyToWait(NULL, currentAppId)))return ret; + aptCloseSession(); + } svcCreateEvent(&aptStatusEvent, 0); return 0; @@ -331,13 +338,16 @@ void aptExit() aptCloseSession(); } - aptOpenSession(); - APT_PrepareToCloseApplication(NULL, 0x1); - aptCloseSession(); - - aptOpenSession(); - APT_CloseApplication(NULL, 0x0, 0x0, 0x0); - aptCloseSession(); + if(!(__system_runflags&RUNFLAG_APTWORKAROUND)) + { + aptOpenSession(); + APT_PrepareToCloseApplication(NULL, 0x1); + aptCloseSession(); + + aptOpenSession(); + APT_CloseApplication(NULL, 0x0, 0x0, 0x0); + aptCloseSession(); + } svcCloseHandle(aptStatusMutex); //svcCloseHandle(aptLockHandle); @@ -370,21 +380,24 @@ void aptSetupEventHandler() APT_AppletUtility(NULL, NULL, 0x4, 0x1, buf1, 0x1, buf2); aptCloseSession();*/ - memset(buf1, 0, 4); + if(!(__system_runflags&RUNFLAG_APTWORKAROUND)) + { + memset(buf1, 0, 4); - buf1[0] = 0x10; - aptOpenSession(); - APT_AppletUtility(NULL, NULL, 0x7, 0x4, buf1, 0x1, buf2); - aptCloseSession(); + buf1[0] = 0x10; + aptOpenSession(); + APT_AppletUtility(NULL, NULL, 0x7, 0x4, buf1, 0x1, buf2); + aptCloseSession(); - buf1[0] = 0x00; - aptOpenSession(); - APT_AppletUtility(NULL, NULL, 0x4, 0x1, buf1, 0x1, buf2); - aptCloseSession(); + buf1[0] = 0x00; + aptOpenSession(); + APT_AppletUtility(NULL, NULL, 0x4, 0x1, buf1, 0x1, buf2); + aptCloseSession(); - aptOpenSession(); - APT_AppletUtility(NULL, NULL, 0x4, 0x1, buf1, 0x1, buf2); - aptCloseSession(); + aptOpenSession(); + APT_AppletUtility(NULL, NULL, 0x4, 0x1, buf1, 0x1, buf2); + aptCloseSession(); + } svcCreateMutex(&aptStatusMutex, true); aptStatus=0;