#ifndef SUBSTRATE_H_
#define SUBSTRATE_H_
#include <stddef.h>
#include <stdint.h>
#include <stdbool.h>
#ifdef __cplusplus
extern "C" {
#endif
typedef const void *MSImageRef;
extern bool MSDebug;
void MSHookFunction(void *symbol, void *replace, void **result);
void A64HookFunction(void *symbol, void *replace, void **result);
void *MSFindSymbol(MSImageRef image, const char *name);
MSImageRef MSGetImageByName(const char *file);
bool MSHookProcess(int pid, const char *library);
uintptr_t findLibrary(const char *library);
uintptr_t getAbsoluteAddress(const char *library, uintptr_t offset);
bool isLibraryLoaded(const char *library);
uintptr_t string2Offset(const char *str);
void hook(void *offset, void *ptr, void **orig);
#ifdef __cplusplus
}
#endif
#ifdef __cplusplus
#define HOOK(lib, offset, ptr, orig) \
hook((void*)getAbsoluteAddress(lib, string2Offset(offset)), (void*)ptr, (void**)&orig)
#define HOOK_NO_ORIG(lib, offset, ptr) \
hook((void*)getAbsoluteAddress(lib, string2Offset(offset)), (void*)ptr, NULL)
#endif
#endif