Exemple #1
0
        // Basic primitive types
        public TypeInfo GetTypeFromEnum(Il2CppTypeEnum t)
        {
            if ((int)t >= Il2CppConstants.FullNameTypeString.Count)
            {
                return(null);
            }

            return(Assemblies.SelectMany(x => x.DefinedTypes).First(x => x.FullName == Il2CppConstants.FullNameTypeString[(int)t]));
        }
Exemple #2
0
        // Basic primitive types are specified via a flag value
        private TypeInfo getTypeDefinitionFromTypeEnum(Il2CppTypeEnum t)
        {
            if ((int)t >= Il2CppConstants.FullNameTypeString.Count)
            {
                return(null);
            }

            var fqn = Il2CppConstants.FullNameTypeString[(int)t];

            return(TypesByFullName[fqn]);
        }
Exemple #3
0
        // Basic primitive types
        public TypeInfo GetTypeFromTypeEnum(Il2CppTypeEnum t)
        {
            if ((int)t >= Il2CppConstants.FullNameTypeString.Count)
            {
                return(null);
            }

            var fqn = Il2CppConstants.FullNameTypeString[(int)t];

            return(TypesByFullName[fqn]);
        }
        public bool GetConstantValueFromBlob(Il2CppTypeEnum type, BinaryReader reader, out BlobValue value)
        {
            value = new BlobValue();
            value.il2CppTypeEnum = type;
            switch (type)
            {
            case Il2CppTypeEnum.IL2CPP_TYPE_BOOLEAN:
                value.Value = reader.ReadBoolean();
                return(true);

            case Il2CppTypeEnum.IL2CPP_TYPE_U1:
                value.Value = reader.ReadByte();
                return(true);

            case Il2CppTypeEnum.IL2CPP_TYPE_I1:
                value.Value = reader.ReadSByte();
                return(true);

            case Il2CppTypeEnum.IL2CPP_TYPE_CHAR:
                value.Value = BitConverter.ToChar(reader.ReadBytes(2), 0);
                return(true);

            case Il2CppTypeEnum.IL2CPP_TYPE_U2:
                value.Value = reader.ReadUInt16();
                return(true);

            case Il2CppTypeEnum.IL2CPP_TYPE_I2:
                value.Value = reader.ReadInt16();
                return(true);

            case Il2CppTypeEnum.IL2CPP_TYPE_U4:
                if (il2Cpp.Version >= 29)
                {
                    value.Value = reader.ReadCompressedUInt32();
                }
                else
                {
                    value.Value = reader.ReadUInt32();
                }
                return(true);

            case Il2CppTypeEnum.IL2CPP_TYPE_I4:
                if (il2Cpp.Version >= 29)
                {
                    value.Value = reader.ReadCompressedInt32();
                }
                else
                {
                    value.Value = reader.ReadInt32();
                }
                return(true);

            case Il2CppTypeEnum.IL2CPP_TYPE_U8:
                value.Value = reader.ReadUInt64();
                return(true);

            case Il2CppTypeEnum.IL2CPP_TYPE_I8:
                value.Value = reader.ReadInt64();
                return(true);

            case Il2CppTypeEnum.IL2CPP_TYPE_R4:
                value.Value = reader.ReadSingle();
                return(true);

            case Il2CppTypeEnum.IL2CPP_TYPE_R8:
                value.Value = reader.ReadDouble();
                return(true);

            case Il2CppTypeEnum.IL2CPP_TYPE_STRING:
                int length;
                if (il2Cpp.Version >= 29)
                {
                    length = reader.ReadCompressedInt32();
                    if (length == -1)
                    {
                        value.Value = null;
                    }
                    else
                    {
                        value.Value = Encoding.UTF8.GetString(reader.ReadBytes(length));
                    }
                }
                else
                {
                    length      = reader.ReadInt32();
                    value.Value = reader.ReadString(length);
                }
                return(true);

            case Il2CppTypeEnum.IL2CPP_TYPE_SZARRAY:
                var arrayLen = reader.ReadCompressedInt32();
                if (arrayLen == -1)
                {
                    value.Value = null;
                }
                else
                {
                    var array                     = new BlobValue[arrayLen];
                    var arrayElementType          = ReadEncodedTypeEnum(reader, out var enumType);
                    var arrayElementsAreDifferent = reader.ReadByte();
                    for (int i = 0; i < arrayLen; i++)
                    {
                        var elementType = arrayElementType;
                        if (arrayElementsAreDifferent == 1)
                        {
                            elementType = ReadEncodedTypeEnum(reader, out enumType);
                        }
                        GetConstantValueFromBlob(elementType, reader, out var data);
                        data.il2CppTypeEnum = elementType;
                        data.EnumType       = enumType;
                        array[i]            = data;
                    }
                    value.Value = array;
                }
                return(true);

            case Il2CppTypeEnum.IL2CPP_TYPE_IL2CPP_TYPE_INDEX:
                var typeIndex = reader.ReadCompressedInt32();
                if (typeIndex == -1)
                {
                    value.Value = null;
                }
                else
                {
                    value.Value = il2Cpp.types[typeIndex];
                }
                return(true);

            default:
                value = null;
                return(false);
            }
        }
 public Il2CppTypeInfo(Il2CppType cppType)
 {
     this._cppType     = cppType;
     this._cppTypeEnum = cppType.type;
 }