From caacafc25f800e3c9075ae2c2f5ea41f02bee5bc Mon Sep 17 00:00:00 2001 From: BullyWiiPlaza Date: Sun, 27 Aug 2017 13:56:29 +0200 Subject: [PATCH] Refactor non-working SD cheats --- src/main.cpp | 1 + src/sd_cheats.cpp | 82 ++++++++++++++++++++++++++++++++++++++++++++ src/sd_cheats.h | 6 ++++ src/system/kernel.h | 4 +-- src/tcp_gecko.cpp | 66 +++-------------------------------- tcpgecko.elf | Bin 247444 -> 247468 bytes 6 files changed, 95 insertions(+), 64 deletions(-) create mode 100644 src/sd_cheats.cpp create mode 100644 src/sd_cheats.h diff --git a/src/main.cpp b/src/main.cpp index 2cfe38d..4089dc9 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -20,6 +20,7 @@ #include "patcher/function_patcher_gx2.h" #include "patcher/function_patcher_coreinit.h" #include "utils/sd_ip_reader.hpp" +#include "sd_cheats.h" bool isCodeHandlerInstalled; diff --git a/src/sd_cheats.cpp b/src/sd_cheats.cpp new file mode 100644 index 0000000..869dfd9 --- /dev/null +++ b/src/sd_cheats.cpp @@ -0,0 +1,82 @@ +#include // snprintf +#include // memcpy, memset +#include "sd_cheats.h" +#include "utils/logger.h" +#include "fs/sd_fat_devoptab.h" +#include "fs/fs_utils.h" +#include "dynamic_libs/os_functions.h" +#include "tcp_gecko.h" +#include "kernel/syscalls.h" + +#define EXTENSION_SIZE 6 +#define SD_FILE_PATH_HEADER_LENGTH 10 +#define TITLE_ID_LEADING_ZEROS 3 +#define TITLE_ID_LENGTH 16 +#define CODES_FILE_PATH_SIZE (SD_FILE_PATH_HEADER_LENGTH + TITLE_ID_LENGTH + EXTENSION_SIZE) + +u64 cachedTitleID; + +unsigned char *kernelCopyBufferOld2[DATA_BUFFER_SIZE]; + +void kernelCopyData2(unsigned char *destinationBuffer, unsigned char *sourceBuffer, unsigned int length) { + if (length > DATA_BUFFER_SIZE) { + OSFatal("Kernel copy buffer size exceeded"); + } + + memcpy(kernelCopyBufferOld2, sourceBuffer, length); + SC0x25_KernelCopyData((unsigned int) OSEffectiveToPhysical(destinationBuffer), + (unsigned int) &kernelCopyBufferOld2, + length); + DCFlushRange(destinationBuffer, (u32) length); +} + +void considerApplyingSDCheats() { + u64 currentTitleID = OSGetTitleID(); + + if (cachedTitleID == currentTitleID) { + // log_print("Title ID NOT changed\n"); + } else { + log_print("Title ID changed\n"); + cachedTitleID = currentTitleID; + int result = mount_sd_fat("sd"); + + if (result < 0) { + log_printf("Mounting error: %i\n", result); + return; + } + + unsigned char filePath[CODES_FILE_PATH_SIZE]; + memset(filePath, '0', sizeof(filePath)); + memcpy(filePath, "sd:/codes/", SD_FILE_PATH_HEADER_LENGTH); // File path header + log_printf("Title ID: %lu\n", currentTitleID); + char asciiTitleID[TITLE_ID_LENGTH]; + snprintf(asciiTitleID, TITLE_ID_LENGTH, "%llX", currentTitleID); + memcpy(filePath + SD_FILE_PATH_HEADER_LENGTH + TITLE_ID_LEADING_ZEROS, asciiTitleID, + TITLE_ID_LENGTH); // Title ID + memcpy(filePath + SD_FILE_PATH_HEADER_LENGTH + TITLE_ID_LENGTH, ".gctu", EXTENSION_SIZE); // Extension + filePath[CODES_FILE_PATH_SIZE - 1] = '\0'; // Null-terminated + log_printf("File Path: %s\n", filePath); + + unsigned char *codes = NULL; + unsigned int codesSize = 0; + result = LoadFileToMem((const char *) filePath, &codes, &codesSize); + + if (result < 0) { + log_printf("Reading error: %i\n", result); + // Error, we won't write any codes + goto CLEANUP; + } + + log_print("Copying...\n"); + kernelCopyData2((unsigned char *) 0x01133000, codes, codesSize); + log_print("Copied!\n"); + + CLEANUP: + + result = unmount_sd_fat("sd"); + + if (result < 0) { + log_printf("Unmounting error: %i\n", result); + } + } +} \ No newline at end of file diff --git a/src/sd_cheats.h b/src/sd_cheats.h new file mode 100644 index 0000000..e2b6e3e --- /dev/null +++ b/src/sd_cheats.h @@ -0,0 +1,6 @@ +#ifndef TCPGECKO_SD_CHEATS_H +#define TCPGECKO_SD_CHEATS_H + +void considerApplyingSDCheats(); + +#endif \ No newline at end of file diff --git a/src/system/kernel.h b/src/system/kernel.h index 30f9d8c..e87d5e5 100644 --- a/src/system/kernel.h +++ b/src/system/kernel.h @@ -6,8 +6,6 @@ #include "../tcp_gecko.h" #include "../utils/logger.h" -unsigned char *kernelCopyBuffer[sizeof(int)]; - // TODO Variable size, not hard-coded unsigned char *kernelCopyBufferOld[DATA_BUFFER_SIZE]; @@ -22,6 +20,8 @@ void kernelCopyData(unsigned char *destinationBuffer, unsigned char *sourceBuffe DCFlushRange(destinationBuffer, (u32) length); } +unsigned char *kernelCopyBuffer[sizeof(int)]; + void kernelCopyInt(unsigned char *destinationBuffer, unsigned char *sourceBuffer, unsigned int length) { memcpy(kernelCopyBuffer, sourceBuffer, length); unsigned int destinationAddress = (unsigned int) OSEffectiveToPhysical(destinationBuffer); diff --git a/src/tcp_gecko.cpp b/src/tcp_gecko.cpp index 0a6a626..15b2419 100644 --- a/src/tcp_gecko.cpp +++ b/src/tcp_gecko.cpp @@ -3,7 +3,7 @@ #include #include #include -#include +// #include #include "common/common.h" #include // Actually must be included before os_functions #include "dynamic_libs/os_functions.h" @@ -22,8 +22,7 @@ #include "utils/sd_ip_reader.hpp" #include "patcher/function_patcher_gx2.h" #include "system/raw_assembly_cheats.h" -#include "fs/fs_utils.h" -#include "fs/sd_fat_devoptab.h" +#include "sd_cheats.h" void *client; void *commandBlock; @@ -1480,64 +1479,6 @@ static int runTCPGeckoServer(int argc, void *argv) { return 0; } -#define EXTENSION_SIZE 6 -#define SD_FILE_PATH_HEADER_LENGTH 10 -#define TITLE_ID_LEADING_ZEROS 3 -#define TITLE_ID_LENGTH 16 -#define CODES_FILE_PATH_SIZE (SD_FILE_PATH_HEADER_LENGTH + TITLE_ID_LENGTH + EXTENSION_SIZE) - -u64 cachedTitleID = 0; - -void considerApplyingSDCheats() { - u64 currentTitleID = OSGetTitleID(); - - if (cachedTitleID == currentTitleID) { - // log_print("Title ID NOT changed\n"); - } else { - log_print("Title ID changed\n"); - cachedTitleID = currentTitleID; - int result = mount_sd_fat("sd"); - - if (result < 0) { - log_printf("Mounting error: %i\n", result); - return; - } - - unsigned char filePath[CODES_FILE_PATH_SIZE]; - memset(filePath, '0', sizeof(filePath)); - memcpy(filePath, "sd:/codes/", SD_FILE_PATH_HEADER_LENGTH); // File path header - log_printf("Title ID: %lu\n", currentTitleID); - char asciiTitleID[TITLE_ID_LENGTH]; - snprintf(asciiTitleID, TITLE_ID_LENGTH, "%llX", currentTitleID); - memcpy(filePath + SD_FILE_PATH_HEADER_LENGTH + TITLE_ID_LEADING_ZEROS, asciiTitleID, - TITLE_ID_LENGTH); // Title ID - memcpy(filePath + SD_FILE_PATH_HEADER_LENGTH + TITLE_ID_LENGTH, ".gctu", EXTENSION_SIZE); // Extension - filePath[CODES_FILE_PATH_SIZE - 1] = '\0'; // Null-terminated - log_printf("File Path: %s\n", filePath); - - unsigned char *codes = NULL; - unsigned int codesSize = 0; - result = LoadFileToMem((const char *) filePath, &codes, &codesSize); - - if (result < 0) { - log_printf("Reading error: %i\n", result); - // Error, we won't write any codes - goto CLEANUP; - } - - kernelCopyData((unsigned char *) 0x01133000, codes, codesSize); - log_print("Copied!\n"); - - CLEANUP: - - result = unmount_sd_fat("sd"); - - if (result < 0) { - log_printf("Unmounting error: %i\n", result); - } - } -} - static int startTCPGeckoThread(int argc, void *argv) { log_print("Starting TCP Gecko thread...\n"); @@ -1562,13 +1503,14 @@ static int startTCPGeckoThread(int argc, void *argv) { // Execute the code handler if it is installed if (isCodeHandlerInstalled) { + considerApplyingSDCheats(); log_print("Code handler installed...\n"); void (*codeHandlerFunction)() = (void (*)()) CODE_HANDLER_INSTALL_ADDRESS; while (true) { usleep(9000); - considerApplyingSDCheats(); + // considerApplyingSDCheats(); // log_print("Running code handler...\n"); codeHandlerFunction(); diff --git a/tcpgecko.elf b/tcpgecko.elf index 62f423919ce27ef8ffd618199aa1878e46b5ee13..d1d6e70d487cbc1caf37bfd9663926f61e2dc77d 100644 GIT binary patch delta 32537 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