コード例 #1
0
ファイル: class.cpp プロジェクト: Hasimir/darling
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);
}
コード例 #2
0
ファイル: protocol.cpp プロジェクト: MyOwnClone/darling
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);
		}
	}
}