- 论坛徽章:
- 0
|
本帖最后由 Godbach 于 2010-08-30 11:45 编辑
unsigned long
get_syscall_table_x86_64(void)
{
#define OFFSET_SYSCALL 256
unsigned long syscall_entry;
char sc_asm[OFFSET_SYSCALL];
char *p;
#ifndef CONFIG_XEN
syscall_entry = get_syscall_from_hw(ARCH_X86_64);
#else
if (!is_running_on_xen())
syscall_entry = get_syscall_from_hw(ARCH_X86_64);
else if ((is_initial_xendomain()))
syscall_entry = get_syscall_from_xen(ARCH_X86_64);
else
syscall_entry = get_syscall_from_kallsyms(ARCH_X86_64);
#endif
if (unlikely(syscall_entry == 0)) {
printk("[%s] Could not find system_call entry\n",
__FUNCTION__);
return -ENOSYS;
}
memcpy(sc_asm, (void*)syscall_entry, OFFSET_SYSCALL);
p = (char *)memmem(sc_asm, OFFSET_SYSCALL, "\xff\x14\xc5", 3);
if (unlikely(!p)) {
printk("[%s] Could not to find system calls table\n",
__FUNCTION__);
return -ENOSYS;
}
return *(unsigned long*)(p + 3);
#undef OFFSET_SYSCALL
} |
|
评分
-
查看全部评分
|