geode/loader/dobby/source/InterceptRouting/Routing/FunctionInlineReplace/FunctionInlineReplaceExport.cc

43 lines
1.3 KiB
C++
Raw Normal View History

2022-07-30 12:24:03 -04:00
#include "dobby_internal.h"
#include "Interceptor.h"
#include "InterceptRouting/InterceptRouting.h"
#include "InterceptRouting/Routing/FunctionInlineReplace/function-inline-replace.h"
PUBLIC int DobbyHook(void *address, void *replace_call, void **origin_call) {
if (!address) {
ERROR_LOG("function address is 0x0");
return RS_FAILED;
}
DLOG(0, "[DobbyHook] Initialize at %p", address);
// check if already hooked
HookEntry *entry = Interceptor::SharedInstance()->FindHookEntry(address);
if (entry) {
FunctionInlineReplaceRouting *route = (FunctionInlineReplaceRouting *)entry->route;
if (route->GetTrampolineTarget() == replace_call) {
ERROR_LOG("function %p already been hooked.", address);
return RS_FAILED;
}
}
entry = new HookEntry();
entry->id = Interceptor::SharedInstance()->GetHookEntryCount();
entry->type = kFunctionInlineHook;
entry->function_address = address;
FunctionInlineReplaceRouting *route = new FunctionInlineReplaceRouting(entry, replace_call);
route->Prepare();
route->DispatchRouting();
Interceptor::SharedInstance()->AddHookEntry(entry);
// set origin call with relocated function
*origin_call = entry->relocated_origin_function;
// code patch & hijack original control flow entry
route->Commit();
return RS_SUCCESS;
}