mirror of
https://github.com/wiiu-env/WiiUPluginLoaderBackend.git
synced 2024-11-25 22:24:16 +01:00
Reduce logging
This commit is contained in:
parent
75735e4e4d
commit
189af02743
@ -65,7 +65,7 @@ bool PluginManagement::doRelocation(const std::vector<RelocationData> &relocData
|
|||||||
|
|
||||||
void PluginManagement::doRelocations(const std::vector<PluginContainer> &plugins, relocation_trampolin_entry_t *trampData, uint32_t tramp_size) {
|
void PluginManagement::doRelocations(const std::vector<PluginContainer> &plugins, relocation_trampolin_entry_t *trampData, uint32_t tramp_size) {
|
||||||
for (auto &pluginContainer : plugins) {
|
for (auto &pluginContainer : plugins) {
|
||||||
DEBUG_FUNCTION_LINE("Doing relocations for plugin: %s", pluginContainer.getMetaInformation().getName().c_str());
|
DEBUG_FUNCTION_LINE_VERBOSE("Doing relocations for plugin: %s", pluginContainer.getMetaInformation().getName().c_str());
|
||||||
|
|
||||||
if (!PluginManagement::doRelocation(pluginContainer.getPluginInformation().getRelocationDataList(), trampData, tramp_size, pluginContainer.getPluginInformation().getTrampolinId())) {
|
if (!PluginManagement::doRelocation(pluginContainer.getPluginInformation().getRelocationDataList(), trampData, tramp_size, pluginContainer.getPluginInformation().getTrampolinId())) {
|
||||||
DEBUG_FUNCTION_LINE("Relocation failed");
|
DEBUG_FUNCTION_LINE("Relocation failed");
|
||||||
@ -77,12 +77,12 @@ void PluginManagement::memsetBSS(const std::vector<PluginContainer> &plugins) {
|
|||||||
for (auto &pluginContainer : plugins) {
|
for (auto &pluginContainer : plugins) {
|
||||||
auto sbssSection = pluginContainer.getPluginInformation().getSectionInfo(".sbss");
|
auto sbssSection = pluginContainer.getPluginInformation().getSectionInfo(".sbss");
|
||||||
if (sbssSection) {
|
if (sbssSection) {
|
||||||
DEBUG_FUNCTION_LINE("memset .sbss %08X (%d)", sbssSection->getAddress(), sbssSection->getSize());
|
DEBUG_FUNCTION_LINE_VERBOSE("memset .sbss %08X (%d)", sbssSection->getAddress(), sbssSection->getSize());
|
||||||
memset((void *) sbssSection->getAddress(), 0, sbssSection->getSize());
|
memset((void *) sbssSection->getAddress(), 0, sbssSection->getSize());
|
||||||
}
|
}
|
||||||
auto bssSection = pluginContainer.getPluginInformation().getSectionInfo(".bss");
|
auto bssSection = pluginContainer.getPluginInformation().getSectionInfo(".bss");
|
||||||
if (bssSection) {
|
if (bssSection) {
|
||||||
DEBUG_FUNCTION_LINE("memset .bss %08X (%d)", bssSection->getAddress(), bssSection->getSize());
|
DEBUG_FUNCTION_LINE_VERBOSE("memset .bss %08X (%d)", bssSection->getAddress(), bssSection->getSize());
|
||||||
memset((void *) bssSection->getAddress(), 0, bssSection->getSize());
|
memset((void *) bssSection->getAddress(), 0, bssSection->getSize());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -98,7 +98,7 @@ void PluginManagement::callDeinitHooks(plugin_information_t *pluginInformation)
|
|||||||
CallHook(pluginInformation, WUPS_LOADER_HOOK_FINI_WUT_NEWLIB);
|
CallHook(pluginInformation, WUPS_LOADER_HOOK_FINI_WUT_NEWLIB);
|
||||||
CallHook(pluginInformation, WUPS_LOADER_HOOK_FINI_WUT_MALLOC);
|
CallHook(pluginInformation, WUPS_LOADER_HOOK_FINI_WUT_MALLOC);
|
||||||
|
|
||||||
DEBUG_FUNCTION_LINE("Done calling deinit hooks");
|
DEBUG_FUNCTION_LINE_VERBOSE("Done calling deinit hooks");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -118,10 +118,10 @@ void PluginManagement::unloadPlugins(plugin_information_t *gPluginInformation, M
|
|||||||
if (freePluginData) {
|
if (freePluginData) {
|
||||||
if (plugin->data.buffer != nullptr) {
|
if (plugin->data.buffer != nullptr) {
|
||||||
if (plugin->data.memoryType == eMemTypeMEM2) {
|
if (plugin->data.memoryType == eMemTypeMEM2) {
|
||||||
DEBUG_FUNCTION_LINE("Free plugin data buffer for %s [%08X]", plugin->meta.name, plugin->data.buffer);
|
DEBUG_FUNCTION_LINE_VERBOSE("Free plugin data buffer for %s [%08X]", plugin->meta.name, plugin->data.buffer);
|
||||||
free(plugin->data.buffer);
|
free(plugin->data.buffer);
|
||||||
} else if (plugin->data.memoryType == eMemTypeExpHeap) {
|
} else if (plugin->data.memoryType == eMemTypeExpHeap) {
|
||||||
DEBUG_FUNCTION_LINE("Free plugin data buffer for %s [%08X on heap %08X]", plugin->meta.name, plugin->data.buffer, plugin->data.heapHandle);
|
DEBUG_FUNCTION_LINE_VERBOSE("Free plugin data buffer for %s [%08X on heap %08X]", plugin->meta.name, plugin->data.buffer, plugin->data.heapHandle);
|
||||||
MEMFreeToExpHeap((MEMHeapHandle) plugin->data.heapHandle, plugin->data.buffer);
|
MEMFreeToExpHeap((MEMHeapHandle) plugin->data.heapHandle, plugin->data.buffer);
|
||||||
} else {
|
} else {
|
||||||
DEBUG_FUNCTION_LINE("########################");
|
DEBUG_FUNCTION_LINE("########################");
|
||||||
@ -136,11 +136,11 @@ void PluginManagement::unloadPlugins(plugin_information_t *gPluginInformation, M
|
|||||||
}
|
}
|
||||||
if (plugin->info.allocatedTextMemoryAddress != nullptr) {
|
if (plugin->info.allocatedTextMemoryAddress != nullptr) {
|
||||||
MEMFreeToExpHeap((MEMHeapHandle) pluginHeap, plugin->info.allocatedTextMemoryAddress);
|
MEMFreeToExpHeap((MEMHeapHandle) pluginHeap, plugin->info.allocatedTextMemoryAddress);
|
||||||
DEBUG_FUNCTION_LINE("Deleted allocated .text section for plugin %s [%08X]", plugin->meta.name, plugin->info.allocatedTextMemoryAddress);
|
DEBUG_FUNCTION_LINE_VERBOSE("Deleted allocated .text section for plugin %s [%08X]", plugin->meta.name, plugin->info.allocatedTextMemoryAddress);
|
||||||
}
|
}
|
||||||
if (plugin->info.allocatedDataMemoryAddress != nullptr) {
|
if (plugin->info.allocatedDataMemoryAddress != nullptr) {
|
||||||
MEMFreeToExpHeap((MEMHeapHandle) pluginHeap, plugin->info.allocatedDataMemoryAddress);
|
MEMFreeToExpHeap((MEMHeapHandle) pluginHeap, plugin->info.allocatedDataMemoryAddress);
|
||||||
DEBUG_FUNCTION_LINE("Deleted allocated .data section for plugin %s [%08X]", plugin->meta.name, plugin->info.allocatedDataMemoryAddress);
|
DEBUG_FUNCTION_LINE_VERBOSE("Deleted allocated .data section for plugin %s [%08X]", plugin->meta.name, plugin->info.allocatedDataMemoryAddress);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (auto &trampoline : gPluginInformation->trampolines) {
|
for (auto &trampoline : gPluginInformation->trampolines) {
|
||||||
@ -162,7 +162,7 @@ void PluginManagement::callInitHooks(plugin_information_t *pluginInformation) {
|
|||||||
CallHook(pluginInformation, WUPS_LOADER_HOOK_INIT_WUT_MALLOC);
|
CallHook(pluginInformation, WUPS_LOADER_HOOK_INIT_WUT_MALLOC);
|
||||||
CallHook(pluginInformation, WUPS_LOADER_HOOK_INIT_WUT_NEWLIB);
|
CallHook(pluginInformation, WUPS_LOADER_HOOK_INIT_WUT_NEWLIB);
|
||||||
CallHook(pluginInformation, WUPS_LOADER_HOOK_INIT_WUT_STDCPP);
|
CallHook(pluginInformation, WUPS_LOADER_HOOK_INIT_WUT_STDCPP);
|
||||||
DEBUG_FUNCTION_LINE("Done calling init hooks");
|
DEBUG_FUNCTION_LINE_VERBOSE("Done calling init hooks");
|
||||||
}
|
}
|
||||||
|
|
||||||
void module_callback(OSDynLoad_Module module,
|
void module_callback(OSDynLoad_Module module,
|
||||||
@ -178,7 +178,7 @@ void module_callback(OSDynLoad_Module module,
|
|||||||
}
|
}
|
||||||
|
|
||||||
void PluginManagement::PatchFunctionsAndCallHooks(plugin_information_t *gPluginInformation) {
|
void PluginManagement::PatchFunctionsAndCallHooks(plugin_information_t *gPluginInformation) {
|
||||||
DEBUG_FUNCTION_LINE("Patching functions");
|
DEBUG_FUNCTION_LINE_VERBOSE("Patching functions");
|
||||||
FunctionPatcherPatchFunction(method_hooks_hooks_static, method_hooks_size_hooks_static);
|
FunctionPatcherPatchFunction(method_hooks_hooks_static, method_hooks_size_hooks_static);
|
||||||
|
|
||||||
DCFlushRange((void *) 0x00800000, 0x00800000);
|
DCFlushRange((void *) 0x00800000, 0x00800000);
|
||||||
@ -197,7 +197,7 @@ std::vector<PluginContainer> PluginManagement::loadPlugins(const std::vector<Plu
|
|||||||
std::vector<PluginContainer> plugins;
|
std::vector<PluginContainer> plugins;
|
||||||
|
|
||||||
for (auto &pluginData : pluginList) {
|
for (auto &pluginData : pluginList) {
|
||||||
DEBUG_FUNCTION_LINE("Load meta information");
|
DEBUG_FUNCTION_LINE_VERBOSE("Load meta information");
|
||||||
auto metaInfo = PluginMetaInformationFactory::loadPlugin(pluginData);
|
auto metaInfo = PluginMetaInformationFactory::loadPlugin(pluginData);
|
||||||
if (metaInfo) {
|
if (metaInfo) {
|
||||||
PluginContainer container;
|
PluginContainer container;
|
||||||
|
@ -10,6 +10,3 @@ extern MEMHeapHandle pluginDataHeap;
|
|||||||
extern uint32_t gPluginDataHeapSize;
|
extern uint32_t gPluginDataHeapSize;
|
||||||
extern plugin_information_on_reload_t gLinkOnReload;
|
extern plugin_information_on_reload_t gLinkOnReload;
|
||||||
extern module_information_t *gModuleData;
|
extern module_information_t *gModuleData;
|
||||||
|
|
||||||
extern "C" void __init_wut();
|
|
||||||
extern "C" void __fini_wut();
|
|
@ -48,7 +48,7 @@ static const char **hook_names = (const char *[]) {
|
|||||||
|
|
||||||
void CallHookEx(plugin_information_t *pluginInformation, wups_loader_hook_type_t hook_type, int32_t plugin_index_needed) {
|
void CallHookEx(plugin_information_t *pluginInformation, wups_loader_hook_type_t hook_type, int32_t plugin_index_needed) {
|
||||||
if(hook_type != WUPS_LOADER_HOOK_VSYNC) {
|
if(hook_type != WUPS_LOADER_HOOK_VSYNC) {
|
||||||
DEBUG_FUNCTION_LINE("Calling hook of type %s [%d]", hook_names[hook_type], hook_type);
|
DEBUG_FUNCTION_LINE_VERBOSE("Calling hook of type %s [%d]", hook_names[hook_type], hook_type);
|
||||||
}
|
}
|
||||||
for (int32_t plugin_index = 0; plugin_index < pluginInformation->number_used_plugins; plugin_index++) {
|
for (int32_t plugin_index = 0; plugin_index < pluginInformation->number_used_plugins; plugin_index++) {
|
||||||
plugin_information_single_t *plugin_data = &pluginInformation->plugin_data[plugin_index];
|
plugin_information_single_t *plugin_data = &pluginInformation->plugin_data[plugin_index];
|
||||||
|
@ -46,12 +46,11 @@ WUMS_APPLICATION_STARTS() {
|
|||||||
}
|
}
|
||||||
bool initNeeded = false;
|
bool initNeeded = false;
|
||||||
if (pluginDataHeap == nullptr) {
|
if (pluginDataHeap == nullptr) {
|
||||||
DEBUG_FUNCTION_LINE("gModuleData = %08X", gModuleData);
|
DEBUG_FUNCTION_LINE_VERBOSE("gModuleData = %08X", gModuleData);
|
||||||
DCFlushRange((void *) gModuleData, sizeof(module_information_t));
|
DCFlushRange((void *) gModuleData, sizeof(module_information_t));
|
||||||
uint32_t endAddress = 0;
|
uint32_t endAddress = 0;
|
||||||
DEBUG_FUNCTION_LINE("Using %d modules", gModuleData->number_used_modules);
|
DEBUG_FUNCTION_LINE_VERBOSE("Using %d modules", gModuleData->number_used_modules);
|
||||||
for (int i = 0; i < gModuleData->number_used_modules; i++) {
|
for (int i = 0; i < gModuleData->number_used_modules; i++) {
|
||||||
DEBUG_FUNCTION_LINE("%08x", gModuleData->module_data[i].endAddress);
|
|
||||||
uint32_t curEndAddr = gModuleData->module_data[i].endAddress;
|
uint32_t curEndAddr = gModuleData->module_data[i].endAddress;
|
||||||
if (curEndAddr > endAddress) {
|
if (curEndAddr > endAddress) {
|
||||||
endAddress = curEndAddr;
|
endAddress = curEndAddr;
|
||||||
@ -70,7 +69,7 @@ WUMS_APPLICATION_STARTS() {
|
|||||||
|
|
||||||
if (pluginDataHeap != nullptr) {
|
if (pluginDataHeap != nullptr) {
|
||||||
if (gPluginInformation == nullptr) {
|
if (gPluginInformation == nullptr) {
|
||||||
DEBUG_FUNCTION_LINE("Allocate gPluginInformation on heap %08X (size: %d bytes)", pluginDataHeap, sizeof(plugin_information_t));
|
DEBUG_FUNCTION_LINE_VERBOSE("Allocate gPluginInformation on heap %08X (size: %d bytes)", pluginDataHeap, sizeof(plugin_information_t));
|
||||||
gPluginInformation = (plugin_information_t *) MEMAllocFromExpHeapEx(pluginDataHeap, sizeof(plugin_information_t), 4);
|
gPluginInformation = (plugin_information_t *) MEMAllocFromExpHeapEx(pluginDataHeap, sizeof(plugin_information_t), 4);
|
||||||
if (gPluginInformation == nullptr) {
|
if (gPluginInformation == nullptr) {
|
||||||
DEBUG_FUNCTION_LINE("Failed to allocate global plugin information");
|
DEBUG_FUNCTION_LINE("Failed to allocate global plugin information");
|
||||||
@ -86,7 +85,7 @@ WUMS_APPLICATION_STARTS() {
|
|||||||
|
|
||||||
for (auto &pluginContainer : plugins) {
|
for (auto &pluginContainer : plugins) {
|
||||||
for (const auto &kv : pluginContainer.getPluginInformation().getSectionInfoList()) {
|
for (const auto &kv : pluginContainer.getPluginInformation().getSectionInfoList()) {
|
||||||
DEBUG_FUNCTION_LINE("%s = %s %08X %d", kv.first.c_str(), kv.second.getName().c_str(), kv.second.getAddress(), kv.second.getSize());
|
DEBUG_FUNCTION_LINE_VERBOSE("%s = %s %08X %d", kv.first.c_str(), kv.second.getName().c_str(), kv.second.getAddress(), kv.second.getSize());
|
||||||
}
|
}
|
||||||
if (!PluginContainerPersistence::savePlugin(gPluginInformation, pluginContainer)) {
|
if (!PluginContainerPersistence::savePlugin(gPluginInformation, pluginContainer)) {
|
||||||
DEBUG_FUNCTION_LINE("Failed to save plugin");
|
DEBUG_FUNCTION_LINE("Failed to save plugin");
|
||||||
@ -116,10 +115,10 @@ WUMS_APPLICATION_STARTS() {
|
|||||||
DEBUG_FUNCTION_LINE("We need to delete the plugin data for plugin %s", plugin->meta.name);
|
DEBUG_FUNCTION_LINE("We need to delete the plugin data for plugin %s", plugin->meta.name);
|
||||||
if (plugin->data.buffer != nullptr) {
|
if (plugin->data.buffer != nullptr) {
|
||||||
if (plugin->data.memoryType == eMemTypeMEM2) {
|
if (plugin->data.memoryType == eMemTypeMEM2) {
|
||||||
DEBUG_FUNCTION_LINE("Free plugin data buffer for %s [%08X]", plugin->meta.name, plugin->data.buffer);
|
DEBUG_FUNCTION_LINE_VERBOSE("Free plugin data buffer for %s [%08X]", plugin->meta.name, plugin->data.buffer);
|
||||||
free(plugin->data.buffer);
|
free(plugin->data.buffer);
|
||||||
} else if (plugin->data.memoryType == eMemTypeExpHeap) {
|
} else if (plugin->data.memoryType == eMemTypeExpHeap) {
|
||||||
DEBUG_FUNCTION_LINE("Free plugin data buffer for %s [%08X on heap %08X]", plugin->meta.name, plugin->data.buffer, plugin->data.heapHandle);
|
DEBUG_FUNCTION_LINE_VERBOSE("Free plugin data buffer for %s [%08X on heap %08X]", plugin->meta.name, plugin->data.buffer, plugin->data.heapHandle);
|
||||||
MEMFreeToExpHeap((MEMHeapHandle) plugin->data.heapHandle, plugin->data.buffer);
|
MEMFreeToExpHeap((MEMHeapHandle) plugin->data.heapHandle, plugin->data.buffer);
|
||||||
} else {
|
} else {
|
||||||
DEBUG_FUNCTION_LINE("########################");
|
DEBUG_FUNCTION_LINE("########################");
|
||||||
|
@ -14,7 +14,6 @@ bool PluginContainerPersistence::savePlugin(plugin_information_t *pluginInformat
|
|||||||
int32_t plugin_count = pluginInformation->number_used_plugins;
|
int32_t plugin_count = pluginInformation->number_used_plugins;
|
||||||
|
|
||||||
auto pluginName = plugin.getMetaInformation().getName();
|
auto pluginName = plugin.getMetaInformation().getName();
|
||||||
//auto pluginPath = plugin.getMetaInformation().getPath();
|
|
||||||
|
|
||||||
if (plugin_count >= MAXIMUM_PLUGINS - 1) {
|
if (plugin_count >= MAXIMUM_PLUGINS - 1) {
|
||||||
DEBUG_FUNCTION_LINE("Maximum of %d plugins reached. %s won't be loaded!", MAXIMUM_PLUGINS, pluginName.c_str());
|
DEBUG_FUNCTION_LINE("Maximum of %d plugins reached. %s won't be loaded!", MAXIMUM_PLUGINS, pluginName.c_str());
|
||||||
@ -63,7 +62,6 @@ bool PluginContainerPersistence::savePlugin(plugin_information_t *pluginInformat
|
|||||||
|
|
||||||
auto pluginInfo = plugin.getPluginInformation();
|
auto pluginInfo = plugin.getPluginInformation();
|
||||||
|
|
||||||
|
|
||||||
// Relocation
|
// Relocation
|
||||||
std::vector<RelocationData> relocationData = pluginInfo.getRelocationDataList();
|
std::vector<RelocationData> relocationData = pluginInfo.getRelocationDataList();
|
||||||
for (auto &reloc : relocationData) {
|
for (auto &reloc : relocationData) {
|
||||||
@ -73,11 +71,9 @@ bool PluginContainerPersistence::savePlugin(plugin_information_t *pluginInformat
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
std::vector<FunctionData> function_data_list = pluginInfo.getFunctionDataList();
|
std::vector<FunctionData> function_data_list = pluginInfo.getFunctionDataList();
|
||||||
std::vector<HookData> hook_data_list = pluginInfo.getHookDataList();
|
std::vector<HookData> hook_data_list = pluginInfo.getHookDataList();
|
||||||
|
|
||||||
|
|
||||||
if (function_data_list.size() > MAXIMUM_FUNCTION_PER_PLUGIN) {
|
if (function_data_list.size() > MAXIMUM_FUNCTION_PER_PLUGIN) {
|
||||||
DEBUG_FUNCTION_LINE("Plugin %s would replace to many function (%d, maximum is %d). It won't be loaded.", pluginName.c_str(), function_data_list.size(), MAXIMUM_FUNCTION_PER_PLUGIN);
|
DEBUG_FUNCTION_LINE("Plugin %s would replace to many function (%d, maximum is %d). It won't be loaded.", pluginName.c_str(), function_data_list.size(), MAXIMUM_FUNCTION_PER_PLUGIN);
|
||||||
return false;
|
return false;
|
||||||
@ -101,7 +97,7 @@ bool PluginContainerPersistence::savePlugin(plugin_information_t *pluginInformat
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
DEBUG_FUNCTION_LINE("Adding function \"%s\" for plugin \"%s\"", curFunction.getName().c_str(), pluginName.c_str());
|
DEBUG_FUNCTION_LINE_VERBOSE("Adding function \"%s\" for plugin \"%s\"", curFunction.getName().c_str(), pluginName.c_str());
|
||||||
|
|
||||||
strncpy(function_data->function_name, curFunction.getName().c_str(), MAXIMUM_FUNCTION_NAME_LENGTH - 1);
|
strncpy(function_data->function_name, curFunction.getName().c_str(), MAXIMUM_FUNCTION_NAME_LENGTH - 1);
|
||||||
|
|
||||||
@ -121,7 +117,7 @@ bool PluginContainerPersistence::savePlugin(plugin_information_t *pluginInformat
|
|||||||
for (auto &curHook : pluginInfo.getHookDataList()) {
|
for (auto &curHook : pluginInfo.getHookDataList()) {
|
||||||
replacement_data_hook_t *hook_data = &plugin_data->info.hooks[i];
|
replacement_data_hook_t *hook_data = &plugin_data->info.hooks[i];
|
||||||
|
|
||||||
DEBUG_FUNCTION_LINE("Set hook for plugin \"%s\" of type %08X to target %08X", plugin_data->meta.name, curHook.getType(), (void *) curHook.getFunctionPointer());
|
DEBUG_FUNCTION_LINE_VERBOSE("Set hook for plugin \"%s\" of type %08X to target %08X", plugin_data->meta.name, curHook.getType(), (void *) curHook.getFunctionPointer());
|
||||||
|
|
||||||
hook_data->func_pointer = (void *) curHook.getFunctionPointer();
|
hook_data->func_pointer = (void *) curHook.getFunctionPointer();
|
||||||
hook_data->type = curHook.getType();
|
hook_data->type = curHook.getType();
|
||||||
@ -220,7 +216,7 @@ std::vector<PluginContainer> PluginContainerPersistence::loadPlugins(plugin_info
|
|||||||
if (sectionInfo->addr == 0 && sectionInfo->size == 0) {
|
if (sectionInfo->addr == 0 && sectionInfo->size == 0) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
DEBUG_FUNCTION_LINE("Add SectionInfo %s", sectionInfo->name);
|
DEBUG_FUNCTION_LINE_VERBOSE("Add SectionInfo %s", sectionInfo->name);
|
||||||
std::string name(sectionInfo->name);
|
std::string name(sectionInfo->name);
|
||||||
curPluginInformation.addSectionInfo(SectionInfo(name, sectionInfo->addr, sectionInfo->size));
|
curPluginInformation.addSectionInfo(SectionInfo(name, sectionInfo->addr, sectionInfo->size));
|
||||||
}
|
}
|
||||||
|
@ -43,18 +43,17 @@ PluginData::PluginData(const std::vector<uint8_t>& input, MEMHeapHandle heapHand
|
|||||||
default:
|
default:
|
||||||
case eMemTypeExpHeap:
|
case eMemTypeExpHeap:
|
||||||
data_copy = MEMAllocFromExpHeapEx(heapHandle, length, 4);
|
data_copy = MEMAllocFromExpHeapEx(heapHandle, length, 4);
|
||||||
DEBUG_FUNCTION_LINE("Allocated %d kb on ExpHeap", length / 1024);
|
DEBUG_FUNCTION_LINE_VERBOSE("Allocated %d kb on ExpHeap", length / 1024);
|
||||||
if (data_copy == nullptr) {
|
if (data_copy == nullptr) {
|
||||||
DEBUG_FUNCTION_LINE("Failed to allocate space on exp heap");
|
DEBUG_FUNCTION_LINE("Failed to allocate space on exp heap");
|
||||||
} else {
|
} else {
|
||||||
memcpy(data_copy, &input[0], length);
|
memcpy(data_copy, &input[0], length);
|
||||||
}
|
}
|
||||||
this->buffer = data_copy;
|
this->buffer = data_copy;
|
||||||
DEBUG_FUNCTION_LINE("copied data to exp heap");
|
|
||||||
break;
|
break;
|
||||||
case eMemTypeMEM2:
|
case eMemTypeMEM2:
|
||||||
data_copy = memalign(4, length);
|
data_copy = memalign(4, length);
|
||||||
DEBUG_FUNCTION_LINE("Allocated %d kb on default heap", length / 1024);
|
DEBUG_FUNCTION_LINE_VERBOSE("Allocated %d kb on default heap", length / 1024);
|
||||||
if (data_copy == nullptr) {
|
if (data_copy == nullptr) {
|
||||||
DEBUG_FUNCTION_LINE("Failed to allocate space on default heap");
|
DEBUG_FUNCTION_LINE("Failed to allocate space on default heap");
|
||||||
} else {
|
} else {
|
||||||
|
@ -50,7 +50,7 @@ std::vector<PluginData> PluginDataFactory::loadDir(const std::string &path, MEMH
|
|||||||
if ((stbuf.st_mode & S_IFMT) == S_IFDIR) { // Skip directories
|
if ((stbuf.st_mode & S_IFMT) == S_IFDIR) { // Skip directories
|
||||||
continue;
|
continue;
|
||||||
} else {
|
} else {
|
||||||
DEBUG_FUNCTION_LINE("Found file: %s", full_file_path.c_str());
|
DEBUG_FUNCTION_LINE("Loading plugin: %s", full_file_path.c_str());
|
||||||
auto pluginData = load(full_file_path, heapHandle);
|
auto pluginData = load(full_file_path, heapHandle);
|
||||||
if (pluginData) {
|
if (pluginData) {
|
||||||
result.push_back(pluginData.value());
|
result.push_back(pluginData.value());
|
||||||
@ -88,7 +88,7 @@ std::optional<PluginData> PluginDataFactory::load(const std::string &filename, M
|
|||||||
free(data);
|
free(data);
|
||||||
is.close();
|
is.close();
|
||||||
|
|
||||||
DEBUG_FUNCTION_LINE("Loaded file!");
|
DEBUG_FUNCTION_LINE_VERBOSE("Loaded file!");
|
||||||
|
|
||||||
return load(result, heapHandle);
|
return load(result, heapHandle);
|
||||||
}
|
}
|
||||||
|
@ -79,7 +79,7 @@ std::optional<PluginInformation> PluginInformationFactory::load(const PluginData
|
|||||||
|
|
||||||
return std::nullopt;
|
return std::nullopt;
|
||||||
}
|
}
|
||||||
DEBUG_FUNCTION_LINE("Allocated %d kb from ExpHeap", text_size / 1024);
|
DEBUG_FUNCTION_LINE_VERBOSE("Allocated %d kb from ExpHeap", text_size / 1024);
|
||||||
void *data_data = MEMAllocFromExpHeapEx(heapHandle, data_size, 0x1000);
|
void *data_data = MEMAllocFromExpHeapEx(heapHandle, data_size, 0x1000);
|
||||||
if (data_data == nullptr) {
|
if (data_data == nullptr) {
|
||||||
DEBUG_FUNCTION_LINE("Failed to alloc memory for the .data section (%d bytes)", data_size);
|
DEBUG_FUNCTION_LINE("Failed to alloc memory for the .data section (%d bytes)", data_size);
|
||||||
@ -87,7 +87,7 @@ std::optional<PluginInformation> PluginInformationFactory::load(const PluginData
|
|||||||
MEMFreeToExpHeap(heapHandle, text_data);
|
MEMFreeToExpHeap(heapHandle, text_data);
|
||||||
return std::nullopt;
|
return std::nullopt;
|
||||||
}
|
}
|
||||||
DEBUG_FUNCTION_LINE("Allocated %d kb from ExpHeap", data_size / 1024);
|
DEBUG_FUNCTION_LINE_VERBOSE("Allocated %d kb from ExpHeap", data_size / 1024);
|
||||||
|
|
||||||
uint32_t entrypoint = (uint32_t) text_data + (uint32_t) reader.get_entry() - 0x02000000;
|
uint32_t entrypoint = (uint32_t) text_data + (uint32_t) reader.get_entry() - 0x02000000;
|
||||||
|
|
||||||
@ -126,16 +126,16 @@ std::optional<PluginInformation> PluginInformationFactory::load(const PluginData
|
|||||||
const char *p = psec->get_data();
|
const char *p = psec->get_data();
|
||||||
|
|
||||||
if (psec->get_type() == SHT_NOBITS) {
|
if (psec->get_type() == SHT_NOBITS) {
|
||||||
DEBUG_FUNCTION_LINE("memset section %s %08X to 0 (%d bytes)", psec->get_name().c_str(), destination, sectionSize);
|
DEBUG_FUNCTION_LINE_VERBOSE("memset section %s %08X to 0 (%d bytes)", psec->get_name().c_str(), destination, sectionSize);
|
||||||
memset((void *) destination, 0, sectionSize);
|
memset((void *) destination, 0, sectionSize);
|
||||||
} else if (psec->get_type() == SHT_PROGBITS) {
|
} else if (psec->get_type() == SHT_PROGBITS) {
|
||||||
DEBUG_FUNCTION_LINE("Copy section %s %08X -> %08X (%d bytes)", psec->get_name().c_str(), p, destination, sectionSize);
|
DEBUG_FUNCTION_LINE_VERBOSE("Copy section %s %08X -> %08X (%d bytes)", psec->get_name().c_str(), p, destination, sectionSize);
|
||||||
memcpy((void *) destination, p, sectionSize);
|
memcpy((void *) destination, p, sectionSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string sectionName(psec->get_name());
|
std::string sectionName(psec->get_name());
|
||||||
pluginInfo.addSectionInfo(SectionInfo(sectionName, destination, sectionSize));
|
pluginInfo.addSectionInfo(SectionInfo(sectionName, destination, sectionSize));
|
||||||
DEBUG_FUNCTION_LINE("Saved %s section info. Location: %08X size: %08X", psec->get_name().c_str(), destination, sectionSize);
|
DEBUG_FUNCTION_LINE_VERBOSE("Saved %s section info. Location: %08X size: %08X", psec->get_name().c_str(), destination, sectionSize);
|
||||||
|
|
||||||
totalSize += sectionSize;
|
totalSize += sectionSize;
|
||||||
|
|
||||||
@ -147,7 +147,7 @@ std::optional<PluginInformation> PluginInformationFactory::load(const PluginData
|
|||||||
for (uint32_t i = 0; i < sec_num; ++i) {
|
for (uint32_t i = 0; i < sec_num; ++i) {
|
||||||
section *psec = reader.sections[i];
|
section *psec = reader.sections[i];
|
||||||
if ((psec->get_type() == SHT_PROGBITS || psec->get_type() == SHT_NOBITS) && (psec->get_flags() & SHF_ALLOC)) {
|
if ((psec->get_type() == SHT_PROGBITS || psec->get_type() == SHT_NOBITS) && (psec->get_flags() & SHF_ALLOC)) {
|
||||||
DEBUG_FUNCTION_LINE("Linking (%d)... %s at %08X", i, psec->get_name().c_str(), destinations[psec->get_index()]);
|
DEBUG_FUNCTION_LINE_VERBOSE("Linking (%d)... %s at %08X", i, psec->get_name().c_str(), destinations[psec->get_index()]);
|
||||||
|
|
||||||
if (!linkSection(reader, psec->get_index(), (uint32_t) destinations[psec->get_index()], (uint32_t) text_data, (uint32_t) data_data, trampolin_data, trampolin_data_length, trampolinId)) {
|
if (!linkSection(reader, psec->get_index(), (uint32_t) destinations[psec->get_index()], (uint32_t) text_data, (uint32_t) data_data, trampolin_data, trampolin_data_length, trampolinId)) {
|
||||||
DEBUG_FUNCTION_LINE("elfLink failed");
|
DEBUG_FUNCTION_LINE("elfLink failed");
|
||||||
@ -173,7 +173,7 @@ std::optional<PluginInformation> PluginInformationFactory::load(const PluginData
|
|||||||
|
|
||||||
pluginInfo.setTrampolinId(trampolinId);
|
pluginInfo.setTrampolinId(trampolinId);
|
||||||
|
|
||||||
DEBUG_FUNCTION_LINE("Saved entrypoint as %08X", entrypoint);
|
DEBUG_FUNCTION_LINE_VERBOSE("Saved entrypoint as %08X", entrypoint);
|
||||||
|
|
||||||
std::optional<SectionInfo> secInfo = pluginInfo.getSectionInfo(".wups.hooks");
|
std::optional<SectionInfo> secInfo = pluginInfo.getSectionInfo(".wups.hooks");
|
||||||
if (secInfo && secInfo->getSize() > 0) {
|
if (secInfo && secInfo->getSize() > 0) {
|
||||||
@ -182,7 +182,7 @@ std::optional<PluginInformation> PluginInformationFactory::load(const PluginData
|
|||||||
if (entries != nullptr) {
|
if (entries != nullptr) {
|
||||||
for (size_t j = 0; j < entries_count; j++) {
|
for (size_t j = 0; j < entries_count; j++) {
|
||||||
wups_loader_hook_t *hook = &entries[j];
|
wups_loader_hook_t *hook = &entries[j];
|
||||||
DEBUG_FUNCTION_LINE("Saving hook of plugin Type: %08X, target: %08X"/*,pluginData.getPluginInformation()->getName().c_str()*/, hook->type, (void *) hook->target);
|
DEBUG_FUNCTION_LINE_VERBOSE("Saving hook of plugin Type: %08X, target: %08X"/*,pluginData.getPluginInformation()->getName().c_str()*/, hook->type, (void *) hook->target);
|
||||||
HookData hook_data((void *) hook->target, hook->type);
|
HookData hook_data((void *) hook->target, hook->type);
|
||||||
pluginInfo.addHookData(hook_data);
|
pluginInfo.addHookData(hook_data);
|
||||||
}
|
}
|
||||||
@ -196,7 +196,7 @@ std::optional<PluginInformation> PluginInformationFactory::load(const PluginData
|
|||||||
if (entries != NULL) {
|
if (entries != NULL) {
|
||||||
for (size_t j = 0; j < entries_count; j++) {
|
for (size_t j = 0; j < entries_count; j++) {
|
||||||
wups_loader_entry_t *cur_function = &entries[j];
|
wups_loader_entry_t *cur_function = &entries[j];
|
||||||
DEBUG_FUNCTION_LINE("Saving function \"%s\" of plugin . PA:%08X VA:%08X Library: %08X, target: %08X, call_addr: %08X", cur_function->_function.name/*,pluginData.getPluginInformation()->getName().c_str()*/,
|
DEBUG_FUNCTION_LINE_VERBOSE("Saving function \"%s\" of plugin . PA:%08X VA:%08X Library: %08X, target: %08X, call_addr: %08X", cur_function->_function.name/*,pluginData.getPluginInformation()->getName().c_str()*/,
|
||||||
cur_function->_function.physical_address, cur_function->_function.virtual_address, cur_function->_function.library, cur_function->_function.target, (void *) cur_function->_function.call_addr);
|
cur_function->_function.physical_address, cur_function->_function.virtual_address, cur_function->_function.library, cur_function->_function.target, (void *) cur_function->_function.call_addr);
|
||||||
FunctionData function_data((void *) cur_function->_function.physical_address, (void *) cur_function->_function.virtual_address, cur_function->_function.name, (function_replacement_library_type_t) cur_function->_function.library,
|
FunctionData function_data((void *) cur_function->_function.physical_address, (void *) cur_function->_function.virtual_address, cur_function->_function.name, (function_replacement_library_type_t) cur_function->_function.library,
|
||||||
(void *) cur_function->_function.target, (void *) cur_function->_function.call_addr, (FunctionPatcherTargetProcess) cur_function->_function.targetProcess);
|
(void *) cur_function->_function.target, (void *) cur_function->_function.call_addr, (FunctionPatcherTargetProcess) cur_function->_function.targetProcess);
|
||||||
@ -229,7 +229,7 @@ std::vector<RelocationData> PluginInformationFactory::getImportRelocationData(co
|
|||||||
for (uint32_t i = 0; i < sec_num; ++i) {
|
for (uint32_t i = 0; i < sec_num; ++i) {
|
||||||
section *psec = reader.sections[i];
|
section *psec = reader.sections[i];
|
||||||
if (psec->get_type() == SHT_RELA || psec->get_type() == SHT_REL) {
|
if (psec->get_type() == SHT_RELA || psec->get_type() == SHT_REL) {
|
||||||
DEBUG_FUNCTION_LINE("Found relocation section %s", psec->get_name().c_str());
|
DEBUG_FUNCTION_LINE_VERBOSE("Found relocation section %s", psec->get_name().c_str());
|
||||||
relocation_section_accessor rel(reader, psec);
|
relocation_section_accessor rel(reader, psec);
|
||||||
for (uint32_t j = 0; j < (uint32_t) rel.get_entries_num(); ++j) {
|
for (uint32_t j = 0; j < (uint32_t) rel.get_entries_num(); ++j) {
|
||||||
Elf64_Addr offset;
|
Elf64_Addr offset;
|
||||||
@ -288,7 +288,7 @@ bool PluginInformationFactory::linkSection(const elfio &reader, uint32_t section
|
|||||||
for (uint32_t i = 0; i < sec_num; ++i) {
|
for (uint32_t i = 0; i < sec_num; ++i) {
|
||||||
section *psec = reader.sections[i];
|
section *psec = reader.sections[i];
|
||||||
if (psec->get_info() == section_index) {
|
if (psec->get_info() == section_index) {
|
||||||
DEBUG_FUNCTION_LINE("Found relocation section %s", psec->get_name().c_str());
|
DEBUG_FUNCTION_LINE_VERBOSE("Found relocation section %s", psec->get_name().c_str());
|
||||||
relocation_section_accessor rel(reader, psec);
|
relocation_section_accessor rel(reader, psec);
|
||||||
for (uint32_t j = 0; j < (uint32_t) rel.get_entries_num(); ++j) {
|
for (uint32_t j = 0; j < (uint32_t) rel.get_entries_num(); ++j) {
|
||||||
Elf64_Addr offset;
|
Elf64_Addr offset;
|
||||||
@ -344,10 +344,10 @@ bool PluginInformationFactory::linkSection(const elfio &reader, uint32_t section
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
DEBUG_FUNCTION_LINE("done");
|
DEBUG_FUNCTION_LINE_VERBOSE("done");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
DEBUG_FUNCTION_LINE("Failed to find relocation section");
|
DEBUG_FUNCTION_LINE_VERBOSE("Failed to find relocation section");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -13,6 +13,7 @@ extern "C" {
|
|||||||
OSFatal_printf("[%s]%s@L%04d: " FMT "",__FILENAME__,__FUNCTION__, __LINE__, ## ARGS); \
|
OSFatal_printf("[%s]%s@L%04d: " FMT "",__FILENAME__,__FUNCTION__, __LINE__, ## ARGS); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
|
#define DEBUG_FUNCTION_LINE_VERBOSE(FMT, ARGS...) while (0)
|
||||||
#define DEBUG_FUNCTION_LINE(FMT, ARGS...)do { \
|
#define DEBUG_FUNCTION_LINE(FMT, ARGS...)do { \
|
||||||
WHBLogPrintf("[%23s]%30s@L%04d: " FMT "",__FILENAME__,__FUNCTION__, __LINE__, ## ARGS); \
|
WHBLogPrintf("[%23s]%30s@L%04d: " FMT "",__FILENAME__,__FUNCTION__, __LINE__, ## ARGS); \
|
||||||
} while (0);
|
} while (0);
|
||||||
|
Loading…
Reference in New Issue
Block a user