APT workaround when Home Menu is not launched, etc.
This commit is contained in:
parent
8d64007d70
commit
9d27eb80de
@ -103,6 +103,18 @@ static inline u32 osGetKernelVersion(void)
|
|||||||
return (*(vu32*)0x1FF80000) & ~0xFF;
|
return (*(vu32*)0x1FF80000) & ~0xFF;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Gets the system's "core version" (2 on NATIVE_FIRM, 3 on SAFE_FIRM, etc.)
|
||||||
|
static inline u32 osGetSystemCoreVersion(void)
|
||||||
|
{
|
||||||
|
return *(vu32*)0x1FF80010;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Gets the system's memory layout ID (0-5 on Old 3DS, 6-8 on New 3DS)
|
||||||
|
static inline u32 osGetApplicationMemType(void)
|
||||||
|
{
|
||||||
|
return *(vu32*)0x1FF80030;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Gets the size of the specified memory region.
|
* @brief Gets the size of the specified memory region.
|
||||||
* @param region Memory region to check.
|
* @param region Memory region to check.
|
||||||
|
@ -14,6 +14,7 @@
|
|||||||
#include <3ds/ipc.h>
|
#include <3ds/ipc.h>
|
||||||
#include <3ds/env.h>
|
#include <3ds/env.h>
|
||||||
#include <3ds/thread.h>
|
#include <3ds/thread.h>
|
||||||
|
#include <3ds/os.h>
|
||||||
|
|
||||||
#define APT_HANDLER_STACKSIZE (0x1000)
|
#define APT_HANDLER_STACKSIZE (0x1000)
|
||||||
|
|
||||||
@ -188,6 +189,8 @@ Result aptInit(void)
|
|||||||
|
|
||||||
if (AtomicPostIncrement(&aptRefCount)) return 0;
|
if (AtomicPostIncrement(&aptRefCount)) return 0;
|
||||||
|
|
||||||
|
aptHomeAllowed = osGetSystemCoreVersion() == 2;
|
||||||
|
|
||||||
// Retrieve APT lock
|
// Retrieve APT lock
|
||||||
ret = APT_GetLockHandle(0x0, &aptLockHandle);
|
ret = APT_GetLockHandle(0x0, &aptLockHandle);
|
||||||
if (R_FAILED(ret)) goto _fail;
|
if (R_FAILED(ret)) goto _fail;
|
||||||
@ -309,10 +312,22 @@ void aptExit(void)
|
|||||||
{
|
{
|
||||||
if (!exited && aptIsChainload())
|
if (!exited && aptIsChainload())
|
||||||
{
|
{
|
||||||
|
// Check if Home Menu exists and has been launched
|
||||||
|
bool hmRegistered;
|
||||||
|
if (R_SUCCEEDED(APT_IsRegistered(APPID_HOMEMENU, &hmRegistered)) && hmRegistered)
|
||||||
|
{
|
||||||
|
// Normal, sane chainload
|
||||||
u8 param[0x300] = {0};
|
u8 param[0x300] = {0};
|
||||||
u8 hmac[0x20] = {0};
|
u8 hmac[0x20] = {0};
|
||||||
APT_PrepareToDoApplicationJump(0, aptChainloadTid, aptChainloadMediatype);
|
APT_PrepareToDoApplicationJump(0, aptChainloadTid, aptChainloadMediatype);
|
||||||
APT_DoApplicationJump(param, sizeof(param), hmac);
|
APT_DoApplicationJump(param, sizeof(param), hmac);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Dirty workaround w/ custom notification
|
||||||
|
APT_Finalize(envGetAptAppId());
|
||||||
|
srvPublishToSubscriber(0x3000, 0);
|
||||||
|
}
|
||||||
while (aptMainLoop())
|
while (aptMainLoop())
|
||||||
svcSleepThread(25*1000*1000);
|
svcSleepThread(25*1000*1000);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user