2

我想在 Mac OS X 上挂接一个 C 函数。它是AudioUnitInitialize,所以我可以创建一个回调并将音频保存到一个文件中。我从这个页面获得了 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);

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

4

2 回答 2

2

AudioUnit类型不是 Objective-C 对象,实际上,它是指向结构体指针的 typedef。您不能为其使用%@格式说明符NSLog()

AudioUnit 是AudioComponentInstance的 typedef

于 2013-04-10T16:05:07.190 回答
1

您可能想参考文档MSHookFunction()

除了第一段中相当可疑的自以为是的说法外,页面下方还写着:

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

我有点惊讶任何这样做的尝试都不会导致内存保护失败。

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

于 2013-04-10T16:35:00.673 回答