覆盖另一个kext定义的方法?

时间:2011-08-01 11:27:12

标签: c++ iokit kernel-extension

我需要覆盖由kext定义的方法来执行我自己的处理并返回我自己的值,因此每当kext调用该方法时,它将被路由到我的。所以我想要做的是在我自己的内核扩展中定义这个方法,然后加载它。 问题是我不知道如何交换方法所以我的方法被调用

/* basically, I need to override the isPinDigital method of AppleHDAPathSet */
AppleHDAPathSet::isPinDigital(void) 
{
     /* I also need to be able to call the superclass' method */

     /* return my own value */
     return 0;
}

有一种简单的方法吗?我知道有一种方法可以通过 VTables 来实现,因为所有内核扩展都在相同的地址空间中运行(我认为这是唯一的方法,但我不知道如何做到这一点)。

1 个答案:

答案 0 :(得分:2)

你当然可以通过黑客攻击vtable来实现这一点,尽管我没有具体了解你如何去做。我知道C ++ kext加载和卸载机制管理vtable和vtable版本控制;来源应该是可用的,所以看一下。

然而,vtable补丁应该是最后的手段。您确定通过继承AppleHDAPathSet无法实现这一目标吗?假设这不是一个IOKit个性类,你也必须将它子类化,并设置你的info.plist,使你的子类个性具有比基数更高的探测分数。确定您的probe()方法是否需要应用isPinDigital。然后覆盖最初实例化AppleHDAPathSet对象的任何方法,并使其创建子类型的实例。