From c521bcd633fb8c5b30476e6970132f29dbeca903 Mon Sep 17 00:00:00 2001 From: BullyWiiPlaza Date: Thu, 30 Mar 2017 21:37:55 +0200 Subject: [PATCH] Clean up --- src/fs/fs_utils.c | 2 +- src/main.c | 89 +++++++++++++++++++++++----------------------- src/main.h | 1 - src/pygecko.c | 36 ++++++++----------- tcpgecko.elf | Bin 138596 -> 138900 bytes 5 files changed, 60 insertions(+), 68 deletions(-) diff --git a/src/fs/fs_utils.c b/src/fs/fs_utils.c index efa2e55..1f4d57b 100644 --- a/src/fs/fs_utils.c +++ b/src/fs/fs_utils.c @@ -50,7 +50,7 @@ int UmountFS(void *pClient, void *pCmd, const char *mountPath) int LoadFileToMem(const char *filepath, u8 **inbuffer, u32 *size) { - //! always initialze input + // Always initialize input *inbuffer = NULL; if(size) *size = 0; diff --git a/src/main.c b/src/main.c index 5519826..eb2acd3 100644 --- a/src/main.c +++ b/src/main.c @@ -3,7 +3,6 @@ #include #include #include - #include #include #include "dynamic_libs/os_functions.h" @@ -19,8 +18,7 @@ #include "utils/logger.h" #include "utils/utils.h" #include "common/common.h" - -#define FS_BUFFER_SIZE 40000 +#include "main.h" int CCHandler; @@ -30,9 +28,10 @@ void startMiiMaker() { _SYSLaunchTitleByPathFromLauncher(buf_vol_odd, 18, 0); } -char *buffer[FS_BUFFER_SIZE]; +#define PRINT_TEXT2(x, y, ...) { snprintf(messageBuffer, 80, __VA_ARGS__); OSScreenPutFontEx(0, x, y, messageBuffer); OSScreenPutFontEx(1, x, y, messageBuffer); } -#define PRINT_TEXT2(x, y, ...) { snprintf(msg, 80, __VA_ARGS__); OSScreenPutFontEx(0, x, y, msg); OSScreenPutFontEx(1, x, y, msg); } +#define MAXIMUM_CODE_HANDLER_SIZE 15000 +char *codeHandlerBuffer[MAXIMUM_CODE_HANDLER_SIZE]; /* Entry point */ int Menu_Main(void) { @@ -94,45 +93,36 @@ int Menu_Main(void) { VPADInit(); - // Prepare screen - int screen_buf0_size = 0; - int screen_buf1_size = 0; - // Init screen and screen buffers OSScreenInit(); - screen_buf0_size = OSScreenGetBufferSizeEx(0); - screen_buf1_size = OSScreenGetBufferSizeEx(1); + int screenBuffer0Size = OSScreenGetBufferSizeEx(0); + int screenBuffer1Size = OSScreenGetBufferSizeEx(1); - unsigned char *screenBuffer = MEM1_alloc(screen_buf0_size + screen_buf1_size, 0x40); + unsigned char *screenBuffer = MEM1_alloc(screenBuffer0Size + screenBuffer1Size, 0x40); OSScreenSetBufferEx(0, screenBuffer); - OSScreenSetBufferEx(1, (screenBuffer + screen_buf0_size)); + OSScreenSetBufferEx(1, (screenBuffer + screenBuffer0Size)); OSScreenEnableEx(0, 1); OSScreenEnableEx(1, 1); - char msg[80]; + char messageBuffer[80]; int launchMethod = 0; int update_screen = 1; int vpadError = -1; VPADData vpad_data; - while (1) { - // Read vpad + while (true) { VPADRead(0, &vpad_data, 1, &vpadError); if (update_screen) { OSScreenClearBufferEx(0, 0); OSScreenClearBufferEx(1, 0); - // Print message - PRINT_TEXT2(14, 1, "-- TCPGecko Installer --"); - PRINT_TEXT2(0, 5, "Press A to install TCPGecko."); - PRINT_TEXT2(0, 6, "Press X to install TCPGecko with CosmoCortney's codehandler..."); - - - PRINT_TEXT2(0, 17, "Press home button to exit ..."); - + PRINT_TEXT2(14, 1, "-- TCP Gecko Installer --") + PRINT_TEXT2(0, 5, "Press A to install TCPGecko.") + PRINT_TEXT2(0, 6, "Press X to install TCPGecko with CosmoCortney's codehandler...") + PRINT_TEXT2(0, 17, "Press Home to exit ...") OSScreenFlipBuffersEx(0); OSScreenFlipBuffersEx(1); @@ -145,46 +135,55 @@ int Menu_Main(void) { launchMethod = 0; break; } + // A Button if (pressedButtons & VPAD_BUTTON_A) { launchMethod = 2; break; } + // X Button if (pressedButtons & VPAD_BUTTON_X) { mount_sd_fat("sd"); - unsigned char *Badbuffer = 0; - unsigned int filesize = 0; - int ret = LoadFileToMem("sd:/wiiu/apps/TCPGecko/codehandler.bin", &Badbuffer, &filesize); - if (ret == -1) { + 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); - PRINT_TEXT2(14, 5, "Codehandler.bin not found"); + 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; } - if (filesize > FS_BUFFER_SIZE) { - OSScreenClearBufferEx(0, 0); - OSScreenClearBufferEx(1, 0); - PRINT_TEXT2(14, 5, "Codehandler.bin is too big"); - OSScreenFlipBuffersEx(0); - OSScreenFlipBuffersEx(1); - launchMethod = 0; - sleep(2); - break; - } - memcpy(buffer, Badbuffer, filesize); - free(Badbuffer); - unsigned int phys_cafe_codehandler_loc = (unsigned int) OSEffectiveToPhysical((void *) CODE_HANDLER_INSTALL_ADDRESS); + memcpy(codeHandlerBuffer, temporaryCodeHandlerBuffer, codeHandlerSize); + free(temporaryCodeHandlerBuffer); - DCFlushRange(&buffer, filesize); - SC0x25_KernelCopyData((u32) phys_cafe_codehandler_loc, (int) buffer, filesize); - m_DCInvalidateRange((u32) phys_cafe_codehandler_loc, filesize); + 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); unmount_sd_fat("sd"); CCHandler = 1; diff --git a/src/main.h b/src/main.h index eb4e8da..1b444ac 100644 --- a/src/main.h +++ b/src/main.h @@ -12,7 +12,6 @@ extern "C" { //! C wrapper for our C++ functions int Menu_Main(void); -extern int pygecko; extern int CCHandler; #ifdef __cplusplus diff --git a/src/pygecko.c b/src/pygecko.c index 04db437..ed3081b 100644 --- a/src/pygecko.c +++ b/src/pygecko.c @@ -47,7 +47,7 @@ struct pygecko_bss_t { #define COMMAND_ACCOUNT_IDENTIFIER 0x57 #define COMMAND_WRITE_SCREEN 0x58 // TODO Exception DSI #define COMMAND_FOLLOW_POINTER 0x60 -#define COMMAND_RPC 0x70 +#define COMMAND_REMOTE_PROCEDURE_CALL 0x70 #define COMMAND_GET_SYMBOL 0x71 #define COMMAND_MEMORY_SEARCH 0x73 // #define COMMAND_SYSTEM_CALL 0x80 @@ -60,11 +60,9 @@ struct pygecko_bss_t { #define errno (*__gh_errno_ptr()) #define MSG_DONTWAIT 32 #define EWOULDBLOCK 6 -#define FS_BUFFER_SIZE 0x1000 #define DATA_BUFFER_SIZE 0x5000 -#define DISASSEMBLER_BUFFER_SIZE 0x1024 #define WRITE_SCREEN_MESSAGE_BUFFER_SIZE 100 -#define SERVER_VERSION "02/25/2017" +#define SERVER_VERSION "03/30/2017" #define ONLY_ZEROS_READ 0xB0 #define NON_ZEROS_READ 0xBD @@ -153,8 +151,7 @@ unsigned char *memcpy_buffer[DATA_BUFFER_SIZE]; void pygecko_memcpy(unsigned char *destinationBuffer, unsigned char *sourceBuffer, unsigned int length) { memcpy(memcpy_buffer, sourceBuffer, length); - SC0x25_KernelCopyData((unsigned int) OSEffectiveToPhysical(destinationBuffer), (unsigned int) &memcpy_buffer, - length); + SC0x25_KernelCopyData((unsigned int) OSEffectiveToPhysical(destinationBuffer), (unsigned int) &memcpy_buffer, length); DCFlushRange(destinationBuffer, (u32) length); } @@ -330,6 +327,7 @@ void considerInitializingFileSystem() { char *disassemblerBuffer; void *disassemblerBufferPointer; +#define DISASSEMBLER_BUFFER_SIZE 0x1024 void formatDisassembled(char *format, ...) { if (!disassemblerBuffer) { @@ -375,10 +373,6 @@ void reportIllegalCommandByte(int commandByte) { OSFatal(errorBuffer); } -void writeInt(unsigned int address, unsigned int value) { - pygecko_memcpy((unsigned char *) address, (unsigned char *) &value, 4); -} - #define MINIMUM_KERNEL_COMPARE_LENGTH 4 #define KERNEL_MEMORY_COMPARE_STEP_SIZE 1 @@ -919,7 +913,7 @@ static int rungecko(struct pygecko_bss_t *bss, int clientfd) { break; } case COMMAND_REPLACE_FILE: { - // TODO Write file + // TODO FSOpenFile ACCESS_ERROR // Receive the file path char file_path[FS_MAX_FULLPATH_SIZE] = {0}; @@ -962,12 +956,12 @@ static int rungecko(struct pygecko_bss_t *bss, int clientfd) { ret = recvwait(bss, clientfd, fileBuffer, dataLength); ASSERT_FUNCTION_SUCCEEDED(ret, "recvwait (File buffer)") - // Write the data and advance file handle position + // Write the data (and advance file handle position implicitly) ret = FSWriteFile(client, commandBlock, fileBuffer, 1, dataLength, handle, 0, FS_RET_ALL_ERROR); ASSERT_FUNCTION_SUCCEEDED(ret, "FSWriteFile") } else { - // Done + // Done with receiving the new file break; } } @@ -1133,7 +1127,7 @@ static int rungecko(struct pygecko_bss_t *bss, int clientfd) { CHECK_ERROR(ret < 0) break; } - case COMMAND_RPC: { + case COMMAND_REMOTE_PROCEDURE_CALL: { long long (*fun)(int, int, int, int, int, int, int, int); int r3, r4, r5, r6, r7, r8, r9, r10; long long result; @@ -1234,16 +1228,16 @@ static int rungecko(struct pygecko_bss_t *bss, int clientfd) { break; } - /*case COMMAND_SYSTEM_CALL: { - ret = recvwait(bss, clientfd, buffer, 4); - ASSERT_FUNCTION_SUCCEEDED(ret, "recvwait (system call)") + /*case COMMAND_SYSTEM_CALL: { + ret = recvwait(bss, clientfd, buffer, 4); + ASSERT_FUNCTION_SUCCEEDED(ret, "recvwait (system call)") - int value = ((int *) buffer)[0]; + int value = ((int *) buffer)[0]; - performSystemCall(value); + performSystemCall(value); - break; - }*/ + break; + }*/ case COMMAND_EXECUTE_ASSEMBLY: { // Receive the assembly receiveString(bss, clientfd, (char *) buffer, DATA_BUFFER_SIZE); diff --git a/tcpgecko.elf b/tcpgecko.elf index 56839a3d4af213653e4acf5854067a27f7a0e999..afc9ea3bbc30366a5438cbd7c66936b732a5013d 100644 GIT binary patch delta 20286 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 ITr{irU)>8U761SM