【发布时间】: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 asstruct proc*- 该结构确实是不透明的,但是有很多 API 可以让您间接访问 proc 结构的各个部分。 (#include <sys/proc.h>) 基本上,你真的不清楚你在问什么,以及你真正想要达到的目标。在尝试回答更多子问题之前,我想确保这不是 XY 问题。 -
程序启动时,我想将一些信息转发回用户模式。信息可以像 PID 一样简单,但我很可能需要更多信息,例如父 PID、路径和其他一些信息。由于我无法从 proc_t 获取信息,我认为我可以使用 sysctl() 但这显然是错误的。我可以将 proc_t* 发送到我的 kext,但它不知道(好吧,我不知道)如何正确提取信息。你可能有点不清楚,因为我几周前开始在 OS X 上编程,我的经验是使用 Windows 内核:)
标签: process osx-mountain-lion kernel-extension sysctl