处理来自 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_t
是 typedef
'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.h
在Kernel.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