// just like pre_call, wow! void function_context_begin_invocation(ZzHookFunctionEntry *entry, zpointer next_hop, RegState *rs, zpointer caller_ret_addr) { Xdebug("target %p call begin-invocation", entry->target_ptr); ZzThreadStack *threadstack = ZzGetCurrentThreadStack(entry->thread_local_key); if (!threadstack) { threadstack = ZzNewThreadStack(entry->thread_local_key); } ZzCallStack *callstack = ZzNewCallStack(); ZzPushCallStack(threadstack, callstack); /* call pre_call */ if (entry->pre_call) { PRECALL pre_call; pre_call = entry->pre_call; (*pre_call)(rs, (ThreadStack *)threadstack, (CallStack *)callstack); } /* set next hop */ if (entry->replace_call) { *(zpointer *)next_hop = entry->replace_call; } else { *(zpointer *)next_hop = entry->on_invoke_trampoline; } if (entry->hook_type == HOOK_FUNCTION_TYPE) { callstack->caller_ret_addr = *(zpointer *)caller_ret_addr; *(zpointer *)caller_ret_addr = entry->on_leave_trampoline; } }
// just like pre_call, wow! void function_context_begin_invocation(ZzHookFunctionEntry *entry, zz_ptr_t next_hop, RegState *rs, zz_ptr_t caller_ret_addr) { ZZ_DEBUG_LOG("target %p call begin-invocation", entry->target_ptr); /* for easy debug */ // if (!strcmp((char *)(rs->general.regs.x1), "_beginBackgroundTaskWithName:expirationHandler:")) { // } ZzThreadStack *stack = ZzGetCurrentThreadStack(entry->thread_local_key); if (!stack) { stack = ZzNewThreadStack(entry->thread_local_key); } ZzCallStack *callstack = ZzNewCallStack(); ZzPushCallStack(stack, callstack); /* call pre_call */ if (entry->pre_call) { PRECALL pre_call; HookEntryInfo entry_info; entry_info.hook_id = entry->id; entry_info.hook_address = entry->target_ptr; pre_call = entry->pre_call; (*pre_call)(rs, (ThreadStack *)stack, (CallStack *)callstack, &entry_info); } /* set next hop */ if (entry->replace_call) { *(zz_ptr_t *)next_hop = entry->replace_call; } else { *(zz_ptr_t *)next_hop = entry->on_invoke_trampoline; } if (entry->hook_type == HOOK_FUNCTION_TYPE) { callstack->caller_ret_addr = *(zz_ptr_t *)caller_ret_addr; *(zz_ptr_t *)caller_ret_addr = entry->on_leave_trampoline; } }