【问题标题】:Overriding a method defined by another kext?覆盖另一个kext定义的方法?
【发布时间】:2011-08-01 11:27:12
【问题描述】:

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

【问题讨论】:

    标签: c++ iokit kernel-extension


    【解决方案1】:

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

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

    【讨论】:

    • AppleHDAPathSet 类是在AppleHDA kext 中创建的。如果我对它进行子类化,我如何确保每当AppleHDA 创建和AppleHDAPathSet 的实例时,我的子类都会被创建?
    • 正如我所说,您必须重写相关个性类中的方法。查看 AppleHDA.kext 的 info.plist,它有 2 个个性类,AppleHDADriverAppleHDACodecGeneric。您需要弄清楚实例是在哪些类中创建的,以及它的哪些方法,然后覆盖它。源似乎不适用于这些类,因此这将需要通过反汇编。
    • 我已经拆开了。那么我是否只是将创建 PathSet 实例的方法子类化,并使其返回我自己的 PathSets 子类,它们的行为符合预期?
    • 是的,尽管正如我所说,您必须设置 Info.plist 以便实例化您的驱动程序子类而不是 Apple 的基类。
    猜你喜欢
    • 2011-08-22
    • 1970-01-01
    • 1970-01-01
    • 2017-04-07
    • 2012-08-21
    • 2012-02-02
    • 1970-01-01
    • 1970-01-01
    • 2013-02-22
    相关资源
    最近更新 更多