mirror of
https://github.com/geode-sdk/geode.git
synced 2024-12-14 18:11:15 -05:00
38 lines
1.2 KiB
C++
38 lines
1.2 KiB
C++
|
#include "dobby_internal.h"
|
||
|
|
||
|
#include "InterceptRouting/InterceptRouting.h"
|
||
|
#include "InterceptRouting/Routing/DynamicBinaryInstrument/dynamic-binary-instrument.h"
|
||
|
|
||
|
PUBLIC int DobbyInstrument(void *address, DBICallTy handler) {
|
||
|
if (!address) {
|
||
|
ERROR_LOG("the function address is 0x0.\n");
|
||
|
return RS_FAILED;
|
||
|
}
|
||
|
|
||
|
RAW_LOG(1, "\n\n");
|
||
|
DLOG(0, "[DobbyInstrument] Initialize at %p", address);
|
||
|
|
||
|
// check if we already instruemnt
|
||
|
HookEntry *entry = Interceptor::SharedInstance()->FindHookEntry(address);
|
||
|
if (entry) {
|
||
|
DynamicBinaryInstrumentRouting *route = (DynamicBinaryInstrumentRouting *)entry->route;
|
||
|
if (route->handler == handler) {
|
||
|
ERROR_LOG("instruction %s already been instrumented.", address);
|
||
|
return RS_FAILED;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
entry = new HookEntry();
|
||
|
entry->id = Interceptor::SharedInstance()->GetHookEntryCount();
|
||
|
entry->type = kDynamicBinaryInstrument;
|
||
|
entry->instruction_address = address;
|
||
|
|
||
|
DynamicBinaryInstrumentRouting *route = new DynamicBinaryInstrumentRouting(entry, (void *)handler);
|
||
|
route->Prepare();
|
||
|
route->DispatchRouting();
|
||
|
Interceptor::SharedInstance()->AddHookEntry(entry);
|
||
|
route->Commit();
|
||
|
|
||
|
return RS_SUCCESS;
|
||
|
}
|