挂钩C功能

时间:2013-04-10 10:56:11

标签: objective-c macos audio hook core-audio

我想在Mac OS X上挂钩C函数。它是AudioUnitInitialize,所以我可以创建一个回调并将音频保存到文件中。我使用this page的教程获得了Mobile Substrate框架。这是我用MSHookFunction挂钩该函数的代码。

static OSStatus (*AudioUnitInitialize_original)(AudioUnit aInUnit);
OSStatus AudioUnitInitialize_hooked(AudioUnit aInUnit)
{
    NSLog(@"AudioUnitInitialize_hooked -> START");

    OSStatus __return = AudioUnitInitialize_original(aInUnit);

    NSLog(@"%p", aInUnit);
    NSLog(@"%@", aInUnit); // Here the target application crashes.

    NSLog(@"AudioUnitInitialize_hooked -> END");
    return __return;
}

...

MSHookFunction(AudioUnitInitialize, AudioUnitInitialize_hooked, &AudioUnitInitialize_original);

这里的问题是什么?我可以记录音频单元的地址,但不能更多?有没有使用函数参数的解决方案?

2 个答案:

答案 0 :(得分:2)

AudioUnit类型不是Objective-C对象,实际上它是指向struct的指针的typedef。您无法在%@中使用NSLog()格式说明符。

AudioUnit是AudioComponentInstance

的typedef

答案 1 :(得分:1)

您可能想参考MSHookFunction()

documentation

除了第一段中相当可疑的自我约束声明外,页面下方的内容如下:

“从概念上讲,MSHookFunction()将编写跳转到替换函数的指令,并在自定义内存位置分配一些字节,该位置具有原始剪切指令并跳转到其他挂钩函数。由于iPhoneOS默认情况下内存页面不能同时写入和执行,因此必须应用内核补丁才能使MSHookFunction()正常工作。“

我有点意外,任何尝试这样做都不会导致内存保护失败。

正统的插入C和C ++函数是在库中提供您自己的实现,并确保链接器在CoreAudioFramework中的版本之前到达它。

相关问题