我需要覆盖由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 来实现,因为所有内核扩展都在相同的地址空间中运行(我认为这是唯一的方法,但我不知道如何做到这一点)。
答案 0 :(得分:2)
你当然可以通过黑客攻击vtable来实现这一点,尽管我没有具体了解你如何去做。我知道C ++ kext加载和卸载机制管理vtable和vtable版本控制;来源应该是可用的,所以看一下。
然而,vtable补丁应该是最后的手段。您确定通过继承AppleHDAPathSet
无法实现这一目标吗?假设这不是一个IOKit个性类,你也必须将它子类化,并设置你的info.plist,使你的子类个性具有比基数更高的探测分数。确定您的probe()
方法是否需要应用isPinDigital
。然后覆盖最初实例化AppleHDAPathSet
对象的任何方法,并使其创建子类型的实例。