static int x86_int_0x80 (RAnalEsil *esil, int interrupt) { int syscall; ut64 eax, ebx, ecx, edx; if (!esil || (interrupt != 0x80)) return false; r_anal_esil_reg_read (esil, "eax", &eax, NULL); r_anal_esil_reg_read (esil, "ebx", &ebx, NULL); r_anal_esil_reg_read (esil, "ecx", &ecx, NULL); r_anal_esil_reg_read (esil, "edx", &edx, NULL); syscall = (int) eax; switch (syscall) { case 3: { char *dst = calloc (1, (size_t)edx); (void)read ((ut32)ebx, dst, (size_t)edx); r_anal_esil_mem_write (esil, ecx, (ut8 *)dst, (int)edx); free (dst); return true; } case 4: { char *src = malloc ((size_t)edx); r_anal_esil_mem_read (esil, ecx, (ut8 *)src, (int)edx); write ((ut32)ebx, src, (size_t)edx); free (src); return true; } } eprintf ("syscall %d not implemented yet\n", syscall); return false; }
static int i8051_hook_reg_read(RAnalEsil *esil, const char *name, ut64 *res, int *size) { int ret = 0; ut64 val = 0LL; RI8051Reg *ri; RAnalEsilCallbacks cbs = esil->cb; if ((ri = i8051_reg_find (name))) { ut8 offset = i8051_reg_get_offset(esil, ri); ret = r_anal_esil_mem_read (esil, IRAM + offset, (ut8*)res, ri->num_bytes); } esil->cb = ocbs; if (!ret && ocbs.hook_reg_read) { ret = ocbs.hook_reg_read (esil, name, res, NULL); } if (!ret && ocbs.reg_read) { ret = ocbs.reg_read (esil, name, &val, NULL); } esil->cb = cbs; return ret; }