Move towards using C++

This commit is contained in:
BullyWiiPlaza 2017-07-04 10:34:47 +02:00
parent 19b8e017ef
commit 0d42c264e2
26 changed files with 342 additions and 251 deletions

View File

@ -59,7 +59,7 @@ MAKEFLAGS += --no-print-directory
#---------------------------------------------------------------------------------
# any extra libraries we wish to link with the project
#---------------------------------------------------------------------------------
LIBS := -lz -liosuhax -lgd
LIBS := -lm -lfat -lz -liosuhax -lgd
#---------------------------------------------------------------------------------
# list of directories containing libraries, this must be the top level containing

View File

@ -1,11 +1,11 @@
#ifndef COMMON_H
#define COMMON_H
#pragma once
#ifdef __cplusplus
extern "C" {
#endif
#include "os_defs.h"
#include "fs_defs.h"
#define CODE_HANDLER_INSTALL_ADDRESS 0x010F4000
@ -70,5 +70,3 @@ typedef struct _restore_instructions_t {
}
#endif
#endif /* COMMON_H */

View File

@ -50,8 +50,7 @@ extern int (*FSUnmount)(void *pClient, void *pCmd, const char *target, int errHa
extern int (*FSRename)(void *pClient, void *pCmd, const char *oldPath, const char *newPath, int error);
extern int
(*FSRenameAsync)(void *pClient, void *pCmd, const char *oldPath, const char *newPath, int error, void *asyncParams);
extern int (*FSRenameAsync)(void *pClient, void *pCmd, const char *oldPath, const char *newPath, int error, void *asyncParams);
extern int (*FSRemove)(void *pClient, void *pCmd, const char *path, int error);
@ -63,8 +62,7 @@ extern int (*FSGetStatAsync)(void *pClient, void *pCmd, const char *path, void *
extern int (*FSRename)(void *pClient, void *pCmd, const char *oldPath, const char *newPath, int error);
extern int
(*FSRenameAsync)(void *pClient, void *pCmd, const char *oldPath, const char *newPath, int error, void *asyncParams);
extern int (*FSRenameAsync)(void *pClient, void *pCmd, const char *oldPath, const char *newPath, int error, void *asyncParams);
extern int (*FSRemove)(void *pClient, void *pCmd, const char *path, int error);
@ -76,9 +74,7 @@ extern int (*FSFlushQuotaAsync)(void *pClient, void *pCmd, const char *path, int
extern int (*FSGetFreeSpaceSize)(void *pClient, void *pCmd, const char *path, uint64_t *returnedFreeSize, int error);
extern int
(*FSGetFreeSpaceSizeAsync)(void *pClient, void *pCmd, const char *path, uint64_t *returnedFreeSize, int error,
void *asyncParams);
extern int (*FSGetFreeSpaceSizeAsync)(void *pClient, void *pCmd, const char *path, uint64_t *returnedFreeSize, int error, void *asyncParams);
extern int (*FSRollbackQuota)(void *pClient, void *pCmd, const char *path, int error);
@ -104,11 +100,9 @@ extern int (*FSMakeDirAsync)(void *pClient, void *pCmd, const char *path, int er
extern int (*FSOpenFile)(void *pClient, void *pCmd, const char *path, const char *mode, int *fd, int errHandling);
extern int (*FSOpenFileAsync)(void *pClient, void *pCmd, const char *path, const char *mode, int *handle, int error,
const void *asyncParams);
extern int (*FSOpenFileAsync)(void *pClient, void *pCmd, const char *path, const char *mode, int *handle, int error, const void *asyncParams);
extern int
(*FSReadFile)(void *pClient, void *pCmd, void *buffer, int size, int count, int fd, int flag, int errHandling);
extern int (*FSReadFile)(void *pClient, void *pCmd, void *buffer, int size, int count, int fd, int flag, int errHandling);
extern int (*FSCloseFile)(void *pClient, void *pCmd, int fd, int errHandling);
@ -120,9 +114,7 @@ extern int (*FSGetStatFile)(void *pClient, void *pCmd, int fd, void *buffer, int
extern int (*FSSetPosFile)(void *pClient, void *pCmd, int fd, int pos, int error);
extern int
(*FSWriteFile)(void *pClient, void *pCmd, const void *source, int block_size, int block_count, int fd, int flag,
int error);
extern int (*FSWriteFile)(void *pClient, void *pCmd, const void *source, int block_size, int block_count, int fd, int flag, int error);
extern int (*FSBindMount)(void *pClient, void *pCmd, char *source, char *target, int error);

View File

@ -66,8 +66,7 @@ struct sockaddr_in {
char sin_zero[8];
};
struct sockaddr
{
struct sockaddr {
unsigned short sa_family;
char sa_data[14];
};
@ -76,19 +75,31 @@ struct sockaddr
void InitSocketFunctionPointers(void);
extern int (*socket_lib_init)(void);
extern int (*socket_lib_finish)(void);
extern int (*socket)(int domain, int type, int protocol);
extern int (*socketclose)(int s);
extern int (*connect)(int s, void *addr, int addrlen);
extern int (*bind)(s32 s, struct sockaddr *name, s32 namelen);
extern int (*listen)(s32 s, u32 backlog);
extern int (*accept)(s32 s, struct sockaddr *addr, s32 *addrlen);
extern int (*send)(int s, const void *buffer, int size, int flags);
extern int (*recv)(int s, void *buffer, int size, int flags);
extern int (*sendto)(int s, const void *buffer, int size, int flags, const struct sockaddr *dest, int dest_len);
extern int (*setsockopt)(int s, int level, int optname, void *optval, int optlen);
extern char *(*inet_ntoa)(struct in_addr in);
extern int (*inet_aton)(const char *cp, struct in_addr *inp);
#ifdef __cplusplus

View File

@ -2,39 +2,33 @@
#include <stdlib.h>
#include "CFile.hpp"
CFile::CFile()
{
CFile::CFile() {
iFd = -1;
mem_file = NULL;
filesize = 0;
pos = 0;
}
CFile::CFile(const std::string & filepath, eOpenTypes mode)
{
CFile::CFile(const std::string &filepath, eOpenTypes mode) {
iFd = -1;
this->open(filepath, mode);
}
CFile::CFile(const u8 * mem, int size)
{
CFile::CFile(const u8 *mem, int size) {
iFd = -1;
this->open(mem, size);
}
CFile::~CFile()
{
CFile::~CFile() {
this->close();
}
int CFile::open(const std::string & filepath, eOpenTypes mode)
{
int CFile::open(const std::string &filepath, eOpenTypes mode) {
this->close();
s32 openMode = 0;
switch(mode)
{
switch (mode) {
default:
case ReadOnly:
openMode = O_RDONLY;
@ -65,8 +59,7 @@ int CFile::open(const std::string & filepath, eOpenTypes mode)
return 0;
}
int CFile::open(const u8 * mem, int size)
{
int CFile::open(const u8 *mem, int size) {
this->close();
mem_file = mem;
@ -75,8 +68,7 @@ int CFile::open(const u8 * mem, int size)
return 0;
}
void CFile::close()
{
void CFile::close() {
if (iFd >= 0)
::close(iFd);
@ -86,10 +78,8 @@ void CFile::close()
pos = 0;
}
int CFile::read(u8 * ptr, size_t size)
{
if(iFd >= 0)
{
int CFile::read(u8 *ptr, size_t size) {
if (iFd >= 0) {
int ret = ::read(iFd, ptr, size);
if (ret > 0)
pos += ret;
@ -104,8 +94,7 @@ int CFile::read(u8 * ptr, size_t size)
if (readsize <= 0)
return readsize;
if(mem_file != NULL)
{
if (mem_file != NULL) {
memcpy(ptr, mem_file + pos, readsize);
pos += readsize;
return readsize;
@ -114,13 +103,10 @@ int CFile::read(u8 * ptr, size_t size)
return -1;
}
int CFile::write(const u8 * ptr, size_t size)
{
if(iFd >= 0)
{
int CFile::write(const u8 *ptr, size_t size) {
if (iFd >= 0) {
size_t done = 0;
while(done < size)
{
while (done < size) {
int ret = ::write(iFd, ptr, size - done);
if (ret <= 0)
return ret;
@ -135,39 +121,29 @@ int CFile::write(const u8 * ptr, size_t size)
return -1;
}
int CFile::seek(long int offset, int origin)
{
int CFile::seek(long int offset, int origin) {
int ret = 0;
s64 newPos = pos;
if(origin == SEEK_SET)
{
if (origin == SEEK_SET) {
newPos = offset;
}
else if(origin == SEEK_CUR)
{
} else if (origin == SEEK_CUR) {
newPos += offset;
}
else if(origin == SEEK_END)
{
} else if (origin == SEEK_END) {
newPos = filesize + offset;
}
if(newPos < 0)
{
if (newPos < 0) {
pos = 0;
}
else {
} else {
pos = newPos;
}
if (iFd >= 0)
ret = ::lseek(iFd, pos, SEEK_SET);
if(mem_file != NULL)
{
if(pos > filesize)
{
if (mem_file != NULL) {
if (pos > filesize) {
pos = filesize;
}
}
@ -175,15 +151,13 @@ int CFile::seek(long int offset, int origin)
return ret;
}
int CFile::fwrite(const char *format, ...)
{
int CFile::fwrite(const char *format, ...) {
int result = -1;
char *tmp = NULL;
va_list va;
va_start(va, format);
if((vasprintf(&tmp, format, va) >= 0) && tmp)
{
if ((vasprintf(&tmp, format, va) >= 0) && tmp) {
result = this->write((u8 *) tmp, strlen(tmp));
}
va_end(va);

View File

@ -7,12 +7,11 @@
#include <unistd.h>
#include <fcntl.h>
#include <gctypes.h>
#include "../common/fs_defs.h"
class CFile
{
class CFile {
public:
enum eOpenTypes
{
enum eOpenTypes {
ReadOnly,
WriteOnly,
ReadWrite,
@ -20,11 +19,15 @@ class CFile
};
CFile();
CFile(const std::string &filepath, eOpenTypes mode);
CFile(const u8 *memory, int memsize);
virtual ~CFile();
int open(const std::string &filepath, eOpenTypes mode);
int open(const u8 *memory, int memsize);
bool isOpen() const {
@ -40,11 +43,17 @@ class CFile
void close();
int read(u8 *ptr, size_t size);
int write(const u8 *ptr, size_t size);
int fwrite(const char *format, ...);
int seek(long int offset, int origin);
u64 tell() {return pos;};
u64 size() {return filesize;};
void rewind() {this->seek(0, SEEK_SET);};
protected:

View File

@ -18,6 +18,8 @@
#include "utils/logger.h"
#include "utils/function_patcher.h"
#include "patcher/function_patcher_gx2.h"
#include "patcher/function_patcher_coreinit.h"
#include "utils/sd_ip_reader.hpp"
bool isCodeHandlerInstalled;
@ -30,6 +32,7 @@ typedef enum {
void applyFunctionPatches() {
patchIndividualMethodHooks(method_hooks_gx2, method_hooks_size_gx2, method_calls_gx2);
patchIndividualMethodHooks(method_hooks_coreinit, method_hooks_size_coreinit, method_calls_coreinit);
}
/* Entry point */
@ -91,7 +94,7 @@ int Menu_Main(void) {
int screenBuffer0Size = OSScreenGetBufferSizeEx(0);
int screenBuffer1Size = OSScreenGetBufferSizeEx(1);
unsigned char *screenBuffer = MEM1_alloc(screenBuffer0Size + screenBuffer1Size, 0x40);
unsigned char *screenBuffer = (unsigned char *) MEM1_alloc(screenBuffer0Size + screenBuffer1Size, 0x40);
OSScreenSetBufferEx(0, screenBuffer);
OSScreenSetBufferEx(1, (screenBuffer + screenBuffer0Size));
@ -147,7 +150,7 @@ int Menu_Main(void) {
isCodeHandlerInstalled = true;
launchMethod = TCP_GECKO;
log_init(COMPUTER_IP_ADDRESS);
initializeUDPLog();
log_print("Patching functions\n");
applyFunctionPatches();

View File

@ -0,0 +1,47 @@
#include "../utils/function_patcher.h"
#include "../utils/logger.h"
declareFunctionHook(int, FSOpenFile, void *pClient, void *pCmd, const char *path, const char *mode, int *fd, int errHandling) {
log_printf("FSOpenFile(): %s", path);
return real_FSOpenFile(pClient, pCmd, path, mode, fd, errHandling);
}
declareFunctionHook(int, FSOpenFileAsync, void *pClient, void *pCmd, const char *path, const char *mode, int *handle, int error, const void *asyncParams) {
log_printf("FSOpenFileAsync(): %s", path);
return real_FSOpenFileAsync(pClient, pCmd, path, mode, handle, error, asyncParams);
}
declareFunctionHook(int, FSOpenDir, void *pClient, void *pCmd, const char *path, int *dh, int errHandling) {
log_printf("FSOpenDir(): %s", path);
return real_FSOpenDir(pClient, pCmd, path, dh, errHandling);
}
declareFunctionHook(int, FSOpenDirAsync, void *pClient, void *pCmd, const char *path, int *handle, int error, void *asyncParams) {
log_printf("FSOpenDirAsync(): %s", path);
return real_FSOpenDirAsync(pClient, pCmd, path, handle, error, asyncParams);
}
declareFunctionHook(int, FSGetStat, void *pClient, void *pCmd, const char *path, FSStat *stats, int errHandling) {
log_printf("FSGetStat(): %s", path);
return real_FSGetStat(pClient, pCmd, path, stats, errHandling);
}
declareFunctionHook(int, FSGetStatAsync, void *pClient, void *pCmd, const char *path, FSStat *stats, int errHandling, void *asyncParams) {
log_printf("FSGetStatAsync(): %s", path);
return real_FSGetStatAsync(pClient, pCmd, path, stats, errHandling, asyncParams);
}
FunctionHook method_hooks_coreinit[] __attribute__((section(".data"))) = {
makeFunctionHook(FSOpenFile, LIB_CORE_INIT, STATIC_FUNCTION),
makeFunctionHook(FSOpenFileAsync, LIB_CORE_INIT, STATIC_FUNCTION),
makeFunctionHook(FSOpenDir, LIB_CORE_INIT, STATIC_FUNCTION),
makeFunctionHook(FSOpenDirAsync, LIB_CORE_INIT, STATIC_FUNCTION),
makeFunctionHook(FSGetStat, LIB_CORE_INIT, STATIC_FUNCTION),
makeFunctionHook(FSGetStatAsync, LIB_CORE_INIT, STATIC_FUNCTION),
};
u32 method_hooks_size_coreinit __attribute__((section(".data"))) = sizeof(method_hooks_coreinit) / sizeof(FunctionHook);
volatile unsigned int method_calls_coreinit[sizeof(method_hooks_coreinit) / sizeof(FunctionHook) * FUNCTION_PATCHER_METHOD_STORE_SIZE] __attribute__((section(".data")));

View File

@ -0,0 +1,15 @@
#pragma once
#ifdef __cplusplus
extern "C" {
#endif
#include "../utils/function_patcher.h"
extern FunctionHook method_hooks_coreinit[];
extern u32 method_hooks_size_coreinit;
extern volatile unsigned int method_calls_coreinit[];
#ifdef __cplusplus
}
#endif

View File

@ -15,7 +15,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
****************************************************************************/
#ifndef FUNCTION_PATCHER_EXAMPLE_GX2_FUNCTION_PATCHER_H
#pragma once
#ifdef __cplusplus
extern "C" {
@ -30,5 +30,3 @@ extern volatile unsigned int method_calls_gx2[];
#ifdef __cplusplus
}
#endif
#endif

View File

@ -1,5 +1,5 @@
#include "address.h"
#include "dynamic_libs/os_functions.h"
#include "../dynamic_libs/os_functions.h"
int validateAddressRange(int starting_address, int ending_address) {
return __OSValidateAddressSpaceRange(1, (void *) starting_address, ending_address - starting_address + 1);

View File

@ -1,6 +1,6 @@
#include "disassembler.h"
#include "assertions.h"
#include "dynamic_libs/os_functions.h"
#include "../utils/assertions.h"
#include "../dynamic_libs/os_functions.h"
#include <string.h>
#include <stdlib.h>
#include <stdio.h>

View File

@ -140,5 +140,5 @@ unsigned char program_exception_cb(void *context) {
void setup_os_exceptions() {
OSSetExceptionCallback(OS_EXCEPTION_DSI, &dsi_exception_cb);
OSSetExceptionCallback(OS_EXCEPTION_ISI, &isi_exception_cb);
// OSSetExceptionCallback(OS_EXCEPTION_PROGRAM, &program_exception_cb);
OSSetExceptionCallback(OS_EXCEPTION_PROGRAM, &program_exception_cb);
}

View File

@ -58,7 +58,6 @@ static inline int getIABRMatch(void *interruptedContext) {
unsigned char breakPointHandler(void *interruptedContext);
void registerBreakPointHandler() {
log_init(COMPUTER_IP_ADDRESS);
log_print("Registering breakpoint handler...\n");
// TODO Not working, never called?
// OSSetExceptionCallback((u8) OS_EXCEPTION_DSI, &breakPointHandler);
@ -80,7 +79,6 @@ void forceDebuggerPresent() {
}*/
static inline void setupBreakpointSupport() {
log_init(COMPUTER_IP_ADDRESS);
/*log_print("Clear and enable...\n");
__OSClearAndEnableInterrupt();
log_print("Restore...\n");
@ -95,7 +93,6 @@ static inline void setupBreakpointSupport() {
void setDataBreakpoint(int address, bool read, bool write) {
setupBreakpointSupport();
log_init(COMPUTER_IP_ADDRESS);
log_print("Setting DABR...\n");
OSSetDABR(1, address, read, write);
log_print("DABR set\n");
@ -125,8 +122,6 @@ void setInstructionBreakpoint(unsigned int address) {
}
unsigned char breakPointHandler(void *interruptedContext) {
log_init(COMPUTER_IP_ADDRESS);
// Check for data breakpoints
int dataAddress = getDABRAddress(interruptedContext);
if (OSIsAddressValid((const void *) dataAddress)) {

View File

@ -1,10 +1,10 @@
#pragma once
#include "kernel/syscalls.h"
#include "assertions.h"
#include "dynamic_libs/os_functions.h"
#include "tcp_gecko.h"
#include "utils/logger.h"
#include "../kernel/syscalls.h"
#include "../utils/assertions.h"
#include "../dynamic_libs/os_functions.h"
#include "../tcp_gecko.h"
#include "../utils/logger.h"
unsigned char *kernelCopyBuffer[sizeof(int)];
@ -17,7 +17,8 @@ void kernelCopyData(unsigned char *destinationBuffer, unsigned char *sourceBuffe
}
memcpy(kernelCopyBufferOld, sourceBuffer, length);
SC0x25_KernelCopyData((unsigned int) OSEffectiveToPhysical(destinationBuffer), (unsigned int) &kernelCopyBufferOld, length);
SC0x25_KernelCopyData((unsigned int) OSEffectiveToPhysical(destinationBuffer), (unsigned int) &kernelCopyBufferOld,
length);
DCFlushRange(destinationBuffer, (u32) length);
}
@ -65,6 +66,8 @@ int kernelCopyService(int argc, void *argv) {
*(((int *) KERNEL_COPY_SOURCE_ADDRESS) + 1) = 0;
}
}
return 0;
}
void startKernelCopyService() {
@ -84,8 +87,8 @@ void startKernelCopyService() {
#define MINIMUM_KERNEL_COMPARE_LENGTH 4
#define KERNEL_MEMORY_COMPARE_STEP_SIZE 1
int kernelMemoryCompare(const void *sourceBuffer,
const void *destinationBuffer,
int kernelMemoryCompare(const char *sourceBuffer,
const char *destinationBuffer,
int length) {
if (length < MINIMUM_KERNEL_COMPARE_LENGTH) {
ASSERT_MINIMUM_HOLDS(length, MINIMUM_KERNEL_COMPARE_LENGTH, "length");
@ -111,3 +114,17 @@ int kernelMemoryCompare(const void *sourceBuffer,
return kern_read(sourceBuffer) - kern_read(destinationBuffer);
}
void executeAssembly(unsigned char buffer[], unsigned int size) {
// Write the assembly to an executable code region
int destinationAddress = 0x10000000 - size;
kernelCopyData((unsigned char *) destinationAddress, buffer, size);
// Execute the assembly from there
void (*function)() = (void (*)()) destinationAddress;
function();
// Clear the memory contents again
memset((void *) buffer, 0, size);
kernelCopyData((unsigned char *) destinationAddress, buffer, size);
}

View File

@ -1,9 +1,9 @@
#pragma once
#include "utils/logger.h"
#include "assertions.h"
#include "dynamic_libs/os_functions.h"
#include "common/fs_defs.h"
#include "../utils/logger.h"
#include "../utils/assertions.h"
#include "../dynamic_libs/os_functions.h"
#include "../common/fs_defs.h"
#include "kernel.h"
int (*AVMGetDRCScanMode)(int);
@ -22,7 +22,7 @@ unsigned long getConsoleStatePatchAddress() {
log_print("Acquired!\n");
}
return (unsigned long) (AVMGetDRCScanMode + 0x44);
return (unsigned long) ((char *) AVMGetDRCScanMode + 0x44);
}
typedef enum {

View File

@ -2,11 +2,8 @@
#include "../utils/linked_list.h"
#include "../dynamic_libs/os_functions.h"
#include "../utils/logger.h"
#include "../main.h"
struct node *getAllThreads() {
log_init(COMPUTER_IP_ADDRESS);
struct node *threads = NULL;
int currentThreadAddress = OSGetCurrentThread();
log_printf("Thread address: %08x\n", currentThreadAddress);

View File

@ -3,7 +3,7 @@
#include "../dynamic_libs/os_functions.h"
#include "../utils/logger.h"
#include "../kernel.h"
#include "kernel.h"
#include "../common/kernel_types.h"
void writeCode(u32 address, u32 instruction) {
@ -13,7 +13,7 @@ void writeCode(u32 address, u32 instruction) {
ICInvalidateRange(pointer, 4);
}
void patchFunction(void *function, char *patchBytes, unsigned int patchBytesSize, int functionOffset) {
void patchFunction(char *function, char *patchBytes, unsigned int patchBytesSize, int functionOffset) {
log_print("Patching function...\n");
void *patchAddress = function + functionOffset;
log_printf("Patch address: %p\n", patchAddress);

View File

@ -13,12 +13,12 @@
#include "dynamic_libs/gx2_functions.h"
#include "dynamic_libs/fs_functions.h"
#include "utils/logger.h"
#include "system/memory.h"
#include "system/hardware_breakpoints.h"
#include "utils/linked_list.h"
#include "address.h"
#include "system/address.h"
#include "system/stack.h"
#include "pause.h"
#include "system/pause.h"
#include "utils/sd_ip_reader.hpp"
void *client;
void *commandBlock;
@ -55,7 +55,7 @@ struct pygecko_bss_t {
#define COMMAND_FOLLOW_POINTER 0x60
#define COMMAND_REMOTE_PROCEDURE_CALL 0x70
#define COMMAND_GET_SYMBOL 0x71
#define COMMAND_MEMORY_SEARCH 0x72
#define COMMAND_MEMORY_SEARCH_32 0x72
#define COMMAND_ADVANCED_MEMORY_SEARCH 0x73
#define COMMAND_EXECUTE_ASSEMBLY 0x81
#define COMMAND_PAUSE_CONSOLE 0x82
@ -111,7 +111,7 @@ int flush
// ########## Being socket_functions.h ############
static int recvwait(struct pygecko_bss_t *bss, int sock, void *buffer, int len) {
static int recvwait(struct pygecko_bss_t *bss, int sock, unsigned char *buffer, int len) {
int ret;
while (len > 0) {
ret = recv(sock, buffer, len, 0);
@ -145,7 +145,7 @@ static int checkbyte(int sock) {
return buffer[0];
}
static int sendwait(struct pygecko_bss_t *bss, int sock, const void *buffer, int len) {
static int sendwait(struct pygecko_bss_t *bss, int sock, unsigned char *buffer, int len) {
int ret;
while (len > 0) {
ret = send(sock, buffer, len, 0);
@ -168,10 +168,10 @@ static int sendByte(struct pygecko_bss_t *bss, int sock, unsigned char byte) {
void receiveString(struct pygecko_bss_t *bss,
int clientfd,
char *stringBuffer,
unsigned char *stringBuffer,
int bufferSize) {
// Receive the string length
char lengthBuffer[4] = {0};
unsigned char lengthBuffer[4] = {0};
int ret = recvwait(bss, clientfd, lengthBuffer, 4);
ASSERT_FUNCTION_SUCCEEDED(ret, "recvwait (string length)")
int stringLength = ((int *) lengthBuffer)[0];
@ -228,7 +228,7 @@ void considerInitializingFileSystem() {
void reportIllegalCommandByte(int commandByte) {
char errorBuffer[ERROR_BUFFER_SIZE];
__os_snprintf(errorBuffer, ERROR_BUFFER_SIZE,
"Illegal command byte received: 0x%02x\nServer Version: %s\nIf you see this, you most likely have to update your TCP Gecko Installer.",
"Illegal command byte received: 0x%02x\nServer Version: %s\nIf you see this,\nplease report this bug.",
commandByte, SERVER_VERSION);
OSFatal(errorBuffer);
}
@ -514,7 +514,7 @@ static int processCommands(struct pygecko_bss_t *bss, int clientfd) {
&& (currentAddress < endingAddress)) {
int value = *(int *) currentAddress;
((int *) buffer)[currentIntegerIndex++] = value;
char *opCodeBuffer = malloc(bufferSize);
char *opCodeBuffer = (char *) malloc(bufferSize);
bool status = DisassemblePPCOpcode((u32 *) currentAddress, opCodeBuffer, (u32) bufferSize,
OSGetSymbolName,
(u32) disassemblerOptions);
@ -536,7 +536,7 @@ static int processCommands(struct pygecko_bss_t *bss, int clientfd) {
}
int bytesToSend = currentIntegerIndex * integerSize;
ret = sendwait(bss, clientfd, &bytesToSend, 4);
ret = sendwait(bss, clientfd, (unsigned char *) &bytesToSend, 4);
ASSERT_FUNCTION_SUCCEEDED(ret, "sendwait (Buffer size)")
// VALUE(4)|STATUS(4)|LENGTH(4)|DISASSEMBLED(LENGTH)
@ -545,7 +545,7 @@ static int processCommands(struct pygecko_bss_t *bss, int clientfd) {
}
int bytesToSend = 0;
ret = sendwait(bss, clientfd, &bytesToSend, 4);
ret = sendwait(bss, clientfd, (unsigned char *) &bytesToSend, 4);
ASSERT_FUNCTION_SUCCEEDED(ret, "sendwait (No more bytes)")
break;
@ -656,7 +656,7 @@ static int processCommands(struct pygecko_bss_t *bss, int clientfd) {
u32 image_size = surface.image_size;
// Send the image size so that the client knows how much to read
ret = sendwait(bss, clientfd, &image_size, 4);
ret = sendwait(bss, clientfd, (unsigned char *) &image_size, 4);
ASSERT_FUNCTION_SUCCEEDED(ret, "sendwait (image size)")
unsigned int imageBytesSent = 0;
@ -711,7 +711,7 @@ static int processCommands(struct pygecko_bss_t *bss, int clientfd) {
}
case COMMAND_READ_FILE: {
char file_path[FS_MAX_FULLPATH_SIZE] = {0};
receiveString(bss, clientfd, file_path, FS_MAX_FULLPATH_SIZE);
receiveString(bss, clientfd, (unsigned char *) file_path, FS_MAX_FULLPATH_SIZE);
considerInitializingFileSystem();
@ -747,7 +747,7 @@ static int processCommands(struct pygecko_bss_t *bss, int clientfd) {
ASSERT_FUNCTION_SUCCEEDED(bytesRead, "FSReadFile")
// Send file bytes
ret = sendwait(bss, clientfd, fileBuffer, bytesRead);
ret = sendwait(bss, clientfd, (unsigned char *) fileBuffer, bytesRead);
ASSERT_FUNCTION_SUCCEEDED(ret, "sendwait (file buffer)")
totalBytesRead += bytesRead;
@ -768,7 +768,7 @@ static int processCommands(struct pygecko_bss_t *bss, int clientfd) {
}
case COMMAND_READ_DIRECTORY: {
char directory_path[FS_MAX_FULLPATH_SIZE] = {0};
receiveString(bss, clientfd, directory_path, FS_MAX_FULLPATH_SIZE);
receiveString(bss, clientfd, (unsigned char *) directory_path, FS_MAX_FULLPATH_SIZE);
considerInitializingFileSystem();
@ -793,7 +793,7 @@ static int processCommands(struct pygecko_bss_t *bss, int clientfd) {
ASSERT_FUNCTION_SUCCEEDED(ret, "sendwait (data coming)")
// Send the struct
ret = sendwait(bss, clientfd, &entry, entrySize);
ret = sendwait(bss, clientfd, (unsigned char *) &entry, entrySize);
ASSERT_FUNCTION_SUCCEEDED(ret, "sendwait (directory entry)")
}
@ -819,7 +819,7 @@ static int processCommands(struct pygecko_bss_t *bss, int clientfd) {
// Receive the file path
char file_path[FS_MAX_FULLPATH_SIZE] = {0};
receiveString(bss, clientfd, file_path, FS_MAX_FULLPATH_SIZE);
receiveString(bss, clientfd, (unsigned char *) file_path, FS_MAX_FULLPATH_SIZE);
considerInitializingFileSystem();
@ -843,19 +843,19 @@ static int processCommands(struct pygecko_bss_t *bss, int clientfd) {
ASSERT_ALLOCATED(fileBuffer, "File buffer")
// Send the maximum file buffer size
ret = sendwait(bss, clientfd, &file_buffer_size, 4);
ret = sendwait(bss, clientfd, (unsigned char *) &file_buffer_size, 4);
ASSERT_FUNCTION_SUCCEEDED(ret, "sendwait (maximum file buffer size)")
while (true) {
// Receive the data bytes length
unsigned int dataLength;
ret = recvwait(bss, clientfd, &dataLength, 4);
ret = recvwait(bss, clientfd, (unsigned char *) &dataLength, 4);
ASSERT_FUNCTION_SUCCEEDED(ret, "recvwait (File bytes length)")
ASSERT_MAXIMUM_HOLDS(file_buffer_size, dataLength, "File buffer overrun attempted")
if (dataLength > 0) {
// Receive the data
ret = recvwait(bss, clientfd, fileBuffer, dataLength);
ret = recvwait(bss, clientfd, (unsigned char *) fileBuffer, dataLength);
ASSERT_FUNCTION_SUCCEEDED(ret, "recvwait (File buffer)")
// Write the data (and advance file handle position implicitly)
@ -888,7 +888,7 @@ static int processCommands(struct pygecko_bss_t *bss, int clientfd) {
break;
}
case COMMAND_IOSU_HAX_READ_FILE: {
log_print("COMMAND_IOSUHAX_READ_FILE");
/*log_print("COMMAND_IOSUHAX_READ_FILE");
// TODO Crashes console on this call
int returnValue = IOSUHAX_Open(NULL);
@ -965,7 +965,7 @@ static int processCommands(struct pygecko_bss_t *bss, int clientfd) {
returnValue = IOSUHAX_Close();
log_printf("IOSUHAX_Close: %i", returnValue);
IOSUHAX_OPEN_FAILED:
IOSUHAX_OPEN_FAILED:*/
break;
}
@ -1039,7 +1039,7 @@ static int processCommands(struct pygecko_bss_t *bss, int clientfd) {
ASSERT_FUNCTION_SUCCEEDED(ret, "nn_act_Finalize");
// Send it
ret = sendwait(bss, clientfd, &persistentIdentifier, 4);
ret = sendwait(bss, clientfd, (unsigned char *) &persistentIdentifier, 4);
ASSERT_FUNCTION_SUCCEEDED(ret, "sendwait (persistent identifier)")
break;
@ -1113,7 +1113,7 @@ static int processCommands(struct pygecko_bss_t *bss, int clientfd) {
ret = recvwait(bss, clientfd, buffer, 4 + 8 * 4);
CHECK_ERROR(ret < 0);
fun = ((void **) buffer)[0];
fun = (long long int (*)(int, int, int, int, int, int, int, int)) ((void **) buffer)[0];
r3 = ((int *) buffer)[1];
r4 = ((int *) buffer)[2];
r5 = ((int *) buffer)[3];
@ -1139,15 +1139,15 @@ static int processCommands(struct pygecko_bss_t *bss, int clientfd) {
CHECK_ERROR(ret < 0)
/* Identify the RPL name and symbol name */
char *rplname = (char *) &((int *) buffer)[2];
char *symname = (char *) (&buffer[0] + ((int *) buffer)[1]);
char *rplName = (char *) &((int *) buffer)[2];
char *symbolName = (char *) (&buffer[0] + ((int *) buffer)[1]);
/* Get the symbol and store it in the buffer */
unsigned int module_handle, function_address;
OSDynLoad_Acquire(rplname, &module_handle);
OSDynLoad_Acquire(rplName, &module_handle);
char data = (char) recvbyte(bss, clientfd);
OSDynLoad_FindExport(module_handle, data, symname, &function_address);
OSDynLoad_FindExport(module_handle, data, symbolName, &function_address);
((int *) buffer)[0] = (int) function_address;
ret = sendwait(bss, clientfd, buffer, 4);
@ -1155,7 +1155,7 @@ static int processCommands(struct pygecko_bss_t *bss, int clientfd) {
break;
}
case COMMAND_MEMORY_SEARCH: {
case COMMAND_MEMORY_SEARCH_32: {
ret = recvwait(bss, clientfd, buffer, sizeof(int) * 3);
CHECK_ERROR(ret < 0);
int address = ((int *) buffer)[0];
@ -1178,7 +1178,7 @@ static int processCommands(struct pygecko_bss_t *bss, int clientfd) {
}
case COMMAND_ADVANCED_MEMORY_SEARCH: {
// Receive the initial data
ret = recvwait(bss, clientfd, buffer, 4 * 6);
ret = recvwait(bss, clientfd, buffer, 6 * sizeof(int));
ASSERT_FUNCTION_SUCCEEDED(ret, "recvwait (memory search information)")
int bufferIndex = 0;
int startingAddress = ((int *) buffer)[bufferIndex++];
@ -1190,7 +1190,7 @@ static int processCommands(struct pygecko_bss_t *bss, int clientfd) {
// Receive the search bytes
char searchBytes[searchBytesCount];
ret = recvwait(bss, clientfd, searchBytes, searchBytesCount);
ret = recvwait(bss, clientfd, (unsigned char *) searchBytes, searchBytesCount);
ASSERT_FUNCTION_SUCCEEDED(ret, "recvwait (memory search bytes)")
int iterationIncrement = aligned ? searchBytesCount : 1;
@ -1204,7 +1204,7 @@ static int processCommands(struct pygecko_bss_t *bss, int clientfd) {
int comparisonResult;
if (kernelRead) {
comparisonResult = kernelMemoryCompare((void *) currentAddress, searchBytes, searchBytesCount);
comparisonResult = kernelMemoryCompare((char *) currentAddress, searchBytes, searchBytesCount);
} else {
comparisonResult = memcmp((void *) currentAddress, searchBytes, searchBytesCount);
}
@ -1228,20 +1228,8 @@ static int processCommands(struct pygecko_bss_t *bss, int clientfd) {
break;
}
case COMMAND_EXECUTE_ASSEMBLY: {
// Receive the assembly
receiveString(bss, clientfd, (char *) buffer, DATA_BUFFER_SIZE);
// Write the assembly to an executable code region
int destinationAddress = 0x10000000 - DATA_BUFFER_SIZE;
kernelCopyData((unsigned char *) destinationAddress, buffer, DATA_BUFFER_SIZE);
// Execute the assembly from there
void (*function)() = (void (*)()) destinationAddress;
function();
// Clear the memory contents again
memset((void *) buffer, 0, DATA_BUFFER_SIZE);
kernelCopyData((unsigned char *) destinationAddress, buffer, DATA_BUFFER_SIZE);
receiveString(bss, clientfd, (unsigned char *) buffer, DATA_BUFFER_SIZE);
executeAssembly(buffer, DATA_BUFFER_SIZE);
break;
}
@ -1408,8 +1396,7 @@ static int runTCPGeckoServer(int argc, void *argv) {
setup_os_exceptions();
socket_lib_init();
log_init(COMPUTER_IP_ADDRESS);
initializeUDPLog();
while (true) {
socketAddress.sin_family = AF_INET;
@ -1460,18 +1447,18 @@ static int runTCPGeckoServer(int argc, void *argv) {
}
static int startTCPGeckoThread(int argc, void *argv) {
log_init(COMPUTER_IP_ADDRESS);
log_print("Starting TCP Gecko thread...\n");
// Run the TCP Gecko Installer server
struct pygecko_bss_t *bss;
bss = memalign(0x40, sizeof(struct pygecko_bss_t));
bss = (struct pygecko_bss_t *) memalign(0x40, sizeof(struct pygecko_bss_t));
if (bss == 0)
return 0;
memset(bss, 0, sizeof(struct pygecko_bss_t));
if (OSCreateThread(&bss->thread, runTCPGeckoServer, 1, bss, (u32) bss->stack + sizeof(bss->stack),
if (OSCreateThread(&bss->thread, (s32 (*)(s32, void *)) runTCPGeckoServer, 1, bss,
(u32) bss->stack + sizeof(bss->stack),
sizeof(bss->stack), 0,
0xc) == 1) {
OSResumeThread(&bss->thread);
@ -1499,7 +1486,6 @@ static int startTCPGeckoThread(int argc, void *argv) {
}
void startTCPGecko() {
log_init(COMPUTER_IP_ADDRESS);
log_print("Starting TCP Gecko...\n");
// Force the debugger to be initialized by default

View File

@ -0,0 +1,40 @@
#include "sd_ip_reader.hpp"
char ipFromSd[16];
bool hasReadIP = false;
void initializeUDPLog() {
if (!hasReadIP) {
log_printf("Reading ip from sd card\n");
hasReadIP = true;
std::string ipFilePath = std::string(SD_PATH) + WIIU_PATH + "/" + IP_TXT;
CFile file(ipFilePath, CFile::ReadOnly);
if (!file.isOpen()) {
log_printf("File %s not found, using hard-coded\n", ipFilePath.c_str());
log_init(COMPUTER_IP_ADDRESS);
return;
}
std::string strBuffer;
strBuffer.resize(file.size());
file.read((u8 *) &strBuffer[0], strBuffer.size());
if (strBuffer.length() >= sizeof(ipFromSd)) {
log_printf("Loading ip from sd failed. String was too long: %s\n", strBuffer.c_str());
return;
}
memcpy(ipFromSd, strBuffer.c_str(), strBuffer.length());
ipFromSd[strBuffer.length()] = 0;
log_printf("Successfully read ip from sd! ip is: %s\n", ipFromSd);
log_init(ipFromSd);
}
if (strlen(ipFromSd) > 0) {
log_init(ipFromSd);
}
}

View File

@ -0,0 +1,9 @@
#pragma once
#include "logger.h"
#include "../common/common.h"
#include "../fs/CFile.hpp"
#define IP_TXT "ip.txt"
void initializeUDPLog();

Binary file not shown.