Я понимаю, что вы нашли это, но я публикую этот ответ, чтобы помочь тому, кто еще может нуждаться в этом.
Простой пример можно найти на статье MobileSubstrate на iPhoneDev Wiki, и фактическим примером этого в проекте является с этим битом из User Agent Faker .
Но каков ответ без реального объяснения?Таким образом, здесь мы идем!
void MSHookFunction(void* function, void* replacement, void** p_original);
- определение функции для MSHookFunction
, магическая функция, которая заставляет вашу функцию X()
вставляться, например, Y()
.
То есть, когда программа обычно вызывает X()
, вызов будет перенаправлен на Y()
.Это довольно простое объяснение функции , вставляющей .
Теперь, каковы параметры и их полезность?
function
- указатель на функциюк функции, которую вы хотите вставить.В нашем кратком объяснении это будет указатель на X()
. replacement
- указатель на функцию, с которой вы хотите вставить function
.В нашем кратком объяснении это будет указатель на функцию Y()
. p_original
- это указатель на указатель на функцию, который отныне будет указывать на то, что раньше было function
.
Причина этого проста: если вы намереваетесь изменить поведение, но не подавлять его, вам все равно нужно будет назвать то, что раньше было X()
.Но обычный вызов X()
не будет работать должным образом, так как он завершит вызов Y()
вместо значения по умолчанию function
.
Следовательно, у вас есть указатель функции для вызова X()
какесли он не был вставлен.
Теперь, объясняя пример devwiki:
static void (*original_CFShow)(CFTypeRef obj); // a function pointer to store the original CFShow().
void replaced_CFShow(CFTypeRef obj) { // our replacement of CFShow().
printf("Calling original CFShow(%p)...", obj);
original_CFShow(obj); // calls the original CFShow.
printf(" done.\n");
}
...
// hook CFShow to our own implementation.
MSHookFunction(CFShow, replaced_CFShow, &original_CFShow);
// From now on any call to CFShow will pass through replaced_CFShow first.
...
CFShow(CFSTR("test"));
Здесь мы:
- Передаем aуказатель на
CFShow
, функцию, из которой мы хотим изменить поведение по умолчанию в качестве параметра function
. - Передать указатель на функцию, которую мы только что создали,
replaced_CFShow
в качестве параметра replacement
.То есть всякий раз, когда CFShow
будет вызываться по умолчанию, вместо него будет вызываться replaced_CFShow
. - Мы передаем указатель на указатель на функцию
original_CFShow
в качестве параметра p_original
.Поскольку мы по-прежнему хотим, чтобы все, что CFShow
все еще выполняло внутри нашей функции замены, мы вызываем ее.