3

我需要重写一个由 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来实现,因为所有内核扩展都在同一个地址空间中运行(我认为这是唯一的方法,但我不确定如何去做)。

4

1 回答 1

2

您当然可以通过破解 vtable 来实现这一点,尽管我不知道您将如何去做。我知道 C++ kext 加载和卸载机制管理 vtables 和 vtable 版本控制;来源应该是可用的,所以看看那个。

但是,vtable 修补确实应该是最后的手段。你确定你不能通过子类化来实现这一点AppleHDAPathSet吗?假设这不是 IOKit 个性类,您还必须对其进行子类化,并设置您的 info.plist 以使您的子类化个性具有比基础更高的探测分数。在您的probe()方法中决定是否isPinDigital需要应用您的 hack。然后覆盖最初实例化AppleHDAPathSet对象的任何方法,并使其创建您的子类版本的实例。

于 2011-08-22T15:46:17.937 回答