Переопределить метод, определенный другим kext? - PullRequest
3 голосов
/ 01 августа 2011

Мне нужно переопределить метод, определенный 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 Ответ

2 голосов
/ 22 августа 2011

Вы, конечно, можете добиться этого, взломав vtable, хотя у меня нет четкого представления о том, как бы вы поступили.Я знаю, что механизм загрузки и выгрузки C ++ kext управляет версиями vtables и vtable;источник должен быть доступен, так что взгляните на это.

Однако исправление vtable должно быть последним средством.Вы уверены, что не можете достичь этого, создав подкласс AppleHDAPathSet?Предполагая, что это не личностный класс IOKit, вы должны будете также создать его подкласс и настроить ваш info.plist таким образом, чтобы у вашей подклассовой личности был более высокий тестовый показатель, чем у базового.В своем методе probe() определите, нужно ли применять ваш хак к isPinDigital.Затем переопределите любой метод, который изначально создает экземпляр объекта AppleHDAPathSet, и заставьте его создать экземпляр вашей подклассовой версии.

...