2
我做了一个kext来使用我的系统调用,而不是现有的系统调用,参考 Re-routing System Calls。如何获得调用系统调用的进程的pid?
在测试过程中,我不知道哪个进程调用了这个系统调用。
我需要允许应用程序除了指定的进程正常继续。
有没有什么获取调用进程的信息?
我做了一个kext来使用我的系统调用,而不是现有的系统调用,参考 Re-routing System Calls。如何获得调用系统调用的进程的pid?
在测试过程中,我不知道哪个进程调用了这个系统调用。
我需要允许应用程序除了指定的进程正常继续。
有没有什么获取调用进程的信息?
如果你看看来源为regular implementation of the ptrace
system call,你可以看到它与struct proc
代表则传递中作为第一个参数调用过程的工作:
int
ptrace(struct proc *p, struct ptrace_args *uap, int32_t *retval)
{
// …
if (uap->req == PT_DENY_ATTACH) {
proc_lock(p);
if (ISSET(p->p_lflag, P_LTRACED)) {
proc_unlock(p);
KERNEL_DEBUG_CONSTANT(BSDDBG_CODE(DBG_BSD_PROC, BSD_PROC_FRCEXIT) | DBG_FUNC_NONE,
p->p_pid, W_EXITCODE(ENOTSUP, 0), 4, 0, 0);
exit1(p, W_EXITCODE(ENOTSUP, 0), retval);
/* drop funnel before we return */
thread_exception_return();
/* NOTREACHED */
}
SET(p->p_lflag, P_LNOATTACH);
proc_unlock(p);
return(0);
}
可以在<sys/proc.h>
使用的功能获取有关给定进程的信息,例如proc_pid
来查找pid。
在这种情况下,您可能只需调用['proc_selfpid()'](http://fxr.watson.org/fxr/ident?v=xnu-2050.18.24;im=bigexcerpts;i=proc_selfpid)。 – Hasturkun 2013-04-10 08:57:54
在实践中你是对的。理论上讲,如果函数是直接调用的,而不是来自用户进程的系统调用,调用者可能会通过参数传递不同的进程。 – bdash 2013-04-10 09:19:15