2020-05-17 13:14:19 +02:00
|
|
|
#include "utils/logger.h"
|
|
|
|
#include "utils/function_patcher.h"
|
2020-05-17 21:14:27 +02:00
|
|
|
#include "../../source/common/module_defines.h"
|
2020-05-17 13:14:19 +02:00
|
|
|
#include <malloc.h>
|
|
|
|
#include <coreinit/dynload.h>
|
|
|
|
|
2020-05-17 21:14:27 +02:00
|
|
|
#define gModuleData ((module_information_t *) (0x00880000))
|
|
|
|
|
2020-05-17 13:14:19 +02:00
|
|
|
DECL(OSDynLoad_Error, OSDynLoad_Acquire, char const *name, OSDynLoad_Module *outModule) {
|
2020-05-17 21:14:27 +02:00
|
|
|
OSDynLoad_Error result = real_OSDynLoad_Acquire(name, outModule);
|
|
|
|
if (result == OS_DYNLOAD_OK) {
|
|
|
|
return OS_DYNLOAD_OK;
|
|
|
|
}
|
|
|
|
DEBUG_FUNCTION_LINE("Looking for module %s\n", name);
|
|
|
|
for (uint32_t i = 0; i < MAXIMUM_MODULES; i++) {
|
|
|
|
if (strncmp(name, gModuleData->module_data[i].module_export_name, MAXIMUM_EXPORT_MODULE_NAME_LENGTH) == 0) {
|
|
|
|
*outModule = (OSDynLoad_Module) (0x13370000 + i);
|
|
|
|
return OS_DYNLOAD_OK;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return result;
|
2020-05-17 13:14:19 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
DECL(OSDynLoad_Error, OSDynLoad_FindExport, OSDynLoad_Module module, BOOL isData, char const *name, void **outAddr) {
|
2020-05-17 21:14:27 +02:00
|
|
|
//DEBUG_FUNCTION_LINE("%08X\n", module);
|
|
|
|
OSDynLoad_Error result = real_OSDynLoad_FindExport(module, isData, name, outAddr);
|
|
|
|
if (result == OS_DYNLOAD_OK) {
|
|
|
|
return OS_DYNLOAD_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
DEBUG_FUNCTION_LINE("Looking for %s in handle %d\n", name);
|
|
|
|
if (((uint32_t) module & 0xFFFF0000) == 0x13370000) {
|
|
|
|
uint32_t modulehandle = ((uint32_t) module) & 0x0000FFFF;
|
|
|
|
if (modulehandle > MAXIMUM_MODULES) {
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
export_data_t *exportEntries = gModuleData->module_data[modulehandle].export_entries;
|
|
|
|
for (uint32_t i = 0; i < EXPORT_ENTRY_LIST_LENGTH; i++) {
|
|
|
|
if (strncmp(name, exportEntries[i].name, EXPORT_MAXIMUM_NAME_LENGTH) == 0) {
|
|
|
|
if (isData && exportEntries[i].type != 1) {
|
|
|
|
return OS_DYNLOAD_INVALID_MODULE_NAME;
|
|
|
|
}
|
|
|
|
*outAddr = (void *) exportEntries[i].address;
|
|
|
|
DEBUG_FUNCTION_LINE("Set outAddr to %08X. It's from module %s function %s\n",
|
|
|
|
exportEntries[i].address,
|
|
|
|
gModuleData->module_data[modulehandle].module_export_name,
|
|
|
|
exportEntries[i].name);
|
|
|
|
return OS_DYNLOAD_OK;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return result;
|
2020-05-17 13:14:19 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
hooks_magic_t method_hooks_hooks_static[] __attribute__((section(".data"))) = {
|
2020-05-17 21:14:27 +02:00
|
|
|
MAKE_MAGIC(OSDynLoad_Acquire, LIB_CORE_INIT, STATIC_FUNCTION),
|
|
|
|
MAKE_MAGIC(OSDynLoad_FindExport, LIB_CORE_INIT, STATIC_FUNCTION)
|
2020-05-17 13:14:19 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
uint32_t method_hooks_size_hooks_static __attribute__((section(".data"))) = sizeof(method_hooks_hooks_static) / sizeof(hooks_magic_t);
|
|
|
|
|
|
|
|
//! buffer to store our instructions needed for our replacements
|
|
|
|
volatile uint32_t method_calls_hooks_static[sizeof(method_hooks_hooks_static) / sizeof(hooks_magic_t) * FUNCTION_PATCHER_METHOD_STORE_SIZE] __attribute__((section(".data")));
|
|
|
|
|