mirror of
https://github.com/Garhoogin/RuntimeCodeModules.git
synced 2025-06-19 17:05:34 -04:00
95 lines
3.4 KiB
C
95 lines
3.4 KiB
C
#pragma once
|
|
|
|
#ifdef SDK_ARM9
|
|
# include <nitro.h>
|
|
#else
|
|
# include <nds.h>
|
|
#endif
|
|
|
|
#define R_ARM_ABS32 2
|
|
#define R_ARM_CALL 28
|
|
#define R_ARM_JUMP24 29
|
|
#define R_ARM_BASE_ABS 31
|
|
|
|
#define R_TYPE_MASK 0x7F
|
|
#define R_ZERO_VALUE 0x80
|
|
|
|
#define HOOK_TYPE_AREPL 0 //ARM branch-and-link replacement
|
|
#define HOOK_TYPE_ANSUB 1 //ARM branch replacement
|
|
#define HOOK_TYPE_TREPL 2 //thumb branch-link-exchange replacement
|
|
#define HOOK_TYPE_DATA32 3 //word replacement
|
|
#define HOOK_TYPE_DATA16 4 //halfword replacement
|
|
#define HOOK_TYPE_LOAD 5 //called on load
|
|
#define HOOK_TYPE_UNLOAD 6 //called on unload
|
|
#define HOOK_TYPE_DATA8 7 //single byte replacement
|
|
|
|
#define HOOK_SHIFT 28
|
|
#define HOOK_MASK 0x70000000
|
|
#define ADDRESS_SHIFT 0
|
|
#define ADDRESS_MASK 0x0FFFFFFF
|
|
#define AUX_SHIFT 31
|
|
#define AUX_MASK 0x80000000
|
|
|
|
typedef struct HOOK_TABLE_ENTRY_ {
|
|
u32 branchSrcAddr : 28; //memory location of patch source
|
|
u32 type : 3; //type of patch
|
|
u32 aux : 1; //is followed by auxiliary entry
|
|
union {
|
|
struct {
|
|
u16 oldDataHw0; //first halfword of old data
|
|
u16 oldDataHw1; //second halfword of old data
|
|
};
|
|
u8 oldData[4];
|
|
struct {
|
|
u16 newDataHw0; //first halfword of new data
|
|
u16 newDataHw1; //second halfword of new data
|
|
};
|
|
u8 newData[4];
|
|
u32 branchDestAddr; //destination address of branch (relative to image base)
|
|
};
|
|
} HOOK_TABLE_ENTRY;
|
|
|
|
typedef struct RELOCATION_ENTRY_ {
|
|
u32 offset : 24; //offset of relocation
|
|
u32 type : 8; //type of relocation
|
|
u32 value; //value of relocation (optional)
|
|
} RELOCATION_ENTRY;
|
|
|
|
typedef struct RCM_HEADER_ {
|
|
u16 nHook; //number of hooks
|
|
u16 relocated; //set to 1 after relocations process
|
|
u16 relocOffset; //offset to relocation table
|
|
u16 relocSize; //size of relocations
|
|
HOOK_TABLE_ENTRY hookTable[0];
|
|
} RCM_HEADER;
|
|
|
|
//
|
|
//callback typedefs
|
|
//
|
|
typedef void (*RCM_LOAD_CALLBACK) (u32 imageBase);
|
|
typedef void (*RCM_UNLOAD_CALLBACK) (u32 imageBase);
|
|
|
|
|
|
#define HOOK_DATA8(addr,b) ((void *) ((HOOK_TYPE_DATA8 << HOOK_SHIFT) + (u32) (addr))), (void *) b
|
|
#define HOOK_DATA16(addr,hw) ((void *) ((HOOK_TYPE_DATA16 << HOOK_SHIFT) + (u32) (addr))), (void *) hw
|
|
#define HOOK_DATA32(addr,w) ((void *) ((HOOK_TYPE_DATA32 << HOOK_SHIFT) + (u32) (addr))), (void *) w
|
|
#define HOOK_LOAD(dest) ((void *) ((HOOK_TYPE_LOAD << HOOK_SHIFT))), (void *) dest
|
|
#define HOOK_UNLOAD(dest) ((void *) ((HOOK_TYPE_UNLOAD << HOOK_SHIFT))), (void *) dest
|
|
#define HOOK_AREPL(addr,dest) ((void *) ((HOOK_TYPE_AREPL << HOOK_SHIFT) + (u32) (addr))), (void *) dest
|
|
#define HOOK_ANSUB(addr,dest) ((void *) ((HOOK_TYPE_ANSUB << HOOK_SHIFT) + (u32) (addr))), (void *) dest
|
|
#define HOOK_TREPL(addr,dest) ((void *) ((HOOK_TYPE_TREPL << HOOK_SHIFT) + (u32) (addr))), (void *) dest
|
|
#define HOOK_TNSUB(addr,dest) HOOK_DATA16(addr, 0xB500), HOOK_TREPL(((u32) (addr)) + 2, dest), HOOK_DATA16(((u32) (addr)) + 6, 0xBD00)
|
|
|
|
//NCP-like synonyms
|
|
#define HOOK_JUMP_AA HOOK_ANSUB
|
|
#define HOOK_JUMP_TA HOOK_TNSUB
|
|
#define HOOK_JUMP HOOK_ANSUB
|
|
#define HOOK_REPL_AA HOOK_AREPL
|
|
#define HOOK_REPL_TA HOOK_TREPL
|
|
#define HOOK_REPL HOOK_AREPL
|
|
#define HOOK_SET8 HOOK_DATA8
|
|
#define HOOK_SET16 HOOK_DATA16
|
|
#define HOOK_SET32 HOOK_DATA32
|
|
|
|
#define HOOK_TABLE(...) static volatile void *__attribute__((section(".ftbl"))) __attribute__((__used__)) __ftbl[] = {__VA_ARGS__}
|