mirror of
https://github.com/wiiu-env/FunctionPatcherModule.git
synced 2025-01-08 16:10:49 +01:00
Update the malloc/free pointers used for threads to fix apps which use a custom heap
This commit is contained in:
parent
4569e407ae
commit
d602d17034
@ -4,13 +4,15 @@
|
|||||||
#include "utils/globals.h"
|
#include "utils/globals.h"
|
||||||
#include "utils/logger.h"
|
#include "utils/logger.h"
|
||||||
#include "utils/utils.h"
|
#include "utils/utils.h"
|
||||||
|
#include <coreinit/memdefaultheap.h>
|
||||||
#include <coreinit/memexpheap.h>
|
#include <coreinit/memexpheap.h>
|
||||||
#include <wums.h>
|
#include <wums.h>
|
||||||
|
|
||||||
WUMS_MODULE_EXPORT_NAME("homebrew_functionpatcher");
|
WUMS_MODULE_EXPORT_NAME("homebrew_functionpatcher");
|
||||||
WUMS_MODULE_INIT_BEFORE_RELOCATION_DONE_HOOK();
|
WUMS_MODULE_INIT_BEFORE_RELOCATION_DONE_HOOK();
|
||||||
|
|
||||||
WUMS_INITIALIZE() {
|
|
||||||
|
void UpdateFunctionPointer() {
|
||||||
// We need the real MEMAllocFromDefaultHeapEx/MEMFreeToDefaultHeap function pointer to force-allocate memory on the default heap.
|
// We need the real MEMAllocFromDefaultHeapEx/MEMFreeToDefaultHeap function pointer to force-allocate memory on the default heap.
|
||||||
// Our custom heap doesn't work (yet) for threads and causes an app panic.
|
// Our custom heap doesn't work (yet) for threads and causes an app panic.
|
||||||
OSDynLoad_Module coreinitModule;
|
OSDynLoad_Module coreinitModule;
|
||||||
@ -30,9 +32,14 @@ WUMS_INITIALIZE() {
|
|||||||
OSFatal("OSDynLoad_FindExport for MEMFreeToDefaultHeap");
|
OSFatal("OSDynLoad_FindExport for MEMFreeToDefaultHeap");
|
||||||
}
|
}
|
||||||
|
|
||||||
gRealMEMAllocFromDefaultHeapEx = (void *(*) (uint32_t, int) ) * allocPtr;
|
gMEMAllocFromDefaultHeapExForThreads = (void *(*) (uint32_t, int) ) * allocPtr;
|
||||||
gMEMFreeToDefaultHeap = (void (*)(void *)) * freePtr;
|
gMEMFreeToDefaultHeapForThreads = (void (*)(void *)) * freePtr;
|
||||||
|
|
||||||
OSDynLoad_Release(coreinitModule);
|
OSDynLoad_Release(coreinitModule);
|
||||||
|
}
|
||||||
|
|
||||||
|
WUMS_INITIALIZE() {
|
||||||
|
UpdateFunctionPointer();
|
||||||
|
|
||||||
memset(gJumpHeapData, 0, JUMP_HEAP_DATA_SIZE);
|
memset(gJumpHeapData, 0, JUMP_HEAP_DATA_SIZE);
|
||||||
gJumpHeapHandle = MEMCreateExpHeapEx((void *) (gJumpHeapData), JUMP_HEAP_DATA_SIZE, 1);
|
gJumpHeapHandle = MEMCreateExpHeapEx((void *) (gJumpHeapData), JUMP_HEAP_DATA_SIZE, 1);
|
||||||
@ -66,6 +73,10 @@ WUMS_APPLICATION_STARTS() {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Now we can update the pointer with the "real" functions
|
||||||
|
gMEMAllocFromDefaultHeapExForThreads = MEMAllocFromDefaultHeapEx;
|
||||||
|
gMEMFreeToDefaultHeapForThreads = MEMFreeToDefaultHeap;
|
||||||
|
|
||||||
initLogging();
|
initLogging();
|
||||||
|
|
||||||
std::lock_guard<std::mutex> lock(gPatchedFunctionsMutex);
|
std::lock_guard<std::mutex> lock(gPatchedFunctionsMutex);
|
||||||
|
@ -33,9 +33,9 @@ public:
|
|||||||
//! save attribute assignment
|
//! save attribute assignment
|
||||||
iAttributes = iAttr;
|
iAttributes = iAttr;
|
||||||
//! allocate the thread on the default Cafe OS heap
|
//! allocate the thread on the default Cafe OS heap
|
||||||
pThread = (OSThread *) gRealMEMAllocFromDefaultHeapEx(sizeof(OSThread), 0x10);
|
pThread = (OSThread *) gMEMAllocFromDefaultHeapExForThreads(sizeof(OSThread), 0x10);
|
||||||
//! allocate the stack on the default Cafe OS heap
|
//! allocate the stack on the default Cafe OS heap
|
||||||
pThreadStack = (uint8_t *) gRealMEMAllocFromDefaultHeapEx(iStackSize, 0x20);
|
pThreadStack = (uint8_t *) gMEMAllocFromDefaultHeapExForThreads(iStackSize, 0x20);
|
||||||
//! create the thread
|
//! create the thread
|
||||||
if (pThread && pThreadStack) {
|
if (pThread && pThreadStack) {
|
||||||
// clang-format off
|
// clang-format off
|
||||||
@ -125,10 +125,10 @@ public:
|
|||||||
}
|
}
|
||||||
//! free the thread stack buffer
|
//! free the thread stack buffer
|
||||||
if (pThreadStack) {
|
if (pThreadStack) {
|
||||||
gMEMFreeToDefaultHeap(pThreadStack);
|
gMEMFreeToDefaultHeapForThreads(pThreadStack);
|
||||||
}
|
}
|
||||||
if (pThread) {
|
if (pThread) {
|
||||||
gMEMFreeToDefaultHeap(pThread);
|
gMEMFreeToDefaultHeapForThreads(pThread);
|
||||||
}
|
}
|
||||||
pThread = nullptr;
|
pThread = nullptr;
|
||||||
pThreadStack = nullptr;
|
pThreadStack = nullptr;
|
||||||
|
@ -7,5 +7,5 @@ std::shared_ptr<FunctionAddressProvider> gFunctionAddressProvider;
|
|||||||
std::mutex gPatchedFunctionsMutex;
|
std::mutex gPatchedFunctionsMutex;
|
||||||
std::vector<std::shared_ptr<PatchedFunctionData>> gPatchedFunctions;
|
std::vector<std::shared_ptr<PatchedFunctionData>> gPatchedFunctions;
|
||||||
|
|
||||||
void *(*gRealMEMAllocFromDefaultHeapEx)(uint32_t size, int align);
|
void *(*gMEMAllocFromDefaultHeapExForThreads)(uint32_t size, int align);
|
||||||
void (*gMEMFreeToDefaultHeap)(void *ptr);
|
void (*gMEMFreeToDefaultHeapForThreads)(void *ptr);
|
@ -12,5 +12,5 @@ extern std::shared_ptr<FunctionAddressProvider> gFunctionAddressProvider;
|
|||||||
extern std::mutex gPatchedFunctionsMutex;
|
extern std::mutex gPatchedFunctionsMutex;
|
||||||
extern std::vector<std::shared_ptr<PatchedFunctionData>> gPatchedFunctions;
|
extern std::vector<std::shared_ptr<PatchedFunctionData>> gPatchedFunctions;
|
||||||
|
|
||||||
extern void *(*gRealMEMAllocFromDefaultHeapEx)(uint32_t size, int align);
|
extern void *(*gMEMAllocFromDefaultHeapExForThreads)(uint32_t size, int align);
|
||||||
extern void (*gMEMFreeToDefaultHeap)(void *ptr);
|
extern void (*gMEMFreeToDefaultHeapForThreads)(void *ptr);
|
Loading…
Reference in New Issue
Block a user