Skip to content

Commit

Permalink
WIP: Print CFW error on screen.
Browse files Browse the repository at this point in the history
Signed-off-by: Thomas Rohloff <v10lator@myway.de>
  • Loading branch information
V10lator committed Dec 15, 2023
1 parent 5296bf2 commit 53b7482
Show file tree
Hide file tree
Showing 3 changed files with 78 additions and 66 deletions.
2 changes: 1 addition & 1 deletion include/cfw.h
Expand Up @@ -23,5 +23,5 @@

#include <stdbool.h>

bool cfwValid();
const char *cfwValid();
void deinitCfw();
123 changes: 67 additions & 56 deletions src/cfw.c
Expand Up @@ -18,7 +18,9 @@

#include <wut-fixups.h>

#include <stdarg.h>
#include <stdbool.h>
#include <stdio.h>

#include <coreinit/title.h>
#include <mocha/mocha.h>
Expand All @@ -44,70 +46,79 @@ static const uint32_t addys[6] = {
};
static uint32_t origValues[6];

bool cfwValid()
static char cfwError[1024] = { '\0' }; // TODO

static void printCfwError(const char *str, ...)
{
va_list va;
va_start(va, str);
vsnprintf(cfwError, 1024 - 1, str, va);
va_end(va);
}

const char *cfwValid()
{
MochaUtilsStatus s = Mocha_InitLibrary();
mochaReady = s == MOCHA_RESULT_SUCCESS;
bool ret = mochaReady;
if(ret)
if(!mochaReady)
{
printCfwError("Can't init libmocha: 0x%8X", s);
return cfwError;
}

WiiUConsoleOTP otp;
s = Mocha_ReadOTP(&otp);
if(s != MOCHA_RESULT_SUCCESS)
{
printCfwError("Can't acces OTP: %s", Mocha_GetStatusStr(s));
return cfwError;
}

MochaRPXLoadInfo info = {
.target = 0xDEADBEEF,
.filesize = 0,
.fileoffset = 0,
.path = "dummy"
};

s = Mocha_LaunchRPX(&info);
if(s == MOCHA_RESULT_UNSUPPORTED_API_VERSION || s == MOCHA_RESULT_UNSUPPORTED_COMMAND)
{
WiiUConsoleOTP otp;
s = Mocha_ReadOTP(&otp);
ret = s == MOCHA_RESULT_SUCCESS;
if(ret)
printCfwError("Can't dummy load RPX: %s", Mocha_GetStatusStr(s));
return cfwError;
}

if(isAroma())
{
char path[FS_MAX_PATH];
RPXLoaderStatus rs = RPXLoader_GetPathOfRunningExecutable(path, FS_MAX_PATH);
if(!rs != RPX_LOADER_RESULT_SUCCESS)
{
MochaRPXLoadInfo info = {
.target = 0xDEADBEEF,
.filesize = 0,
.fileoffset = 0,
.path = "dummy"
};

s = Mocha_LaunchRPX(&info);
ret = s != MOCHA_RESULT_UNSUPPORTED_API_VERSION && s != MOCHA_RESULT_UNSUPPORTED_COMMAND;
if(ret)
{
if(isAroma())
{
char path[FS_MAX_PATH];
RPXLoaderStatus rs = RPXLoader_GetPathOfRunningExecutable(path, FS_MAX_PATH);
ret = rs == RPX_LOADER_RESULT_SUCCESS;
if(!ret)
debugPrintf("RPXLoader error: %s", RPXLoader_GetStatusStr(rs));
}

if(ret)
{
for(int i = 0; i < 6; ++i)
{
s = Mocha_IOSUKernelRead32(addys[i], origValues + i);
if(s != MOCHA_RESULT_SUCCESS)
goto restoreIOSU;

s = Mocha_IOSUKernelWrite32(addys[i], i % 2 == 0 ? VALUE_A : VALUE_B);
if(s != MOCHA_RESULT_SUCCESS)
goto restoreIOSU;

continue;
restoreIOSU:
for(--i; i >= 0; --i)
Mocha_IOSUKernelWrite32(addys[i], origValues[i]);

debugPrintf("libmocha error: %s", Mocha_GetStatusStr(s));
return false;
}
}
}
else
debugPrintf("Can't dummy load RPX: %s", Mocha_GetStatusStr(s));
printCfwError("RPXLoader error: %s", RPXLoader_GetStatusStr(rs));
return cfwError;
}
else
debugPrintf("Can't acces OTP: %s", Mocha_GetStatusStr(s));
}
else
debugPrintf("Can't init libmocha: 0x%8X", s);

return ret;
for(int i = 0; i < 6; ++i)
{
s = Mocha_IOSUKernelRead32(addys[i], origValues + i);
if(s != MOCHA_RESULT_SUCCESS)
goto restoreIOSU;

s = Mocha_IOSUKernelWrite32(addys[i], i % 2 == 0 ? VALUE_A : VALUE_B);
if(s != MOCHA_RESULT_SUCCESS)
goto restoreIOSU;

continue;
restoreIOSU:
for(--i; i >= 0; --i)
Mocha_IOSUKernelWrite32(addys[i], origValues[i]);

printCfwError("libmocha error: %s", Mocha_GetStatusStr(s));
return cfwError;
}

return NULL;
}

