Macos 从kext订阅新流程创建并获取此流程的pid

Macos 从kext订阅新流程创建并获取此流程的pid,macos,kernel,kernel-extension,mach,Macos,Kernel,Kernel Extension,Mach,我正在尝试在我的kext中获取有关新创建进程的通知。据我所知,我已订阅KAUTH_FILEOP_EXEC 但出于某种奇怪的原因,我只有两个参数可用-vnode和file name() 这个进程应该已经在那个时候创建了,并且有一个pid,但是内核并没有给我这个pid 此时是否可以获取pid 是否有其他方法从kext订阅新流程创建并获取此流程的pid?是的,您肯定可以从文件范围获取pid:- #include <sys/proc.h> proc_t self = proc_self()

我正在尝试在我的kext中获取有关新创建进程的通知。据我所知,我已订阅KAUTH_FILEOP_EXEC

但出于某种奇怪的原因,我只有两个参数可用-vnode和file name()

这个进程应该已经在那个时候创建了,并且有一个pid,但是内核并没有给我这个pid

此时是否可以获取pid


是否有其他方法从kext订阅新流程创建并获取此流程的pid?

是的,您肯定可以从文件范围获取pid:-

#include <sys/proc.h>

proc_t self = proc_self();
int pid = proc_pid(self);

// ensure you release the reference to self
proc_rele(self);
#包括
proc_t self=proc_self();
int pid=过程pid(自身);
//确保释放对self的引用
proc_rele(self);

这是创建流程的流程pid,而不是新流程pid@GeorgyBuranov,对不起,这对我有用。我在当前项目中使用它,它返回启动过程的pid。@GeorgyBuranov注意,
KAUTH\u FILEOP\u EXEC
通知发生在成功选择新的可执行文件之后,但在该过程完全转换为新的可执行文件之前(它仍然以任何形式运行
fork()
ed)。因此,如果您检查
proc\t
对象,在某些方面它肯定仍然与旧的可执行文件相对应,但它肯定是新的进程。有关详细信息,请参见xnu源代码(grep代表KAUTH_FILEOP_EXEC并从那里开始),奇怪的是,
current_task()
返回父进程的马赫任务,而
proc_self()
是子进程的马赫任务。