internal override void Configure(long codeRegistration, long metadataRegistration) { var ptrCodeReg = Image.ReadMappedObject <Il2CppCodeRegistration64>(codeRegistration); var ptrMetadataReg = Image.ReadMappedObject <Il2CppMetadataRegistration64>(metadataRegistration); var methodPointers = Image.ReadMappedArray <ulong>((long)ptrCodeReg.pmethodPointers, (int)ptrCodeReg.methodPointersCount); MethodPointers = methodPointers.Select(p => (long)p).ToArray(); var customAttributes = Image.ReadMappedArray <ulong>((long)ptrCodeReg.customAttributeGenerators, (int)ptrCodeReg.customAttributeCount); CustomAttributes = customAttributes.Select(p => (long)p).ToArray(); //ptrMetadataReg.fieldOffsets = Image.ReadMappedArray<long>((long)ptrMetadataReg.pfieldOffsets, (int)ptrMetadataReg.fieldOffsetsCount); var ptrs = Image.ReadMappedArray <ulong>((long)ptrMetadataReg.ptypes, (int)ptrMetadataReg.typesCount); var types = ptrs.Select(p => (long)p).ToArray(); Types = new GenericIl2CppType[ptrMetadataReg.typesCount]; for (var i = 0; i < ptrMetadataReg.typesCount; ++i) { var pType = Image.ReadMappedObject <Il2CppType64>(types[i]); pType.Init(); Types[i] = new GenericIl2CppType(pType); } }
internal virtual void Configure(long codeRegistration, long metadataRegistration) { var PtrCodeRegistration = Image.ReadMappedObject <Il2CppCodeRegistration>(codeRegistration); var PtrMetadataRegistration = Image.ReadMappedObject <Il2CppMetadataRegistration>(metadataRegistration); var methodPointers = Image.ReadMappedArray <uint>(PtrCodeRegistration.pmethodPointers, (int)PtrCodeRegistration.methodPointersCount); MethodPointers = methodPointers.Select(p => (long)p).ToArray(); //PtrMetadataRegistration.fieldOffsets = Image.ReadMappedArray<int>(PtrMetadataRegistration.pfieldOffsets, // PtrMetadataRegistration.fieldOffsetsCount); long[] types; if (Image.Is64bits) { var ptrs = Image.ReadMappedArray <ulong>(PtrMetadataRegistration.ptypes, PtrMetadataRegistration.typesCount); types = ptrs.Select(p => (long)p).ToArray(); } else { var ptrs = Image.ReadMappedArray <uint>(PtrMetadataRegistration.ptypes, PtrMetadataRegistration.typesCount); types = ptrs.Select(p => (long)p).ToArray(); } Types = new GenericIl2CppType[PtrMetadataRegistration.typesCount]; for (int i = 0; i < PtrMetadataRegistration.typesCount; ++i) { var pType = Image.ReadMappedObject <Il2CppType>(types[i]); pType.Init(); Types[i] = new GenericIl2CppType(pType); } }
private void AddTypeToDump(GenericIl2CppType pType) { if (!typesToDump.Any(t => t.klassIndex == pType.klassIndex)) { typesToDump.Add(pType); } }
internal virtual void Configure(long codeRegistration, long metadataRegistration) { var PtrCodeRegistration = Image.ReadMappedObject <Il2CppCodeRegistration>(codeRegistration); var PtrMetadataRegistration = Image.ReadMappedObject <Il2CppMetadataRegistration>(metadataRegistration); var methodPointers = Image.ReadMappedArray <uint>(PtrCodeRegistration.pmethodPointers, (int)PtrCodeRegistration.methodPointersCount); MethodPointers = methodPointers.Select(p => (long)p).ToArray(); var invokers = Image.ReadMappedArray <uint>(PtrCodeRegistration.invokerPointers, (int)PtrCodeRegistration.invokerPointersCount); Invokers = invokers.Select(p => (long)p).ToArray(); var managedToNative = Image.ReadMappedArray <uint>(PtrCodeRegistration.delegateWrappersFromManagedToNative, (int)PtrCodeRegistration.delegateWrappersFromManagedToNativeCount); ManagedToNative = managedToNative.Select(p => (long)p).ToArray(); var customAttributes = Image.ReadMappedArray <uint>(PtrCodeRegistration.customAttributeGenerators, PtrCodeRegistration.customAttributeCount); CustomAttributes = customAttributes.Select(p => (long)p).ToArray(); //PtrMetadataRegistration.fieldOffsets = Image.ReadMappedArray<int>(PtrMetadataRegistration.pfieldOffsets, // PtrMetadataRegistration.fieldOffsetsCount); long[] types; if (Image.Is64bits) { var ptrs = Image.ReadMappedArray <ulong>(PtrMetadataRegistration.ptypes, PtrMetadataRegistration.typesCount); types = ptrs.Select(p => (long)p).ToArray(); } else { var ptrs = Image.ReadMappedArray <uint>(PtrMetadataRegistration.ptypes, PtrMetadataRegistration.typesCount); types = ptrs.Select(p => (long)p).ToArray(); } Types = new GenericIl2CppType[PtrMetadataRegistration.typesCount]; for (int i = 0; i < PtrMetadataRegistration.typesCount; ++i) { var pType = Image.ReadMappedObject <Il2CppType>(types[i]); pType.Init(); Types[i] = new GenericIl2CppType(pType); } }
public GenericIl2CppType GetTypeFromGeneric(GenericIl2CppType pType) { if (Code.Image.Is64bits) { var generic = Code.Image.ReadMappedObject <Il2CppGenericClass64>((long)pType.generic_class); var pInst = Code.Image.ReadMappedObject <Il2CppGenericInst64>((long)generic.context.class_inst); var pointers = Code.Image.ReadMappedArray <ulong>((long)pInst.type_argv, (int)pInst.type_argc); var realType = Code.Image.ReadMappedObject <Il2CppType64>((long)pointers[0]); realType.Init(); return(new GenericIl2CppType(realType)); } else { var generic = Code.Image.ReadMappedObject <Il2CppGenericClass>((long)pType.generic_class); var pInst = Code.Image.ReadMappedObject <Il2CppGenericInst>(generic.context.class_inst); var pointers = Code.Image.ReadMappedArray <uint>(pInst.type_argv, (int)pInst.type_argc); var realType = Code.Image.ReadMappedObject <Il2CppType>(pointers[0]); realType.Init(); return(new GenericIl2CppType(realType)); } }
public string GetFullTypeName(GenericIl2CppType pType) { if (pType.type == Il2CppTypeEnum.IL2CPP_TYPE_CLASS || pType.type == Il2CppTypeEnum.IL2CPP_TYPE_VALUETYPE) { var ret = ""; Il2CppTypeDefinition klass = Metadata.Types[pType.klassIndex]; if (klass.namespaceIndex >= 0) { ret = Metadata.GetString(klass.namespaceIndex); if (ret.Length > 0) { ret += "."; } } ret += Metadata.GetString(klass.nameIndex); return(ret); } else { return(this.GetTypeName(pType)); } }
public string GetTypeName(GenericIl2CppType pType) { string ret; if (pType.type == Il2CppTypeEnum.IL2CPP_TYPE_CLASS || pType.type == Il2CppTypeEnum.IL2CPP_TYPE_VALUETYPE) { Il2CppTypeDefinition klass = Metadata.Types[pType.klassIndex]; ret = Metadata.GetString(klass.nameIndex); } else if (pType.type == Il2CppTypeEnum.IL2CPP_TYPE_GENERICINST) { if (Code.Image.Is64bits) { Il2CppGenericClass64 generic_class = Code.Image.ReadMappedObject <Il2CppGenericClass64>((long)pType.generic_class); Il2CppTypeDefinition pMainDef = Metadata.Types[generic_class.typeDefinitionIndex]; ret = Metadata.GetString(pMainDef.nameIndex); var typeNames = new List <string>(); Il2CppGenericInst64 pInst = Code.Image.ReadMappedObject <Il2CppGenericInst64>((long)generic_class.context.class_inst); var pointers = Code.Image.ReadMappedArray <ulong>((long)pInst.type_argv, (int)pInst.type_argc); for (ulong i = 0; i < pInst.type_argc; ++i) { var pOriType = Code.Image.ReadMappedObject <Il2CppType64>((long)pointers[i]); pOriType.Init(); typeNames.Add(GetTypeName(new GenericIl2CppType(pOriType))); } ret += $"<{string.Join(", ", typeNames)}>"; } else { Il2CppGenericClass generic_class = Code.Image.ReadMappedObject <Il2CppGenericClass>((long)pType.generic_class); Il2CppTypeDefinition pMainDef = Metadata.Types[generic_class.typeDefinitionIndex]; ret = Metadata.GetString(pMainDef.nameIndex); var typeNames = new List <string>(); Il2CppGenericInst pInst = Code.Image.ReadMappedObject <Il2CppGenericInst>(generic_class.context.class_inst); var pointers = Code.Image.ReadMappedArray <uint>(pInst.type_argv, (int)pInst.type_argc); for (int i = 0; i < pInst.type_argc; ++i) { var pOriType = Code.Image.ReadMappedObject <Il2CppType>(pointers[i]); pOriType.Init(); typeNames.Add(GetTypeName(new GenericIl2CppType(pOriType))); } ret += $"<{string.Join(", ", typeNames)}>"; } } else if (pType.type == Il2CppTypeEnum.IL2CPP_TYPE_ARRAY) { if (Code.Image.Is64bits) { var arrayType = Code.Image.ReadMappedObject <Il2CppArrayType64>((long)pType.dataArray); var type = Code.Image.ReadMappedObject <Il2CppType64>((long)arrayType.etype); type.Init(); ret = $"{GetTypeName(new GenericIl2CppType(type))}[]"; } else { var arrayType = Code.Image.ReadMappedObject <Il2CppArrayType>((long)pType.dataArray); var type = Code.Image.ReadMappedObject <Il2CppType>(arrayType.etype); type.Init(); ret = $"{GetTypeName(new GenericIl2CppType(type))}[]"; } } else if (pType.type == Il2CppTypeEnum.IL2CPP_TYPE_SZARRAY) { if (Code.Image.Is64bits) { var type = Code.Image.ReadMappedObject <Il2CppType64>((long)pType.dataType); type.Init(); ret = $"{GetTypeName(new GenericIl2CppType(type))}[]"; } else { var type = Code.Image.ReadMappedObject <Il2CppType>((long)pType.dataType); type.Init(); ret = $"{GetTypeName(new GenericIl2CppType(type))}[]"; } } else { if ((int)pType.type >= szTypeString.Length) { ret = "unknow"; } else { ret = szTypeString[(int)pType.type]; } } return(ret); }