From 669d0f9c2fcb6586c9eb33637e786ee303d13e1b Mon Sep 17 00:00:00 2001 From: BullyWiiPlaza Date: Thu, 20 Apr 2017 00:44:29 +0200 Subject: [PATCH] iosuhax read file command draft --- src/main.c | 7 ++-- src/pygecko.c | 92 ++++++++++++++++++++++++++++++++++++++++++++++---- tcpgecko.elf | Bin 140172 -> 142916 bytes 3 files changed, 89 insertions(+), 10 deletions(-) diff --git a/src/main.c b/src/main.c index 3f56f92..5ce578c 100644 --- a/src/main.c +++ b/src/main.c @@ -116,12 +116,13 @@ int Menu_Main(void) { char ipAddressMessageBuffer[64]; InitSocketFunctionPointers(); __os_snprintf(ipAddressMessageBuffer, 64, "Your Wii U's IP address: %i.%i.%i.%i", - (hostIpAddress >> 24) & 0xFF, (hostIpAddress >> 16) & 0xFF, (hostIpAddress >> 8) & 0xFF, hostIpAddress & 0xFF); + (hostIpAddress >> 24) & 0xFF, (hostIpAddress >> 16) & 0xFF, (hostIpAddress >> 8) & 0xFF, + hostIpAddress & 0xFF); PRINT_TEXT2(14, 1, "-- TCP Gecko Installer --") PRINT_TEXT2(7, 2, ipAddressMessageBuffer) - 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, 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); diff --git a/src/pygecko.c b/src/pygecko.c index dfd0a8e..fab5c3b 100644 --- a/src/pygecko.c +++ b/src/pygecko.c @@ -12,9 +12,9 @@ #include "dynamic_libs/gx2_functions.h" #include "kernel/syscalls.h" #include "dynamic_libs/fs_functions.h" -#include "common/fs_defs.h" #include "system/exception_handler.h" #include "utils/logger.h" +#include "system/memory.h" void *client; void *commandBlock; @@ -60,6 +60,7 @@ struct pygecko_bss_t { #define COMMAND_SERVER_VERSION 0x99 #define COMMAND_OS_VERSION 0x9A #define COMMAND_RUN_KERNEL_COPY_SERVICE 0xCD +#define COMMAND_IOSUHAX_READ_FILE 0xD0 #define CHECK_ERROR(cond) if (cond) { bss->line = __LINE__; goto error; } #define errno (*__gh_errno_ptr()) @@ -416,7 +417,8 @@ int roundUpToAligned(int number) { void reportIllegalCommandByte(int commandByte) { char errorBuffer[ERROR_BUFFER_SIZE]; - __os_snprintf(errorBuffer, ERROR_BUFFER_SIZE, "Illegal command byte received: 0x%02x\nServer Version: %s", + __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.", commandByte, SERVER_VERSION); OSFatal(errorBuffer); } @@ -961,8 +963,6 @@ static int listenForCommands(struct pygecko_bss_t *bss, int clientfd) { break; } case COMMAND_REPLACE_FILE: { - // int res = IOSUHAX_Open(NULL); - // TODO FSOpenFile ACCESS_ERROR // Receive the file path @@ -1016,9 +1016,9 @@ static int listenForCommands(struct pygecko_bss_t *bss, int clientfd) { } } - /*// Flush the file back - ret = FSFlushFile(client, commandBlock, handle, FS_RET_ALL_ERROR); - CHECK_FUNCTION_FAILED(ret, "FSFlushFile")*/ + // Flush the file back + // ret = FSFlushFile(client, commandBlock, handle, FS_RET_ALL_ERROR); + // CHECK_FUNCTION_FAILED(ret, "FSFlushFile") // Close the file ret = FSCloseFile(client, commandBlock, handle, FS_RET_ALL_ERROR); @@ -1035,6 +1035,84 @@ static int listenForCommands(struct pygecko_bss_t *bss, int clientfd) { break; } + case COMMAND_IOSUHAX_READ_FILE: { + int returnValue = IOSUHAX_Open(NULL); + log_printf("IOSUHAX_Open: %i", returnValue); + + if (returnValue < 0) { + goto IOSUHAX_OPEN_FAILED; + } + + int fileSystemFileDescriptor = IOSUHAX_FSA_Open(); + log_printf("IOSUHAX_FSA_Open: %i", fileSystemFileDescriptor); + + if (fileSystemFileDescriptor < 0) { + goto IOSUHAX_FSA_OPEN_FAILED; + } + + int fileDescriptor; + const char *filePath = "/vol/storage_usb/usr/title/0005000e/1010ed00/content/audio/stream/pBGM_GBA_CHEESELAND_F.bfstm"; + returnValue = IOSUHAX_FSA_OpenFile(fileSystemFileDescriptor, filePath, "rb", &fileDescriptor); + log_printf("IOSUHAX_FSA_OpenFile: %i", returnValue); + + if (returnValue < 0) { + goto IOSUHAX_OPEN_FILE_FAILED; + } + + fileStat_s stats; + returnValue = IOSUHAX_FSA_StatFile(fileSystemFileDescriptor, fileDescriptor, &stats); + log_printf("IOSUHAX_FSA_StatFile: %i", returnValue); + + if (returnValue < 0) { + goto IOSUHAX_READ_FILE_FAILED_CLOSE; + } + + void *fileBuffer = MEMBucket_alloc(stats.size, 4); + log_printf("File Buffer: %p", fileBuffer); + + if (!fileBuffer) { + goto IOSUHAX_READ_FILE_FAILED_CLOSE; + } + + size_t totalBytesRead = 0; + while (totalBytesRead < stats.size) { + size_t remainingBytes = stats.size - totalBytesRead; + int bytesRead = IOSUHAX_FSA_ReadFile(fileSystemFileDescriptor, + fileBuffer + totalBytesRead, + 0x01, + remainingBytes, + fileDescriptor, + 0); + log_printf("IOSUHAX_FSA_ReadFile: %i", bytesRead); + + if (bytesRead <= 0) { + goto IOSUHAX_READ_FILE_FAILED_CLOSE; + } else { + totalBytesRead += bytesRead; + } + } + + log_printf("Bytes read: %i", totalBytesRead); + + IOSUHAX_READ_FILE_FAILED_CLOSE: + + returnValue = IOSUHAX_FSA_CloseFile(fileSystemFileDescriptor, fileDescriptor); + log_printf("IOSUHAX_FSA_CloseFile: %i", returnValue); + + IOSUHAX_OPEN_FILE_FAILED: + + returnValue = IOSUHAX_FSA_Close(fileSystemFileDescriptor); + log_printf("IOSUHAX_FSA_Close: %i", returnValue); + + IOSUHAX_FSA_OPEN_FAILED: + + returnValue = IOSUHAX_Close(); + log_printf("IOSUHAX_Close: %i", returnValue); + + IOSUHAX_OPEN_FAILED: + + break; + } case COMMAND_GET_CODE_HANDLER_ADDRESS: { ((int *) buffer)[0] = CODE_HANDLER_INSTALL_ADDRESS; ret = sendwait(bss, clientfd, buffer, 4); diff --git a/tcpgecko.elf b/tcpgecko.elf index bfe4fee2244bc9d5e0565ab880273a91cd05a633..ed2a38032d5b4b3b462625cffa807d449d9e01b7 100644 GIT binary patch delta 29526 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 RsQ=t(zzKn$^oMQ8{{bm)5H|n- delta 26879 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 S5FcZAtCRRRa)o0h!~P$bTjhNK