mirror of
https://github.com/rvtr/unlaunch-installer_dev.git
synced 2026-01-26 13:43:08 -05:00
Add launcher tid patches
This commit is contained in:
parent
cca04004fc
commit
74ed03e40e
@ -12,7 +12,9 @@ static bool unlaunchFound = false;
|
|||||||
static bool hnaaUnlaunchFound = false;
|
static bool hnaaUnlaunchFound = false;
|
||||||
static bool retailLauncherTmdPresentAndToBePatched = true;
|
static bool retailLauncherTmdPresentAndToBePatched = true;
|
||||||
static bool retailConsole = true;
|
static bool retailConsole = true;
|
||||||
static bool unlaunchInstallerFound = false;
|
static UNLAUNCH_VERSION foundUnlaunchInstallerVersion = false;
|
||||||
|
static bool disableAllPatches = false;
|
||||||
|
static bool enableSoundAndSplash = false;
|
||||||
bool charging = false;
|
bool charging = false;
|
||||||
u8 batteryLevel = 0;
|
u8 batteryLevel = 0;
|
||||||
|
|
||||||
@ -21,6 +23,8 @@ PrintConsole bottomScreen;
|
|||||||
|
|
||||||
enum {
|
enum {
|
||||||
MAIN_MENU_SAFE_UNLAUNCH_UNINSTALL,
|
MAIN_MENU_SAFE_UNLAUNCH_UNINSTALL,
|
||||||
|
MAIN_MENU_TID_PATCHES,
|
||||||
|
MAIN_MENU_SOUND_SPLASH_PATCHES,
|
||||||
MAIN_MENU_SAFE_UNLAUNCH_INSTALL,
|
MAIN_MENU_SAFE_UNLAUNCH_INSTALL,
|
||||||
MAIN_MENU_EXIT
|
MAIN_MENU_EXIT
|
||||||
};
|
};
|
||||||
@ -65,10 +69,18 @@ static int mainMenu(int cursor)
|
|||||||
Menu* m = newMenu();
|
Menu* m = newMenu();
|
||||||
setMenuHeader(m, "MAIN MENU");
|
setMenuHeader(m, "MAIN MENU");
|
||||||
|
|
||||||
char uninstallStr[32], installStr[32];
|
char uninstallStr[32], installStr[32], soundPatchesStr[64], tidPatchesStr[32];
|
||||||
sprintf(uninstallStr, "\x1B[%02omUninstall unlaunch", unlaunchFound ? 047 : 037);
|
sprintf(uninstallStr, "\x1B[%02omUninstall unlaunch", unlaunchFound ? 047 : 037);
|
||||||
sprintf(installStr, "\x1B[%02omInstall unlaunch", unlaunchInstallerFound && !unlaunchFound ? 047 : 037);
|
sprintf(tidPatchesStr, "\x1B[%02omDisable all patches: %s",
|
||||||
|
(foundUnlaunchInstallerVersion == v1_9 && foundUnlaunchInstallerVersion == v2_0) ? 047 : 037,
|
||||||
|
disableAllPatches ? "On" : "Off");
|
||||||
|
sprintf(soundPatchesStr, "\x1B[%02omEnable sound and splash: %s",
|
||||||
|
(foundUnlaunchInstallerVersion == v2_0 && !disableAllPatches) ? 047 : 037,
|
||||||
|
enableSoundAndSplash ? "On" : "Off");
|
||||||
|
sprintf(installStr, "\x1B[%02omInstall unlaunch", (foundUnlaunchInstallerVersion != INVALID && !unlaunchFound) ? 047 : 037);
|
||||||
addMenuItem(m, uninstallStr, NULL, 0);
|
addMenuItem(m, uninstallStr, NULL, 0);
|
||||||
|
addMenuItem(m, tidPatchesStr, NULL, 0);
|
||||||
|
addMenuItem(m, soundPatchesStr, NULL, 0);
|
||||||
addMenuItem(m, installStr, NULL, 0);
|
addMenuItem(m, installStr, NULL, 0);
|
||||||
addMenuItem(m, "\x1B[47mExit", NULL, 0);
|
addMenuItem(m, "\x1B[47mExit", NULL, 0);
|
||||||
|
|
||||||
@ -139,8 +151,8 @@ int main(int argc, char **argv)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
unlaunchInstallerFound = loadUnlaunchInstaller("sd:/unlaunch.dsi");
|
foundUnlaunchInstallerVersion = loadUnlaunchInstaller("sd:/unlaunch.dsi");
|
||||||
if (!unlaunchInstallerFound)
|
if (foundUnlaunchInstallerVersion != INVALID)
|
||||||
{
|
{
|
||||||
messageBox("\x1B[41mWARNING:\x1B[47m unlaunch.dsi was not found in\n"
|
messageBox("\x1B[41mWARNING:\x1B[47m unlaunch.dsi was not found in\n"
|
||||||
"the root of the sd card.\n"
|
"the root of the sd card.\n"
|
||||||
@ -215,13 +227,26 @@ int main(int argc, char **argv)
|
|||||||
nandio_lock_writing();
|
nandio_lock_writing();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case MAIN_MENU_TID_PATCHES:
|
||||||
|
if(foundUnlaunchInstallerVersion == v1_9 && foundUnlaunchInstallerVersion == v2_0) {
|
||||||
|
disableAllPatches = !disableAllPatches;
|
||||||
|
enableSoundAndSplash = true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case MAIN_MENU_SOUND_SPLASH_PATCHES:
|
||||||
|
if(foundUnlaunchInstallerVersion == v2_0 && !disableAllPatches) {
|
||||||
|
enableSoundAndSplash = !enableSoundAndSplash;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
case MAIN_MENU_SAFE_UNLAUNCH_INSTALL:
|
case MAIN_MENU_SAFE_UNLAUNCH_INSTALL:
|
||||||
if (unlaunchInstallerFound && (choiceBox("Install unlaunch?") == YES)
|
if (foundUnlaunchInstallerVersion != INVALID && (choiceBox("Install unlaunch?") == YES)
|
||||||
&& (retailLauncherTmdPresentAndToBePatched || (choiceBox("There doesn't seem to be a launcher.tmd\nfile matcing the hwinfo file\nKeep installing?") == YES))
|
&& (retailLauncherTmdPresentAndToBePatched || (choiceBox("There doesn't seem to be a launcher.tmd\nfile matcing the hwinfo file\nKeep installing?") == YES))
|
||||||
&& nandio_unlock_writing())
|
&& nandio_unlock_writing())
|
||||||
{
|
{
|
||||||
if(installUnlaunch(retailConsole, retailLauncherTmdPresentAndToBePatched ? retailLauncherTmdPath : NULL))
|
if(installUnlaunch(retailConsole, retailLauncherTmdPresentAndToBePatched ? retailLauncherTmdPath : NULL, disableAllPatches, enableSoundAndSplash))
|
||||||
{
|
{
|
||||||
messageBox("Install successful!\n");
|
messageBox("Install successful!\n");
|
||||||
unlaunchFound = true;
|
unlaunchFound = true;
|
||||||
|
|||||||
@ -13,13 +13,6 @@ static char unlaunchInstallerBuffer[0x30000];
|
|||||||
static const char* hnaaTmdPath = "nand:/title/00030017/484e4141/content/title.tmd";
|
static const char* hnaaTmdPath = "nand:/title/00030017/484e4141/content/title.tmd";
|
||||||
static const char* hnaaBackupTmdPath = "nand:/title/00030017/484e4141/content/title.tmd.bak";
|
static const char* hnaaBackupTmdPath = "nand:/title/00030017/484e4141/content/title.tmd.bak";
|
||||||
|
|
||||||
enum UNLAUNCH_VERSION {
|
|
||||||
v1_8,
|
|
||||||
v1_9,
|
|
||||||
v2_0,
|
|
||||||
INVALID,
|
|
||||||
};
|
|
||||||
|
|
||||||
UNLAUNCH_VERSION installerVersion{INVALID};
|
UNLAUNCH_VERSION installerVersion{INVALID};
|
||||||
size_t unlaunchInstallerSize{};
|
size_t unlaunchInstallerSize{};
|
||||||
|
|
||||||
@ -39,11 +32,16 @@ constexpr std::array knownUnlaunchHashes{
|
|||||||
"15f4a36251d1408d71114019b2825fe8f5b4c8cc"_sha1, // v2.0
|
"15f4a36251d1408d71114019b2825fe8f5b4c8cc"_sha1, // v2.0
|
||||||
};
|
};
|
||||||
|
|
||||||
|
constexpr std::array blockAllPatchesOffset{
|
||||||
|
0xae74, /* 1.9 */
|
||||||
|
0xae91, /* 2.0 */
|
||||||
|
};
|
||||||
|
|
||||||
static bool writeUnlaunchToHNAAFolder();
|
static bool writeUnlaunchToHNAAFolder();
|
||||||
|
|
||||||
bool isValidUnlaunchInstallerSize(size_t size)
|
bool isValidUnlaunchInstallerSize(size_t size)
|
||||||
{
|
{
|
||||||
return size == 163320 /*1.8*/ || size == 196088 /*1.9*/;
|
return size == 163320 /*1.8*/ || size == 196088 /*1.9, 2.0*/;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool isLauncherTmdPatched(const char* path)
|
bool isLauncherTmdPatched(const char* path)
|
||||||
@ -351,7 +349,7 @@ static bool installUnlaunchProtoConsole(void)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool readUnlaunchInstaller(const char* path)
|
static bool readUnlaunchInstaller(const char* path)
|
||||||
{
|
{
|
||||||
FILE* unlaunchInstaller = fopen(path, "rb");
|
FILE* unlaunchInstaller = fopen(path, "rb");
|
||||||
if (!unlaunchInstaller)
|
if (!unlaunchInstaller)
|
||||||
@ -361,7 +359,7 @@ bool readUnlaunchInstaller(const char* path)
|
|||||||
}
|
}
|
||||||
|
|
||||||
unlaunchInstallerSize = getFileSize(unlaunchInstaller);
|
unlaunchInstallerSize = getFileSize(unlaunchInstaller);
|
||||||
if(isValidUnlaunchInstallerSize(unlaunchInstallerSize))
|
if(!isValidUnlaunchInstallerSize(unlaunchInstallerSize))
|
||||||
{
|
{
|
||||||
messageBox("\x1B[31mError:\x1B[33m Unlaunch installer wrong file size\n");
|
messageBox("\x1B[31mError:\x1B[33m Unlaunch installer wrong file size\n");
|
||||||
return false;
|
return false;
|
||||||
@ -389,7 +387,7 @@ bool readUnlaunchInstaller(const char* path)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool verifyUnlaunchInstaller(void)
|
static bool verifyUnlaunchInstaller(void)
|
||||||
{
|
{
|
||||||
Sha1Digest digest;
|
Sha1Digest digest;
|
||||||
swiSHA1Calc(digest.data(), unlaunchInstallerBuffer + 520, unlaunchInstallerSize);
|
swiSHA1Calc(digest.data(), unlaunchInstallerBuffer + 520, unlaunchInstallerSize);
|
||||||
@ -404,20 +402,39 @@ bool verifyUnlaunchInstaller(void)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool patchUnlaunchInstaller(void)
|
static bool patchUnlaunchInstaller(bool disableAllPatches, bool enableSoundAndSplash)
|
||||||
{
|
{
|
||||||
//TODO: Apply patches
|
if(disableAllPatches)
|
||||||
|
{
|
||||||
|
if(installerVersion == v1_8)
|
||||||
|
{
|
||||||
|
messageBox("\x1B[31mError:\x1B[33m Unlaunch 1.8 can't be patched\n");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
// change launcher TID from ANH to SAN so that unlaunch doesn't realize it's booting the launcher
|
||||||
|
auto patchOffset = blockAllPatchesOffset[installerVersion - 1];
|
||||||
|
const char newID[]{'S','A','N'};
|
||||||
|
memcpy((unlaunchInstallerBuffer + 520) + patchOffset, newID, 3);
|
||||||
|
}
|
||||||
|
else if (enableSoundAndSplash)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool loadUnlaunchInstaller(const char* path)
|
UNLAUNCH_VERSION loadUnlaunchInstaller(const char* path)
|
||||||
{
|
{
|
||||||
return readUnlaunchInstaller(path) && verifyUnlaunchInstaller();
|
if(readUnlaunchInstaller(path) && verifyUnlaunchInstaller())
|
||||||
|
{
|
||||||
|
return installerVersion;
|
||||||
|
}
|
||||||
|
return INVALID;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool installUnlaunch(bool retailConsole, const char* retailLauncherTmdPath)
|
bool installUnlaunch(bool retailConsole, const char* retailLauncherTmdPath, bool disableAllPatches, bool enableSoundAndSplash)
|
||||||
{
|
{
|
||||||
if (installerVersion == INVALID || !patchUnlaunchInstaller())
|
if (installerVersion == INVALID || !patchUnlaunchInstaller(disableAllPatches, enableSoundAndSplash))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// Treat protos differently
|
// Treat protos differently
|
||||||
|
|||||||
@ -6,12 +6,19 @@
|
|||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
typedef enum UNLAUNCH_VERSION {
|
||||||
|
v1_8,
|
||||||
|
v1_9,
|
||||||
|
v2_0,
|
||||||
|
INVALID,
|
||||||
|
} UNLAUNCH_VERSION;
|
||||||
|
|
||||||
bool uninstallUnlaunch(bool notProto, bool hasHNAABackup, const char* retailLauncherTmdPath);
|
bool uninstallUnlaunch(bool notProto, bool hasHNAABackup, const char* retailLauncherTmdPath);
|
||||||
bool installUnlaunch(bool retailConsole, const char* retailLauncherTmdPath);
|
bool installUnlaunch(bool retailConsole, const char* retailLauncherTmdPath, bool disableAllPatches, bool enableSoundAndSplash);
|
||||||
|
|
||||||
bool isLauncherTmdPatched(const char* path);
|
bool isLauncherTmdPatched(const char* path);
|
||||||
|
|
||||||
bool loadUnlaunchInstaller(const char* path);
|
UNLAUNCH_VERSION loadUnlaunchInstaller(const char* path);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user