void deinitCfw()
Expand Down
19 changes: 10 additions & 9 deletions src/main.c
Expand Up @@ -77,15 +77,15 @@ static void drawLoadingScreen(const char *toScreenLog, const char *loadingMsg)
drawFrame();
}

static void innerMain(bool validCfw)
static void innerMain(const char *cfwError)
{
OSThread *mainThread = OSGetCurrentThread();
OSSetThreadName(mainThread, "NUSspli");
#ifdef NUSSPLI_DEBUG
OSSetThreadStackUsage(mainThread);
#endif

if(validCfw)
if(!cfwError)
{
addEntropy(&(mainThread->id), sizeof(uint16_t));
addEntropy(mainThread->stackStart, 4);
Expand All @@ -98,13 +98,13 @@ static void innerMain(bool validCfw)

if(initStaticMem())
{
if(initFS(validCfw))
if(initFS(!cfwError))
{
if(initRenderer())
{
readInput(); // bug #95
char *lerr = NULL;
if(validCfw)
if(!cfwError)
{
if(OSSetThreadPriority(mainThread, THREAD_PRIORITY_HIGH))
addToScreenLog("Changed main thread priority!");
Expand Down Expand Up @@ -201,7 +201,7 @@ static void innerMain(bool validCfw)
lerr = "Couldn't initialize Crypto!";
}
else
lerr = "Unsupported environment.\nEither you're not using Tiramisu/Aroma or your Tiramisu version is out of date.";
lerr = "Unsupported environment.\nEither you're not using Tiramisu/Aroma or your Tiramisu version is out of date."; //TODO: Add cfwError to this.

if(lerr != NULL)
{
Expand All @@ -219,7 +219,7 @@ static void innerMain(bool validCfw)
debugPrintf("SDL closed");
}

deinitFS(validCfw);
deinitFS(!cfwError);
debugPrintf("Filesystem closed");
}
else
Expand All @@ -243,7 +243,8 @@ int main()
bool jailbreaking;
uint64_t tid = OSGetTitleID();
#endif
if(cfwValid())
const char *cfwError = cfwValid();
if(!cfwError)
{
#ifdef NUSSPLI_HBL
jailbreaking = !isAroma() && (tid & 0xFFFFFFFFFFFFF0FF) == 0x000500101004A000; // Mii Maker
Expand All @@ -252,11 +253,11 @@ int main()

if(!jailbreaking)
#endif
innerMain(true);
innerMain(NULL);
}
else
{
innerMain(false);
innerMain(cfwError);
#ifdef NUSSPLI_HBL
jailbreaking = false;
#endif
Expand Down

0 comments on commit 53b7482

Please sign in to comment.