处理来自 KEXT 的过程信息

Posted

技术标签:

【中文标题】处理来自 KEXT 的过程信息【英文标题】:Handling process information from a KEXT 【发布时间】:2013-07-23 09:39:06 【问题描述】:

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

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

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

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

【问题讨论】:

实际上想做什么?具体来说,您要调用什么 sysctl?许多 sysctl 具有直接的内核 API 等效项。 proc_ttypedef'd as struct proc* - 该结构确实是不透明的,但是有很多 API 可以让您间接访问 proc 结构的各个部分。 (#include <sys/proc.h>) 基本上,你真的不清楚你在问什么,以及你真正想要达到的目标。在尝试回答更多子问题之前,我想确保这不是 XY 问题。 程序启动时,我想将一些信息转发回用户模式。信息可以像 PID 一样简单,但我很可能需要更多信息,例如父 PID、路径和其他一些信息。由于我无法从 proc_t 获取信息,我认为我可以使用 sysctl() 但这显然是错误的。我可以将 proc_t* 发送到我的 kext,但它不知道(好吧,我不知道)如何正确提取信息。你可能有点不清楚,因为我几周前开始在 OS X 上编程,我的经验是使用 Windows 内核:) 【参考方案1】:

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

如您所见,proc_t 是指向不透明 struct proc 的指针。不过不要把它写下来,因为有各种函数可以对这些指针进行操作,所以您不需要直接访问该结构(这有助于保持二进制兼容性)。其中大部分是在sys/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 没有记录。

【讨论】:

谢谢!我阅读了 proc.h 并且正在使用其中的一些功能。也感谢您的提示。我已经收集了尽可能多的文档,但是筛选头文件是一种非常好的方法。我还有很多东西要学,但到目前为止还很有趣。我也必须以稍微不同的方式看待事物。

以上是关于处理来自 KEXT 的过程信息的主要内容,如果未能解决你的问题,请参考以下文章

协议栈处理过程

黑苹果鼠标键盘触摸板驱动:VoodooPS2Controller.kext

用于处理来自 CLOB 的 CSV 的 Oracle PL/SQL 包/过程

如何用JAVA实现异步信息处理

第13章 int指令

第13章 int指令