private Il2CppMetadata(MemoryStream stream) : base(stream) { metadataHeader = ReadClass <Il2CppGlobalMetadataHeader>(-1); if (metadataHeader.magicNumber != 0xFAB11BAF) { throw new Exception("ERROR: Magic number mismatch. Expecting " + 0xFAB11BAF + " but got " + metadataHeader.magicNumber); } if (metadataHeader.version < 24) { throw new Exception("ERROR: Invalid metadata version, we only support v24+, this metadata is using v" + metadataHeader.version); } Console.Write("\tReading image definitions..."); var start = DateTime.Now; imageDefinitions = ReadMetadataClassArray <Il2CppImageDefinition>(metadataHeader.imagesOffset, metadataHeader.imagesCount); Console.WriteLine($"OK ({(DateTime.Now - start).TotalMilliseconds} ms)"); Console.Write("\tReading type definitions..."); start = DateTime.Now; typeDefs = ReadMetadataClassArray <Il2CppTypeDefinition>(metadataHeader.typeDefinitionsOffset, metadataHeader.typeDefinitionsCount); Console.WriteLine($"{typeDefs.Length} OK ({(DateTime.Now - start).TotalMilliseconds} ms)"); Console.Write("\tReading interface offsets..."); start = DateTime.Now; interfaceOffsets = ReadMetadataClassArray <Il2CppInterfaceOffset>(metadataHeader.interfaceOffsetsOffset, metadataHeader.interfaceOffsetsCount); Console.WriteLine($"OK ({(DateTime.Now - start).TotalMilliseconds} ms)"); Console.Write("\tReading method definitions..."); start = DateTime.Now; methodDefs = ReadMetadataClassArray <Il2CppMethodDefinition>(metadataHeader.methodsOffset, metadataHeader.methodsCount); Console.WriteLine($"OK ({(DateTime.Now - start).TotalMilliseconds} ms)"); Console.Write("\tReading method parameter definitions..."); start = DateTime.Now; parameterDefs = ReadMetadataClassArray <Il2CppParameterDefinition>(metadataHeader.parametersOffset, metadataHeader.parametersCount); Console.WriteLine($"OK ({(DateTime.Now - start).TotalMilliseconds} ms)"); Console.Write("\tReading field definitions..."); start = DateTime.Now; fieldDefs = ReadMetadataClassArray <Il2CppFieldDefinition>(metadataHeader.fieldsOffset, metadataHeader.fieldsCount); Console.WriteLine($"OK ({(DateTime.Now - start).TotalMilliseconds} ms)"); Console.Write("\tReading default field values..."); start = DateTime.Now; fieldDefaultValues = ReadMetadataClassArray <Il2CppFieldDefaultValue>(metadataHeader.fieldDefaultValuesOffset, metadataHeader.fieldDefaultValuesCount); Console.WriteLine($"OK ({(DateTime.Now - start).TotalMilliseconds} ms)"); Console.Write("\tReading default parameter values..."); start = DateTime.Now; parameterDefaultValues = ReadMetadataClassArray <Il2CppParameterDefaultValue>(metadataHeader.parameterDefaultValuesOffset, metadataHeader.parameterDefaultValuesCount); Console.WriteLine($"OK ({(DateTime.Now - start).TotalMilliseconds} ms)"); Console.Write("\tReading property definitions..."); start = DateTime.Now; propertyDefs = ReadMetadataClassArray <Il2CppPropertyDefinition>(metadataHeader.propertiesOffset, metadataHeader.propertiesCount); Console.WriteLine($"OK ({(DateTime.Now - start).TotalMilliseconds} ms)"); Console.Write("\tReading interface definitions..."); start = DateTime.Now; interfaceIndices = ReadClassArray <int>(metadataHeader.interfacesOffset, metadataHeader.interfacesCount / 4); Console.WriteLine($"OK ({(DateTime.Now - start).TotalMilliseconds} ms)"); Console.Write("\tReading nested type definitions..."); start = DateTime.Now; nestedTypeIndices = ReadClassArray <int>(metadataHeader.nestedTypesOffset, metadataHeader.nestedTypesCount / 4); Console.WriteLine($"OK ({(DateTime.Now - start).TotalMilliseconds} ms)"); Console.Write("\tReading event definitions..."); start = DateTime.Now; eventDefs = ReadMetadataClassArray <Il2CppEventDefinition>(metadataHeader.eventsOffset, metadataHeader.eventsCount); Console.WriteLine($"OK ({(DateTime.Now - start).TotalMilliseconds} ms)"); Console.Write("\tReading generic container definitions..."); start = DateTime.Now; genericContainers = ReadMetadataClassArray <Il2CppGenericContainer>(metadataHeader.genericContainersOffset, metadataHeader.genericContainersCount); Console.WriteLine($"OK ({(DateTime.Now - start).TotalMilliseconds} ms)"); Console.Write("\tReading generic parameter definitions..."); start = DateTime.Now; genericParameters = ReadMetadataClassArray <Il2CppGenericParameter>(metadataHeader.genericParametersOffset, metadataHeader.genericParametersCount); Console.WriteLine($"OK ({(DateTime.Now - start).TotalMilliseconds} ms)"); //v17+ fields Console.Write("\tReading string definitions..."); start = DateTime.Now; stringLiterals = ReadMetadataClassArray <Il2CppStringLiteral>(metadataHeader.stringLiteralOffset, metadataHeader.stringLiteralCount); Console.WriteLine($"OK ({(DateTime.Now - start).TotalMilliseconds} ms)"); //Removed in v27 (2020.2) if (LibCpp2IlMain.MetadataVersion < 27f) { Console.Write("\tReading usage data..."); start = DateTime.Now; metadataUsageLists = ReadMetadataClassArray <Il2CppMetadataUsageList>(metadataHeader.metadataUsageListsOffset, metadataHeader.metadataUsageListsCount); metadataUsagePairs = ReadMetadataClassArray <Il2CppMetadataUsagePair>(metadataHeader.metadataUsagePairsOffset, metadataHeader.metadataUsagePairsCount); DecipherMetadataUsage(); Console.WriteLine($"OK ({(DateTime.Now - start).TotalMilliseconds} ms)"); } Console.Write("\tReading field references..."); start = DateTime.Now; fieldRefs = ReadMetadataClassArray <Il2CppFieldRef>(metadataHeader.fieldRefsOffset, metadataHeader.fieldRefsCount); Console.WriteLine($"OK ({(DateTime.Now - start).TotalMilliseconds} ms)"); //v21+ fields Console.Write("\tReading attribute types..."); start = DateTime.Now; attributeTypeRanges = ReadMetadataClassArray <Il2CppCustomAttributeTypeRange>(metadataHeader.attributesInfoOffset, metadataHeader.attributesInfoCount); attributeTypes = ReadClassArray <int>(metadataHeader.attributeTypesOffset, metadataHeader.attributeTypesCount / 4); Console.WriteLine($"OK ({(DateTime.Now - start).TotalMilliseconds} ms)"); Console.Write("\tBuilding Lookup Table for field defaults..."); start = DateTime.Now; foreach (var il2CppFieldDefaultValue in fieldDefaultValues) { _fieldDefaultValueLookup[il2CppFieldDefaultValue.fieldIndex] = il2CppFieldDefaultValue; } Console.WriteLine($"OK ({(DateTime.Now - start).TotalMilliseconds} ms)"); }
private Il2CppMetadata(Stream stream) : base(stream) { metadataHeader = ReadClass <Il2CppGlobalMetadataHeader>(-1); if (metadataHeader.magicNumber != 0xFAB11BAF) { throw new Exception("ERROR: Magic number mismatch. Expecting " + 0xFAB11BAF + " but got " + metadataHeader.magicNumber); } if (metadataHeader.version != 24) { throw new Exception("ERROR: Invalid metadata version, unity only uses 24, we got " + metadataHeader.version); } Console.Write("\tReading image definitions..."); var start = DateTime.Now; assemblyDefinitions = ReadMetadataClassArray <Il2CppAssemblyDefinition>(metadataHeader.imagesOffset, metadataHeader.imagesCount); Console.WriteLine($"OK ({(DateTime.Now - start).TotalMilliseconds} ms)"); Console.Write("\tReading type definitions..."); start = DateTime.Now; typeDefs = ReadMetadataClassArray <Il2CppTypeDefinition>(metadataHeader.typeDefinitionsOffset, metadataHeader.typeDefinitionsCount); Console.WriteLine($"OK ({(DateTime.Now - start).TotalMilliseconds} ms)"); Console.Write("\tReading interface offsets..."); start = DateTime.Now; interfaceOffsets = ReadMetadataClassArray <Il2CppInterfaceOffset>(metadataHeader.interfaceOffsetsOffset, metadataHeader.interfaceOffsetsCount); Console.WriteLine($"OK ({(DateTime.Now - start).TotalMilliseconds} ms)"); Console.Write("\tReading method definitions..."); start = DateTime.Now; methodDefs = ReadMetadataClassArray <Il2CppMethodDefinition>(metadataHeader.methodsOffset, metadataHeader.methodsCount); Console.WriteLine($"OK ({(DateTime.Now - start).TotalMilliseconds} ms)"); Console.Write("\tReading method parameter definitions..."); start = DateTime.Now; parameterDefs = ReadMetadataClassArray <Il2CppParameterDefinition>(metadataHeader.parametersOffset, metadataHeader.parametersCount); Console.WriteLine($"OK ({(DateTime.Now - start).TotalMilliseconds} ms)"); Console.Write("\tReading field definitions..."); start = DateTime.Now; fieldDefs = ReadMetadataClassArray <Il2CppFieldDefinition>(metadataHeader.fieldsOffset, metadataHeader.fieldsCount); Console.WriteLine($"OK ({(DateTime.Now - start).TotalMilliseconds} ms)"); Console.Write("\tReading default field values..."); start = DateTime.Now; fieldDefaultValues = ReadMetadataClassArray <Il2CppFieldDefaultValue>(metadataHeader.fieldDefaultValuesOffset, metadataHeader.fieldDefaultValuesCount); Console.WriteLine($"OK ({(DateTime.Now - start).TotalMilliseconds} ms)"); Console.Write("\tReading default parameter values..."); start = DateTime.Now; parameterDefaultValues = ReadMetadataClassArray <Il2CppParameterDefaultValue>(metadataHeader.parameterDefaultValuesOffset, metadataHeader.parameterDefaultValuesCount); Console.WriteLine($"OK ({(DateTime.Now - start).TotalMilliseconds} ms)"); Console.Write("\tReading property definitions..."); start = DateTime.Now; propertyDefs = ReadMetadataClassArray <Il2CppPropertyDefinition>(metadataHeader.propertiesOffset, metadataHeader.propertiesCount); Console.WriteLine($"OK ({(DateTime.Now - start).TotalMilliseconds} ms)"); Console.Write("\tReading interface definitions..."); start = DateTime.Now; interfaceIndices = ReadClassArray <int>(metadataHeader.interfacesOffset, metadataHeader.interfacesCount / 4); Console.WriteLine($"OK ({(DateTime.Now - start).TotalMilliseconds} ms)"); Console.Write("\tReading nested type definitions..."); start = DateTime.Now; nestedTypeIndices = ReadClassArray <int>(metadataHeader.nestedTypesOffset, metadataHeader.nestedTypesCount / 4); Console.WriteLine($"OK ({(DateTime.Now - start).TotalMilliseconds} ms)"); Console.Write("\tReading event definitions..."); start = DateTime.Now; eventDefs = ReadMetadataClassArray <Il2CppEventDefinition>(metadataHeader.eventsOffset, metadataHeader.eventsCount); Console.WriteLine($"OK ({(DateTime.Now - start).TotalMilliseconds} ms)"); Console.Write("\tReading generic container definitions..."); start = DateTime.Now; genericContainers = ReadMetadataClassArray <Il2CppGenericContainer>(metadataHeader.genericContainersOffset, metadataHeader.genericContainersCount); Console.WriteLine($"OK ({(DateTime.Now - start).TotalMilliseconds} ms)"); Console.Write("\tReading generic parameter definitions..."); start = DateTime.Now; genericParameters = ReadMetadataClassArray <Il2CppGenericParameter>(metadataHeader.genericParametersOffset, metadataHeader.genericParametersCount); Console.WriteLine($"OK ({(DateTime.Now - start).TotalMilliseconds} ms)"); //v17+ fields Console.Write("\tReading string definitions..."); start = DateTime.Now; stringLiterals = ReadMetadataClassArray <Il2CppStringLiteral>(metadataHeader.stringLiteralOffset, metadataHeader.stringLiteralCount); Console.WriteLine($"OK ({(DateTime.Now - start).TotalMilliseconds} ms)"); Console.Write("\tReading usage data..."); start = DateTime.Now; metadataUsageLists = ReadMetadataClassArray <Il2CppMetadataUsageList>(metadataHeader.metadataUsageListsOffset, metadataHeader.metadataUsageListsCount); metadataUsagePairs = ReadMetadataClassArray <Il2CppMetadataUsagePair>(metadataHeader.metadataUsagePairsOffset, metadataHeader.metadataUsagePairsCount); DecipherMetadataUsage(); Console.WriteLine($"OK ({(DateTime.Now - start).TotalMilliseconds} ms)"); Console.Write("\tReading field references..."); start = DateTime.Now; fieldRefs = ReadMetadataClassArray <Il2CppFieldRef>(metadataHeader.fieldRefsOffset, metadataHeader.fieldRefsCount); Console.WriteLine($"OK ({(DateTime.Now - start).TotalMilliseconds} ms)"); //v21+ fields Console.Write("\tReading attribute types..."); start = DateTime.Now; attributeTypeRanges = ReadMetadataClassArray <Il2CppCustomAttributeTypeRange>(metadataHeader.attributesInfoOffset, metadataHeader.attributesInfoCount); attributeTypes = ReadClassArray <int>(metadataHeader.attributeTypesOffset, metadataHeader.attributeTypesCount / 4); Console.WriteLine($"OK ({(DateTime.Now - start).TotalMilliseconds} ms)"); }