我想在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);
这里的问题是什么?我可以记录音频单元的地址,但不能更多?有没有使用函数参数的解决方案?
答案 0 :(得分:2)
AudioUnit
类型不是Objective-C对象,实际上它是指向struct的指针的typedef。您无法在%@
中使用NSLog()
格式说明符。
AudioUnit是AudioComponentInstance
的typedef答案 1 :(得分:1)
您可能想参考MSHookFunction()
除了第一段中相当可疑的自我约束声明外,页面下方的内容如下:
“从概念上讲,MSHookFunction()将编写跳转到替换函数的指令,并在自定义内存位置分配一些字节,该位置具有原始剪切指令并跳转到其他挂钩函数。由于iPhoneOS默认情况下内存页面不能同时写入和执行,因此必须应用内核补丁才能使MSHookFunction()正常工作。“
我有点意外,任何尝试这样做都不会导致内存保护失败。
正统的插入C和C ++函数是在库中提供您自己的实现,并确保链接器在CoreAudioFramework中的版本之前到达它。