SUBHOOK_EXPORT int SUBHOOK_API subhook_install(subhook_t hook) { intptr_t offset; if (hook->installed) return -EINVAL; if (!hook->unlocked) { subhook_unprotect(hook->src, sizeof(jmp_instr)); hook->unlocked = 1; } memcpy(((struct subhook_x86 *)hook)->code, hook->src, sizeof(jmp_instr)); memcpy(hook->src, &jmp_instr, sizeof(jmp_instr)); offset = (intptr_t)hook->dst - ((intptr_t)hook->src + sizeof(jmp_instr)); memcpy((void *)((intptr_t)hook->src + sizeof(jmp_opcode)), &offset, sizeof(jmp_instr) - sizeof(jmp_opcode)); hook->installed = 1; return 0; }
SUBHOOK_EXPORT int SUBHOOK_API subhook_install(subhook_t hook) { void *src; void *dst; intptr_t offset; if (hook->installed) return -EINVAL; src = hook->src; dst = hook->dst; subhook_unprotect(src, sizeof(jmp_instr)); memcpy(((struct subhook_x86 *)hook)->code, src, sizeof(jmp_instr)); memcpy(src, &jmp_instr, sizeof(jmp_instr)); offset = (intptr_t)dst - ((intptr_t)src + sizeof(jmp_instr)); memcpy((void *)((intptr_t)src + sizeof(jmp_opcode)), &offset, sizeof(jmp_instr) - sizeof(jmp_opcode)); hook->installed = 1; return 0; }