2013-04-10 4 views
2

Я сделал kext для использования своего системного вызова вместо существующего системного вызова по ссылке Re-routing System Calls.Способ получения pid процесса, который вызывает системный вызов?

Во время теста мне интересно, какой процесс вызывает этот системный вызов.

Мне нужно разрешить приложениям продолжать нормально, за исключением указанного процесса.

Есть ли что-нибудь, что может получить информацию о процессе вызова?

ответ

2

Если вы посмотрите на исходный код для 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.

+0

В этом случае вы могли бы просто вызвать ['proc_selfpid()'] (http://fxr.watson.org/fxr/ident?v=xnu-2050.18.24;im=bigexcerpts;i=proc_selfpid). – Hasturkun

+0

На практике вы правы. Теоретически вызывающий может, по-видимому, передавать другой процесс через аргумент, если функция вызывалась напрямую, а не в результате системного вызова из пользовательского процесса. – bdash

Смежные вопросы