Fix Internet Browser crashing and merge code handler into ELF
This commit is contained in:
parent
8a0413ab85
commit
aa526c88ef
BIN
codehandler.bin
BIN
codehandler.bin
Binary file not shown.
2915
src/code_handler.h
Normal file
2915
src/code_handler.h
Normal file
File diff suppressed because it is too large
Load Diff
11
src/entry.c
11
src/entry.c
@ -10,18 +10,21 @@
|
||||
#define TITLE_ID_MII_VERSE 0x000500301001600A
|
||||
#define TITLE_ID_MII_MAKER 0x000500101004A000
|
||||
#define TITLE_ID_BAYONETTA_2 0x0005000010172500
|
||||
#define TITLE_ID_INTERNET_BROWSER 0x000500301001200A
|
||||
|
||||
bool isRunningTitleID(unsigned long long int japaneseTitleID) {
|
||||
return OSGetTitleID() == japaneseTitleID // JAP
|
||||
|| OSGetTitleID() == japaneseTitleID + 0x100 // USA
|
||||
|| OSGetTitleID() == japaneseTitleID + 0x200; // EUR
|
||||
unsigned long long int currentTitleID = (unsigned long long int) OSGetTitleID();
|
||||
return currentTitleID == japaneseTitleID // JAP
|
||||
|| currentTitleID == japaneseTitleID + 0x100 // USA
|
||||
|| currentTitleID == japaneseTitleID + 0x200; // EUR
|
||||
}
|
||||
|
||||
int __entry_menu(int argc, char **argv) {
|
||||
if (OSGetTitleID != 0
|
||||
&& !isRunningTitleID(TITLE_ID_MII_VERSE)
|
||||
&& !isRunningTitleID(TITLE_ID_MII_MAKER)
|
||||
&& !isRunningTitleID(TITLE_ID_BAYONETTA_2)) {
|
||||
&& !isRunningTitleID(TITLE_ID_BAYONETTA_2)
|
||||
&& !isRunningTitleID(TITLE_ID_INTERNET_BROWSER)) {
|
||||
InitOSFunctionPointers();
|
||||
InitSocketFunctionPointers();
|
||||
InitGX2FunctionPointers();
|
||||
|
81
src/main.c
81
src/main.c
@ -11,26 +11,21 @@
|
||||
#include "dynamic_libs/vpad_functions.h"
|
||||
#include "dynamic_libs/socket_functions.h"
|
||||
#include "patcher/function_hooks.h"
|
||||
#include "fs/fs_utils.h"
|
||||
#include "fs/sd_fat_devoptab.h"
|
||||
#include "kernel/kernel_functions.h"
|
||||
#include "system/memory.h"
|
||||
#include "utils/utils.h"
|
||||
#include "common/common.h"
|
||||
#include "main.h"
|
||||
#include "code_handler.h"
|
||||
|
||||
int codeHandlerInstalled;
|
||||
bool isCodeHandlerInstalled;
|
||||
|
||||
void startMiiMaker() {
|
||||
char buf_vol_odd[20];
|
||||
snprintf(buf_vol_odd, sizeof(buf_vol_odd), "%s", "/vol/storage_odd03");
|
||||
_SYSLaunchTitleByPathFromLauncher(buf_vol_odd, 18, 0);
|
||||
}
|
||||
// TODO Make sure accessing the browser does not freeze the console
|
||||
|
||||
#define PRINT_TEXT2(x, y, ...) { snprintf(messageBuffer, 80, __VA_ARGS__); OSScreenPutFontEx(0, x, y, messageBuffer); OSScreenPutFontEx(1, x, y, messageBuffer); }
|
||||
|
||||
#define MAXIMUM_CODE_HANDLER_SIZE 15000
|
||||
char *codeHandlerBuffer[MAXIMUM_CODE_HANDLER_SIZE];
|
||||
typedef enum {
|
||||
EXIT = 0x0, TCP_GECKO = 0x1
|
||||
} LaunchMethod;
|
||||
|
||||
/* Entry point */
|
||||
int Menu_Main(void) {
|
||||
@ -100,7 +95,7 @@ int Menu_Main(void) {
|
||||
OSScreenEnableEx(1, 1);
|
||||
|
||||
char messageBuffer[80];
|
||||
int launchMethod = 0;
|
||||
int launchMethod;
|
||||
int update_screen = 1;
|
||||
int vpadError = -1;
|
||||
VPADData vpad_data;
|
||||
@ -122,7 +117,6 @@ int Menu_Main(void) {
|
||||
PRINT_TEXT2(14, 1, "-- TCP Gecko Installer --")
|
||||
PRINT_TEXT2(7, 2, ipAddressMessageBuffer)
|
||||
PRINT_TEXT2(0, 5, "Press A to install TCP Gecko...")
|
||||
PRINT_TEXT2(0, 6, "Press X to install TCP Gecko with CosmoCortney's codehandler...")
|
||||
PRINT_TEXT2(0, 17, "Press Home to exit...")
|
||||
|
||||
OSScreenFlipBuffersEx(0);
|
||||
@ -133,70 +127,25 @@ int Menu_Main(void) {
|
||||
|
||||
// Home Button
|
||||
if (pressedButtons & VPAD_BUTTON_HOME) {
|
||||
launchMethod = 0;
|
||||
launchMethod = EXIT;
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
// A Button
|
||||
if (pressedButtons & VPAD_BUTTON_A) {
|
||||
launchMethod = 2;
|
||||
break;
|
||||
}
|
||||
|
||||
// X Button
|
||||
if (pressedButtons & VPAD_BUTTON_X) {
|
||||
mount_sd_fat("sd");
|
||||
|
||||
unsigned char *temporaryCodeHandlerBuffer = 0;
|
||||
unsigned int codeHandlerSize = 0;
|
||||
const char *filePath = "sd:/wiiu/apps/TCPGecko/codehandler.bin";
|
||||
int codeHandlerLoaded = LoadFileToMem(filePath, &temporaryCodeHandlerBuffer, &codeHandlerSize);
|
||||
if (codeHandlerLoaded == -1) {
|
||||
OSScreenClearBufferEx(0, 0);
|
||||
OSScreenClearBufferEx(1, 0);
|
||||
char codeHandlerNotFoundMessageBuffer[100];
|
||||
snprintf(codeHandlerNotFoundMessageBuffer, sizeof(codeHandlerNotFoundMessageBuffer), "%s not found",
|
||||
filePath);
|
||||
PRINT_TEXT2(0, 0, codeHandlerNotFoundMessageBuffer)
|
||||
OSScreenFlipBuffersEx(0);
|
||||
OSScreenFlipBuffersEx(1);
|
||||
launchMethod = 0;
|
||||
sleep(4);
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
if (codeHandlerSize > MAXIMUM_CODE_HANDLER_SIZE) {
|
||||
OSScreenClearBufferEx(0, 0);
|
||||
OSScreenClearBufferEx(1, 0);
|
||||
PRINT_TEXT2(14, 5, "Codehandler too big");
|
||||
OSScreenFlipBuffersEx(0);
|
||||
OSScreenFlipBuffersEx(1);
|
||||
launchMethod = 0;
|
||||
sleep(2);
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
memcpy(codeHandlerBuffer, temporaryCodeHandlerBuffer, codeHandlerSize);
|
||||
free(temporaryCodeHandlerBuffer);
|
||||
|
||||
unsigned int physicalCodeHandlerAddress = (unsigned int) OSEffectiveToPhysical(
|
||||
(void *) CODE_HANDLER_INSTALL_ADDRESS);
|
||||
DCFlushRange(&codeHandlerBuffer, codeHandlerSize);
|
||||
SC0x25_KernelCopyData((u32) physicalCodeHandlerAddress, (int) codeHandlerBuffer, codeHandlerSize);
|
||||
m_DCInvalidateRange((u32) physicalCodeHandlerAddress, codeHandlerSize);
|
||||
SC0x25_KernelCopyData((u32) physicalCodeHandlerAddress, (int) codeHandler, codeHandlerLength);
|
||||
DCFlushRange((const void *) CODE_HANDLER_INSTALL_ADDRESS, (u32) codeHandlerLength);
|
||||
|
||||
unmount_sd_fat("sd");
|
||||
codeHandlerInstalled = 1;
|
||||
|
||||
launchMethod = 2;
|
||||
isCodeHandlerInstalled = true;
|
||||
launchMethod = TCP_GECKO;
|
||||
break;
|
||||
}
|
||||
|
||||
// Button pressed ?
|
||||
update_screen = (pressedButtons & (VPAD_BUTTON_LEFT | VPAD_BUTTON_RIGHT | VPAD_BUTTON_UP | VPAD_BUTTON_DOWN))
|
||||
? 1 : 0;
|
||||
update_screen = (pressedButtons & (VPAD_BUTTON_LEFT | VPAD_BUTTON_RIGHT | VPAD_BUTTON_UP | VPAD_BUTTON_DOWN)) ? 1 : 0;
|
||||
usleep(20 * 1000);
|
||||
}
|
||||
|
||||
@ -208,7 +157,7 @@ int Menu_Main(void) {
|
||||
|
||||
memoryRelease();
|
||||
|
||||
if (launchMethod == 0) {
|
||||
if (launchMethod == EXIT) {
|
||||
RestoreInstructions();
|
||||
return EXIT_SUCCESS;
|
||||
} else {
|
||||
|
@ -14,7 +14,7 @@ extern "C" {
|
||||
//! C wrapper for our C++ functions
|
||||
int Menu_Main(void);
|
||||
|
||||
extern int codeHandlerInstalled;
|
||||
extern bool isCodeHandlerInstalled;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
@ -15,7 +15,6 @@
|
||||
#include "system/exception_handler.h"
|
||||
#include "utils/logger.h"
|
||||
#include "system/memory.h"
|
||||
#include "entry.h"
|
||||
|
||||
void *client;
|
||||
void *commandBlock;
|
||||
@ -62,6 +61,7 @@ struct pygecko_bss_t {
|
||||
#define COMMAND_OS_VERSION 0x9A
|
||||
#define COMMAND_RUN_KERNEL_COPY_SERVICE 0xCD
|
||||
#define COMMAND_IOSUHAX_READ_FILE 0xD0
|
||||
#define COMMAND_GET_VERSION_HASH 0xE0
|
||||
|
||||
#define CHECK_ERROR(cond) if (cond) { bss->line = __LINE__; goto error; }
|
||||
#define errno (*__gh_errno_ptr())
|
||||
@ -73,6 +73,8 @@ struct pygecko_bss_t {
|
||||
#define ONLY_ZEROS_READ 0xB0
|
||||
#define NON_ZEROS_READ 0xBD
|
||||
|
||||
#define VERSION_HASH 0x3516D3B9
|
||||
|
||||
#define ASSERT_MINIMUM_HOLDS(actual, minimum, variableName) \
|
||||
if(actual < minimum) { \
|
||||
char buffer[100] = {0}; \
|
||||
@ -1118,10 +1120,16 @@ static int processCommands(struct pygecko_bss_t *bss, int clientfd) {
|
||||
|
||||
break;
|
||||
}
|
||||
case COMMAND_GET_VERSION_HASH: {
|
||||
((int *) buffer)[0] = VERSION_HASH;
|
||||
ret = sendwait(bss, clientfd, buffer, 4);
|
||||
|
||||
break;
|
||||
}
|
||||
case COMMAND_GET_CODE_HANDLER_ADDRESS: {
|
||||
((int *) buffer)[0] = CODE_HANDLER_INSTALL_ADDRESS;
|
||||
ret = sendwait(bss, clientfd, buffer, 4);
|
||||
CHECK_ERROR(ret < 0)
|
||||
ASSERT_FUNCTION_SUCCEEDED(ret, "sendwait (code handler address)")
|
||||
|
||||
break;
|
||||
}
|
||||
@ -1530,7 +1538,7 @@ static int startTCPGeckoThread(int argc, void *argv) {
|
||||
log_print("TCP Gecko thread started...\n");
|
||||
|
||||
// Execute the code handler if it is installed
|
||||
if (codeHandlerInstalled) {
|
||||
if (isCodeHandlerInstalled) {
|
||||
log_print("Code handler installed...\n");
|
||||
void (*codeHandlerFunction)() = (void (*)()) CODE_HANDLER_INSTALL_ADDRESS;
|
||||
|
||||
|
BIN
tcpgecko.elf
BIN
tcpgecko.elf
Binary file not shown.
Loading…
Reference in New Issue
Block a user