2

在 KEXT 中,我需要做一些处理,我会得到一个 proc_t 或只是一个 pid。如果我走 pid 路线,我会做一个 sysctl() 之类的。

不幸的是,我也做不到。proc_t 是未定义的, sysctl() 也不是。可以调用 sysctlbyname() 但未定义 kinfo_proc。如果我尝试使用 proc_t,编译器会抱怨 [struct proc] 的前向定义

我假设 sysctl() 可以在用户模式下使用,但是有什么方法可以使用 proc_t 吗?我尝试使用 XNU/osfmk/bsd 包含目录,但由于重新定义和其他错误,它不会编译。

这有点令人不安,我仍在努力思考我能做什么和不能做什么。当然可以做到这一点,但我只是不知道怎么做。

4

1 回答 1

3

好的,我将尝试解决我认为您要问的问题。

正如您所发现的, aproc_t是指向 opaque 的指针struct proc。不过不要把它写下来,因为有各种函数可以对这些指针进行操作,所以您不需要直接访问该结构(这有助于保持二进制兼容性)。其中大部分都在 -iesys/proc.hKernel.framework声明/System/Library/Frameworks/Kernel.framework/Versions/A/Headers/sys/proc.h。您提到 PID 和父 PID,其中有以下内容:

/* returns the pid of the given process */
extern int proc_pid(proc_t);
/* returns the pid of the parent of a given process */
extern int proc_ppid(proc_t);

还有另一种方式的功能 - 为 PID 获取 proc_t 等。

请注意,这些函数是内核的 BSD 部分的一部分,因此您的 kext 需要在其 info.plist 中声明对 BSD KPI 包的依赖。(如果您还没有遇到过这个,请查找 kextlibs 工具)

来自 Windows,您可能不得不习惯于阅读头文件和源代码而不是文档。大部分 OSX 内核 API 都没有记录。

于 2013-07-27T11:40:46.317 回答