void UpdateClassRefs(const struct mach_header* mh) { unsigned long refsize, refsize_s; class_t **class_refs, **class_refs_end, **super_refs, **super_refs_end; class_refs = reinterpret_cast<class_t**>( getsectdata(mh, SEG_OBJC_CLASSREFS_NEW, SECT_OBJC_CLASSREFS_NEW, &refsize) ); super_refs = reinterpret_cast<class_t**>( getsectdata(mh, SEG_OBJC_SUPERREFS_NEW, SECT_OBJC_SUPERREFS_NEW, &refsize_s) ); if (class_refs) class_refs_end = class_refs + refsize / sizeof(class_t*); if (super_refs) super_refs_end = super_refs + refsize_s / sizeof(class_t*); if (class_refs) find_and_fix((void**) class_refs, (void**) class_refs_end, g_classPointers); if (super_refs) find_and_fix((void**) super_refs, (void**) super_refs_end, g_classPointers); }
void ProcessProtocolsNew(const struct mach_header* mh, intptr_t slide) { const protocol_t** protocol_list; unsigned long protosize; protocol_list = reinterpret_cast<const protocol_t**>( getsectdata(mh, SEG_OBJC_PROTOLIST_NEW, SECT_OBJC_PROTOLIST_NEW, &protosize) ); if (protocol_list) { unsigned long refsize; protocol_t** protocol_refs; protocol_t** protocol_refs_end; std::set<const protocol_t*> setProtocols; std::vector<const protocol_t*> vecProtocols; protocol_refs = reinterpret_cast<protocol_t**>( getsectdata(mh, SEG_OBJC_PROTOREFS_NEW, SECT_OBJC_PROTOREFS_NEW, &refsize) ); if (protocol_refs) protocol_refs_end = protocol_refs + refsize / sizeof(protocol_t*); std::copy(protocol_list, protocol_list+protosize/sizeof(protocol_t*), std::inserter(setProtocols, setProtocols.begin())); topology_sort<const protocol_t>(setProtocols, vecProtocols, [&setProtocols,slide](const protocol_t* p) { return p->protocols ? std::set<const protocol_t*>(p->protocols->begin(slide), p->protocols->end(slide)) : std::set<const protocol_t*>(); }); for (const protocol_t* proto : vecProtocols) { Protocol* p = RegisterProtocol(proto, slide); if (protocol_refs) find_and_fix(protocol_refs, protocol_refs_end, proto, p); } } }