From 6c4df9fc0ef03852837519a13b295f00f202d3f8 Mon Sep 17 00:00:00 2001 From: "Daniel K. O." Date: Sat, 12 Oct 2024 11:44:50 -0300 Subject: [PATCH 1/9] Moved `function_replacement_data_v2_t` to a private header. (#33) * Moved `function_replacement_data_v2_t` to a private header. * Sorted includes. * Sorted includes the way clang likes it. * Updated Dockerfile. --------- Co-authored-by: Daniel K. O. (dkosmari) --- Dockerfile | 2 +- source/PatchedFunctionData.h | 1 + source/fpatching_defines_legacy.h | 17 +++++++++++++++++ 3 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 source/fpatching_defines_legacy.h diff --git a/Dockerfile b/Dockerfile index 972fe76..7b647f7 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,7 @@ FROM ghcr.io/wiiu-env/devkitppc:20240505 COPY --from=ghcr.io/wiiu-env/libkernel:20230621 /artifacts $DEVKITPRO -COPY --from=ghcr.io/wiiu-env/libfunctionpatcher:20230621 /artifacts $DEVKITPRO +COPY --from=ghcr.io/wiiu-env/libfunctionpatcher:20241012-5173f86 /artifacts $DEVKITPRO COPY --from=ghcr.io/wiiu-env/wiiumodulesystem:20240424 /artifacts $DEVKITPRO WORKDIR project diff --git a/source/PatchedFunctionData.h b/source/PatchedFunctionData.h index 8bf3691..dec2953 100644 --- a/source/PatchedFunctionData.h +++ b/source/PatchedFunctionData.h @@ -2,6 +2,7 @@ #include "FunctionAddressProvider.h" #include "PatchedFunctionData.h" +#include "fpatching_defines_legacy.h" #include "utils/logger.h" #include #include diff --git a/source/fpatching_defines_legacy.h b/source/fpatching_defines_legacy.h new file mode 100644 index 0000000..8824598 --- /dev/null +++ b/source/fpatching_defines_legacy.h @@ -0,0 +1,17 @@ +#pragma once + +/* Types that are kept only for ABI compatibility. */ + +#include +#include + +typedef struct function_replacement_data_v2_t { + uint32_t VERSION; + uint32_t physicalAddr; /* [needs to be filled] */ + uint32_t virtualAddr; /* [needs to be filled] */ + uint32_t replaceAddr; /* [needs to be filled] Address of our replacement function */ + uint32_t *replaceCall; /* [needs to be filled] Address to access the real_function */ + function_replacement_library_type_t library; /* [needs to be filled] rpl where the function we want to replace is. */ + const char *function_name; /* [needs to be filled] name of the function we want to replace */ + FunctionPatcherTargetProcess targetProcess; /* [will be filled] */ +} function_replacement_data_v2_t; From c083708f1a09b0a500e94a39399f7404b8a16c2a Mon Sep 17 00:00:00 2001 From: Maschell Date: Tue, 20 Jan 2026 18:25:54 +0100 Subject: [PATCH 2/9] Flush custom code when patching functions --- source/function_patcher.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/source/function_patcher.cpp b/source/function_patcher.cpp index 37438e5..ea102cf 100644 --- a/source/function_patcher.cpp +++ b/source/function_patcher.cpp @@ -21,6 +21,19 @@ static void writeDataAndFlushIC(CThread *thread, void *arg) { auto replace_instruction_physical = (uint32_t) &replace_instruction; + if (data->jumpData) { + DCFlushRange(data->jumpData, data->jumpDataSize * sizeof(uint32_t)); + ICInvalidateRange(data->jumpData, data->jumpDataSize * sizeof(uint32_t)); + } + if (data->jumpToOriginal) { + DCFlushRange(data->jumpToOriginal, 5 * sizeof(uint32_t)); + ICInvalidateRange(data->jumpToOriginal, 5 * sizeof(uint32_t)); + } + if (data->realCallFunctionAddressPtr) { + DCFlushRange(data->realCallFunctionAddressPtr, sizeof(uint32_t)); + ICInvalidateRange(data->realCallFunctionAddressPtr, sizeof(uint32_t)); + } + if (replace_instruction_physical < 0x00800000 || replace_instruction_physical >= 0x01000000) { replace_instruction_physical = OSEffectiveToPhysical(replace_instruction_physical); } else { From 67a527010db826603239617fea7f85fa2d8fb541 Mon Sep 17 00:00:00 2001 From: Maschell Date: Tue, 20 Jan 2026 18:26:50 +0100 Subject: [PATCH 3/9] Use std::recursive vs std::mutex --- source/export.cpp | 9 ++++++--- source/function_patcher.cpp | 4 ++++ source/main.cpp | 10 ++++++---- source/utils/globals.cpp | 2 +- source/utils/globals.h | 3 ++- 5 files changed, 19 insertions(+), 9 deletions(-) diff --git a/source/export.cpp b/source/export.cpp index a550363..b6d15b6 100644 --- a/source/export.cpp +++ b/source/export.cpp @@ -2,8 +2,11 @@ #include "PatchedFunctionData.h" #include "function_patcher.h" #include "utils/globals.h" + +#include #include #include + #include WUT_CHECK_OFFSET(function_replacement_data_v2_t, 0x00, VERSION); @@ -50,7 +53,7 @@ FunctionPatcherStatus FPAddFunctionPatch(function_replacement_data_t *function_d } { - std::lock_guard lock(gPatchedFunctionsMutex); + std::lock_guard lock(gPatchedFunctionsMutex); gPatchedFunctions.push_back(std::move(functionData)); OSMemoryBarrier(); @@ -64,7 +67,7 @@ bool FunctionPatcherPatchFunction(function_replacement_data_t *function_data, Pa } FunctionPatcherStatus FPRemoveFunctionPatch(PatchedFunctionHandle handle) { - std::lock_guard lock(gPatchedFunctionsMutex); + std::lock_guard lock(gPatchedFunctionsMutex); std::vector> toBeTempRestored; bool found = false; int32_t erasePosition = 0; @@ -132,7 +135,7 @@ FunctionPatcherStatus FPIsFunctionPatched(PatchedFunctionHandle handle, bool *ou if (outIsFunctionPatched == nullptr) { return FUNCTION_PATCHER_RESULT_INVALID_ARGUMENT; } - std::lock_guard lock(gPatchedFunctionsMutex); + std::lock_guard lock(gPatchedFunctionsMutex); for (auto &cur : gPatchedFunctions) { if (cur->getHandle() == handle) { *outIsFunctionPatched = cur->isPatched; diff --git a/source/function_patcher.cpp b/source/function_patcher.cpp index ea102cf..66d61b0 100644 --- a/source/function_patcher.cpp +++ b/source/function_patcher.cpp @@ -4,11 +4,15 @@ #include "utils/CThread.h" #include "utils/logger.h" #include "utils/utils.h" + #include #include #include + #include + #include +#include static void writeDataAndFlushIC(CThread *thread, void *arg) { auto *data = (PatchedFunctionData *) arg; diff --git a/source/main.cpp b/source/main.cpp index 5818992..15063ac 100644 --- a/source/main.cpp +++ b/source/main.cpp @@ -4,9 +4,11 @@ #include "utils/globals.h" #include "utils/logger.h" #include "utils/utils.h" + #include #include #include +#include #include #include #include @@ -41,7 +43,7 @@ void UpdateFunctionPointer() { } void CheckIfPatchedFunctionsAreStillInMemory() { - std::lock_guard lock(gPatchedFunctionsMutex); + std::lock_guard lock(gPatchedFunctionsMutex); // Check if rpl has been unloaded by comparing the instruction. std::set physicalAddressesUnchanged; std::set physicalAddressesChanged; @@ -129,12 +131,12 @@ void notify_callback(OSDynLoad_Module module, OSDynLoad_NotifyReason reason, OSDynLoad_NotifyData *infos) { if (reason == OS_DYNLOAD_NOTIFY_LOADED) { - std::lock_guard lock(gPatchedFunctionsMutex); + std::lock_guard lock(gPatchedFunctionsMutex); for (auto &cur : gPatchedFunctions) { PatchFunction(cur); } } else if (reason == OS_DYNLOAD_NOTIFY_UNLOADED) { - std::lock_guard lock(gPatchedFunctionsMutex); + std::lock_guard lock(gPatchedFunctionsMutex); auto library = gFunctionAddressProvider->getTypeForHandle(module); if (library != LIBRARY_OTHER) { for (auto &cur : gPatchedFunctions) { @@ -162,7 +164,7 @@ WUMS_APPLICATION_STARTS() { initLogging(); { - std::lock_guard lock(gPatchedFunctionsMutex); + std::lock_guard lock(gPatchedFunctionsMutex); // reset function patch status if the rpl they were patching has been unloaded from memory. CheckIfPatchedFunctionsAreStillInMemory(); DEBUG_FUNCTION_LINE_VERBOSE("Patch all functions"); diff --git a/source/utils/globals.cpp b/source/utils/globals.cpp index d5a6619..69e5f39 100644 --- a/source/utils/globals.cpp +++ b/source/utils/globals.cpp @@ -4,7 +4,7 @@ char gJumpHeapData[JUMP_HEAP_DATA_SIZE] __attribute__((section(".data"))); MEMHeapHandle gJumpHeapHandle __attribute__((section(".data"))); std::shared_ptr gFunctionAddressProvider; -std::mutex gPatchedFunctionsMutex; +std::recursive_mutex gPatchedFunctionsMutex; std::vector> gPatchedFunctions; void *(*gMEMAllocFromDefaultHeapExForThreads)(uint32_t size, int align); diff --git a/source/utils/globals.h b/source/utils/globals.h index 002e655..94135c9 100644 --- a/source/utils/globals.h +++ b/source/utils/globals.h @@ -3,6 +3,7 @@ #include "version.h" #include #include +#include #include #define MODULE_VERSION "v0.2.3" @@ -13,7 +14,7 @@ extern char gJumpHeapData[]; extern MEMHeapHandle gJumpHeapHandle; extern std::shared_ptr gFunctionAddressProvider; -extern std::mutex gPatchedFunctionsMutex; +extern std::recursive_mutex gPatchedFunctionsMutex; extern std::vector> gPatchedFunctions; extern void *(*gMEMAllocFromDefaultHeapExForThreads)(uint32_t size, int align); From 958a1e72d0c405fb6a4d0d0f4b8978851afff390 Mon Sep 17 00:00:00 2001 From: Maschell Date: Tue, 20 Jan 2026 18:26:59 +0100 Subject: [PATCH 4/9] Fix compiler warnings --- Makefile | 2 +- source/FunctionAddressProvider.cpp | 2 +- source/function_patcher.cpp | 1 + source/main.cpp | 2 ++ source/utils/CThread.h | 1 + 5 files changed, 6 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 9401ba4..74580fd 100644 --- a/Makefile +++ b/Makefile @@ -28,7 +28,7 @@ INCLUDES := source #------------------------------------------------------------------------------- # options for code generation #------------------------------------------------------------------------------- -CFLAGS := -Wall -Os -ffunction-sections\ +CFLAGS := -Wall -Wextra -Werror -Os -ffunction-sections\ $(MACHDEP) CFLAGS += $(INCLUDE) -D__WIIU__ -D__WUT__ diff --git a/source/FunctionAddressProvider.cpp b/source/FunctionAddressProvider.cpp index 952f3af..3e7becb 100644 --- a/source/FunctionAddressProvider.cpp +++ b/source/FunctionAddressProvider.cpp @@ -15,7 +15,7 @@ uint32_t FunctionAddressProvider::getEffectiveAddressOfFunction(function_replace err = OSDynLoad_IsModuleLoaded((char *) rplHandle.rplname, &rplHandle.handle); } if (err != OS_DYNLOAD_OK || !rplHandle.handle) { - DEBUG_FUNCTION_LINE_VERBOSE("%s is not loaded yet", rplHandle.rplname, err, rplHandle.handle); + DEBUG_FUNCTION_LINE_VERBOSE("%s is not loaded yet. Err %d for handle %p", rplHandle.rplname, err, rplHandle.handle); return 0; } rpl_handle = rplHandle.handle; diff --git a/source/function_patcher.cpp b/source/function_patcher.cpp index 66d61b0..69892d6 100644 --- a/source/function_patcher.cpp +++ b/source/function_patcher.cpp @@ -15,6 +15,7 @@ #include static void writeDataAndFlushIC(CThread *thread, void *arg) { + (void) thread; auto *data = (PatchedFunctionData *) arg; uint32_t replace_instruction = data->replaceWithInstruction; diff --git a/source/main.cpp b/source/main.cpp index 15063ac..3349a0c 100644 --- a/source/main.cpp +++ b/source/main.cpp @@ -130,6 +130,8 @@ void notify_callback(OSDynLoad_Module module, void *userContext, OSDynLoad_NotifyReason reason, OSDynLoad_NotifyData *infos) { + (void) userContext; + (void) infos; if (reason == OS_DYNLOAD_NOTIFY_LOADED) { std::lock_guard lock(gPatchedFunctionsMutex); for (auto &cur : gPatchedFunctions) { diff --git a/source/utils/CThread.h b/source/utils/CThread.h index 454067a..a465289 100644 --- a/source/utils/CThread.h +++ b/source/utils/CThread.h @@ -151,6 +151,7 @@ class CThread { private: static int32_t threadCallback(int32_t argc, void *arg) { + (void) argc; //! After call to start() continue with the internal function ((CThread *) arg)->executeThread(); return 0; From 81d688ed161691da28781e28888a07143f30fe22 Mon Sep 17 00:00:00 2001 From: Maschell Date: Sun, 8 Feb 2026 19:00:33 +0100 Subject: [PATCH 5/9] Update workflows --- .github/workflows/ci.yml | 4 ++-- .github/workflows/pr.yml | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1c6c8eb..d5931d3 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -9,7 +9,7 @@ jobs: clang-format: runs-on: ubuntu-22.04 steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - name: clang-format run: | docker run --rm -v ${PWD}:/src ghcr.io/wiiu-env/clang-format:13.0.0-2 -r ./source @@ -17,7 +17,7 @@ jobs: runs-on: ubuntu-22.04 needs: clang-format steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - name: create version.h run: | git_hash=$(git rev-parse --short "$GITHUB_SHA") diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 1bc439b..0f60bc7 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -6,7 +6,7 @@ jobs: clang-format: runs-on: ubuntu-22.04 steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - name: clang-format run: | docker run --rm -v ${PWD}:/src ghcr.io/wiiu-env/clang-format:13.0.0-2 -r ./source @@ -14,7 +14,7 @@ jobs: runs-on: ubuntu-22.04 needs: clang-format steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - name: build binary with logging run: | docker build . -t builder @@ -25,7 +25,7 @@ jobs: runs-on: ubuntu-22.04 needs: clang-format steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - name: create version.h run: | git_hash=$(git rev-parse --short "${{ github.event.pull_request.head.sha }}") From 8e81332fc4add88819642240efdaf856be3519be Mon Sep 17 00:00:00 2001 From: Maschell Date: Sun, 8 Feb 2026 19:09:54 +0100 Subject: [PATCH 6/9] Update Dockerfile --- Dockerfile | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Dockerfile b/Dockerfile index 7b647f7..69c5358 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,7 @@ -FROM ghcr.io/wiiu-env/devkitppc:20240505 +FROM ghcr.io/wiiu-env/devkitppc:20260204 -COPY --from=ghcr.io/wiiu-env/libkernel:20230621 /artifacts $DEVKITPRO -COPY --from=ghcr.io/wiiu-env/libfunctionpatcher:20241012-5173f86 /artifacts $DEVKITPRO -COPY --from=ghcr.io/wiiu-env/wiiumodulesystem:20240424 /artifacts $DEVKITPRO +COPY --from=ghcr.io/wiiu-env/libkernel:20260208 /artifacts $DEVKITPRO +COPY --from=ghcr.io/wiiu-env/libfunctionpatcher:20260208 /artifacts $DEVKITPRO +COPY --from=ghcr.io/wiiu-env/wiiumodulesystem:20260126 /artifacts $DEVKITPRO -WORKDIR project +WORKDIR /project From e2047a34f347a38c10e0941725ea09872f5a15c0 Mon Sep 17 00:00:00 2001 From: Maschell Date: Sat, 18 Apr 2026 19:38:23 +0200 Subject: [PATCH 7/9] Colored logging --- source/utils/logger.h | 37 ++++++++++++++++++++++--------------- 1 file changed, 22 insertions(+), 15 deletions(-) diff --git a/source/utils/logger.h b/source/utils/logger.h index 863e767..b75bdda 100644 --- a/source/utils/logger.h +++ b/source/utils/logger.h @@ -8,19 +8,24 @@ extern "C" { #endif -#define LOG_APP_TYPE "M" -#define LOG_APP_NAME "function_patcher" +#define LOG_APP_TYPE "M" +#define LOG_APP_NAME "function_patcher" -#define __FILENAME_X__ (strrchr(__FILE__, '\\') ? strrchr(__FILE__, '\\') + 1 : __FILE__) -#define __FILENAME__ (strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : __FILENAME_X__) +#define __FILENAME_X__ (strrchr(__FILE__, '\\') ? strrchr(__FILE__, '\\') + 1 : __FILE__) +#define __FILENAME__ (strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : __FILENAME_X__) -#define LOG(LOG_FUNC, FMT, ARGS...) LOG_EX_DEFAULT(LOG_FUNC, "", "", FMT, ##ARGS) +#define LOG(LOG_FUNC, FMT, ARGS...) LOG_EX_DEFAULT(LOG_FUNC, "", "", "", FMT, ##ARGS) -#define LOG_EX_DEFAULT(LOG_FUNC, LOG_LEVEL, LINE_END, FMT, ARGS...) LOG_EX(__FILENAME__, __FUNCTION__, __LINE__, LOG_FUNC, LOG_LEVEL, LINE_END, FMT, ##ARGS) +#define CONSOLE_COLOR_RED "\033[31m" +#define CONSOLE_COLOR_YELLOW "\033[33m" +#define CONSOLE_COLOR_CYAN "\033[36m" +#define CONSOLE_COLOR_RESET "\033[0m" -#define LOG_EX(FILENAME, FUNCTION, LINE, LOG_FUNC, LOG_LEVEL, LINE_END, FMT, ARGS...) \ - do { \ - LOG_FUNC("[(%s)%18s][%23s]%30s@L%04d: " LOG_LEVEL "" FMT "" LINE_END, LOG_APP_TYPE, LOG_APP_NAME, FILENAME, FUNCTION, LINE, ##ARGS); \ +#define LOG_EX_DEFAULT(LOG_FUNC, LOG_COLOR, LOG_LEVEL, LINE_END, FMT, ARGS...) LOG_EX(__FILENAME__, __FUNCTION__, __LINE__, LOG_FUNC, LOG_COLOR, LOG_LEVEL, LINE_END, FMT, ##ARGS) + +#define LOG_EX(FILENAME, FUNCTION, LINE, LOG_FUNC, LOG_COLOR, LOG_LEVEL, LINE_END, FMT, ARGS...) \ + do { \ + LOG_FUNC(LOG_COLOR "[(%s)%18s][%23s]%30s@L%04d: " LOG_LEVEL "" FMT "" LINE_END, LOG_APP_TYPE, LOG_APP_NAME, FILENAME, FUNCTION, LINE, ##ARGS); \ } while (0) #ifdef DEBUG @@ -37,10 +42,11 @@ extern "C" { #define DEBUG_FUNCTION_LINE_WRITE(FMT, ARGS...) LOG(WHBLogWritef, FMT, ##ARGS) -#define DEBUG_FUNCTION_LINE_ERR(FMT, ARGS...) LOG_EX_DEFAULT(WHBLogPrintf, "##ERROR## ", "", FMT, ##ARGS) -#define DEBUG_FUNCTION_LINE_WARN(FMT, ARGS...) LOG_EX_DEFAULT(WHBLogPrintf, "## WARN## ", "", FMT, ##ARGS) +#define DEBUG_FUNCTION_LINE_ERR(FMT, ARGS...) LOG_EX_DEFAULT(WHBLogPrintf, CONSOLE_COLOR_RED, "## ERROR## ", CONSOLE_COLOR_RESET, FMT, ##ARGS) +#define DEBUG_FUNCTION_LINE_WARN(FMT, ARGS...) LOG_EX_DEFAULT(WHBLogPrintf, CONSOLE_COLOR_YELLOW, "##WARN ## ", CONSOLE_COLOR_RESET, FMT, ##ARGS) +#define DEBUG_FUNCTION_LINE_INFO(FMT, ARGS...) LOG_EX_DEFAULT(WHBLogPrintf, CONSOLE_COLOR_CYAN, "##INFO ## ", CONSOLE_COLOR_RESET, FMT, ##ARGS) -#define DEBUG_FUNCTION_LINE_ERR_LAMBDA(FILENAME, FUNCTION, LINE, FMT, ARGS...) LOG_EX(FILENAME, FUNCTION, LINE, WHBLogPrintf, "##ERROR## ", "", FMT, ##ARGS); +#define DEBUG_FUNCTION_LINE_ERR_LAMBDA(FILENAME, FUNCTION, LINE, FMT, ARGS...) LOG_EX(FILENAME, FUNCTION, LINE, WHBLogPrintf, CONSOLE_COLOR_RED, "##ERROR## ", CONSOLE_COLOR_RESET, FMT, ##ARGS); #else @@ -52,10 +58,11 @@ extern "C" { #define DEBUG_FUNCTION_LINE_WRITE(FMT, ARGS...) while (0) -#define DEBUG_FUNCTION_LINE_ERR(FMT, ARGS...) LOG_EX_DEFAULT(OSReport, "##ERROR## ", "\n", FMT, ##ARGS) -#define DEBUG_FUNCTION_LINE_WARN(FMT, ARGS...) LOG_EX_DEFAULT(OSReport, "## WARN## ", "\n", FMT, ##ARGS) +#define DEBUG_FUNCTION_LINE_ERR(FMT, ARGS...) LOG_EX_DEFAULT(OSReport, CONSOLE_COLOR_RED, "##ERROR## ", CONSOLE_COLOR_RESET "\n", FMT, ##ARGS) +#define DEBUG_FUNCTION_LINE_WARN(FMT, ARGS...) LOG_EX_DEFAULT(OSReport, CONSOLE_COLOR_YELLOW, "##WARN ## ", CONSOLE_COLOR_RESET "\n", FMT, ##ARGS) +#define DEBUG_FUNCTION_LINE_INFO(FMT, ARGS...) LOG_EX_DEFAULT(OSReport, CONSOLE_COLOR_CYAN, "##INFO ## ", CONSOLE_COLOR_RESET "\n", FMT, ##ARGS) -#define DEBUG_FUNCTION_LINE_ERR_LAMBDA(FILENAME, FUNCTION, LINE, FMT, ARGS...) LOG_EX(FILENAME, FUNCTION, LINE, OSReport, "##ERROR## ", "\n", FMT, ##ARGS); +#define DEBUG_FUNCTION_LINE_ERR_LAMBDA(FILENAME, FUNCTION, LINE, FMT, ARGS...) LOG_EX(FILENAME, FUNCTION, LINE, OSReport, CONSOLE_COLOR_RED, "##ERROR## ", CONSOLE_COLOR_RESET "\n", FMT, ##ARGS); #endif From d40c1924c38fabe2ba46d26e0fe0a7fe05722849 Mon Sep 17 00:00:00 2001 From: Maschell Date: Sat, 18 Apr 2026 19:38:32 +0200 Subject: [PATCH 8/9] Update Dockerfile --- Dockerfile | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Dockerfile b/Dockerfile index 69c5358..7cdb418 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,7 @@ -FROM ghcr.io/wiiu-env/devkitppc:20260204 +FROM ghcr.io/wiiu-env/devkitppc:20260225 -COPY --from=ghcr.io/wiiu-env/libkernel:20260208 /artifacts $DEVKITPRO -COPY --from=ghcr.io/wiiu-env/libfunctionpatcher:20260208 /artifacts $DEVKITPRO -COPY --from=ghcr.io/wiiu-env/wiiumodulesystem:20260126 /artifacts $DEVKITPRO +COPY --from=ghcr.io/wiiu-env/libkernel:20260331 /artifacts $DEVKITPRO +COPY --from=ghcr.io/wiiu-env/libfunctionpatcher:20260331 /artifacts $DEVKITPRO +COPY --from=ghcr.io/wiiu-env/wiiumodulesystem:20260418 /artifacts $DEVKITPRO WORKDIR /project From d4eb0923e42761cfbed378f918014c8624014da5 Mon Sep 17 00:00:00 2001 From: Maschell Date: Sat, 18 Apr 2026 19:39:13 +0200 Subject: [PATCH 9/9] Bump Version --- source/utils/globals.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/utils/globals.h b/source/utils/globals.h index 94135c9..fe584a6 100644 --- a/source/utils/globals.h +++ b/source/utils/globals.h @@ -6,7 +6,7 @@ #include #include -#define MODULE_VERSION "v0.2.3" +#define MODULE_VERSION "v0.2.4" #define MODULE_VERSION_FULL MODULE_VERSION MODULE_VERSION_EXTRA #define JUMP_HEAP_DATA_SIZE (32 * 1024)