private int[] ReadOffsets(IReader reader, Pointer indexTableLocation, int count)
 {
     reader.SeekTo(indexTableLocation.AsOffset());
     int[] offsets = new int[count];
     for (int i = 0; i < count; i++)
         offsets[i] = reader.ReadInt32();
     return offsets;
 }
        private IReader DecryptData(IReader reader, Pointer dataLocation, int tableSize, AESKey key)
        {
            // Round the table size to an AES block size
            tableSize = (tableSize + 0xF) & ~0xF;

            reader.SeekTo(dataLocation.AsOffset());
            byte[] data = reader.ReadBlock(tableSize);
            if (key != null)
                data = AES.Decrypt(data, key.Key, key.IV);
            return new EndianReader(new MemoryStream(data), Endian.BigEndian);
        }
Example #3
0
        void Load(StructureValueCollection values, ushort index, MetaAddressConverter converter, IList<ITagClass> classList)
        {
            int classIndex = (int)values.GetNumber("class index");
            if (classIndex >= 0)
                Class = classList[classIndex];

            ushort salt = (ushort)values.GetNumber("datum index salt");
            Index = new DatumIndex(salt, index);

            MetaLocation = new Pointer(values.GetNumber("memory address"), converter);
        }
        public ThirdGenStringTable(IReader reader, int count, int tableSize, Pointer indexTableLocation, Pointer dataLocation, AESKey key)
        {
            int[] offsets = ReadOffsets(reader, indexTableLocation, count);
            IReader stringReader = DecryptData(reader, dataLocation, tableSize, key);

            // Read each string
            stringReader.SeekTo(0);
            for (int i = 0; i < offsets.Length; i++)
            {
                stringReader.SeekTo(offsets[i]);
                _strings.Add(stringReader.ReadAscii());
            }
        }
        public void ReadRequestedStrings(IReader reader, Pointer baseLocation, CachedStringTable output)
        {
            uint baseOffset = baseLocation.AsOffset();

            int lastEnd = -1;
            foreach (int offset in _requestedStrings)
            {
                if (offset <= lastEnd)
                    continue;
                reader.SeekTo(baseOffset + offset);
                string str = reader.ReadAscii();
                output.CacheString(offset, str);
                lastEnd = offset + str.Length;
            }
        }
        private void Load(IReader reader, StructureValueCollection values, MetaAddressConverter converter, BuildInformation buildInfo)
        {
            if (values.GetNumber("magic") != CharConstant.FromString("tags"))
                throw new ArgumentException("Invalid index table header magic");

            // Classes
            int numClasses = (int)values.GetNumber("number of classes");
            Pointer classTableLocation = new Pointer(values.GetNumber("class table address"), converter);
            _classes = ReadClasses(reader, classTableLocation, numClasses, buildInfo);

            // Tags
            int numTags = (int)values.GetNumber("number of tags");
            Pointer tagTableLocation = new Pointer(values.GetNumber("tag table address"), converter);
            _tags = ReadTags(reader, tagTableLocation, numTags, buildInfo, converter);
        }
Example #7
0
        private IList<IScriptParameter> LoadParameters(IReader reader, StructureValueCollection values, MetaAddressConverter addrConverter, BuildInformation buildInfo)
        {
            int paramCount = (int)values.GetNumber("number of parameters");
            Pointer paramListLocation = new Pointer(values.GetNumber("address of parameter list"), addrConverter);

            StructureLayout layout = buildInfo.GetLayout("script parameter entry");
            List<IScriptParameter> result = new List<IScriptParameter>();

            reader.SeekTo(paramListLocation.AsOffset());
            for (int i = 0; i < paramCount; i++)
            {
                StructureValueCollection paramValues = StructureReader.ReadStructure(reader, layout);
                result.Add(new ThirdGenScriptParameter(paramValues));
            }
            return result;
        }
        private List<ITag> ReadTags(IReader reader, Pointer tagTableLocation, int numTags, BuildInformation buildInfo, MetaAddressConverter converter)
        {
            StructureLayout layout = buildInfo.GetLayout("tag entry");

            List<ITag> result = new List<ITag>();
            reader.SeekTo(tagTableLocation.AsOffset());
            for (int i = 0; i < numTags; i++)
            {
                StructureValueCollection values = StructureReader.ReadStructure(reader, layout);
                result.Add(new ThirdGenTag(values, (ushort)i, converter, _classes));
            }
            return result;
        }
 public ThirdGenFileNameSource(IReader reader, int count, int tableSize, Pointer indexTableLocation, Pointer dataLocation, BuildInformation buildInfo)
 {
     _strings = new ThirdGenStringTable(reader, count, tableSize, indexTableLocation, dataLocation, buildInfo.FileNameKey);
 }
Example #10
0
 public bool Equals(Pointer obj)
 {
     return (AsOffset() == obj.AsOffset());
 }
Example #11
0
 public Pointer(uint value, Pointer template)
 {
     _value = value;
     _converter = template._converter;
 }
Example #12
0
        private void Load(StructureValueCollection values)
        {
            _addrConverter = LoadAddressConverter(values);
            _indexConverter = LoadIndexOffsetConverter(values);
            _stringOffsetConverter = LoadHeaderOffsetConverter(values);

            FileSize = values.GetNumber("file size");
            IndexHeaderLocation = new Pointer(values.GetNumber("index header address"), _addrConverter);
            MetaSize = values.GetNumber("virtual size");
            Type = (CacheFileType)values.GetNumber("type");

            StringIDCount = (int)values.GetNumber("string table count");
            StringIDTableSize = (int)values.GetNumber("string table size");
            StringIDIndexTableLocation = new Pointer(values.GetNumber("string index table offset"), _stringOffsetConverter);
            StringIDDataLocation = new Pointer(values.GetNumber("string table offset"), _stringOffsetConverter);

            InternalName = values.GetString("internal name");
            ScenarioName = values.GetString("scenario name");

            FileNameCount = (int)values.GetNumber("file table count");
            FileNameDataLocation = new Pointer(values.GetNumber("file table offset"), _stringOffsetConverter);
            FileNameTableSize = (int)values.GetNumber("file table size");
            FileNameIndexTableLocation = new Pointer(values.GetNumber("file index table offset"), _stringOffsetConverter);

            XDKVersion = (int)values.GetNumber("xdk version");
            Partitions = LoadPartitions(values.GetArray("partitions"));

            LocaleDataLocation = new Pointer(values.GetNumberOrDefault("locale data index offset", (uint)HeaderSize), _indexConverter);
            LocaleDataSize = (int)values.GetNumberOrDefault("locale data size", 0);
        }
        private ExpressionTable LoadScriptExpressions(StructureValueCollection values, IReader reader, MetaAddressConverter addrConverter, StringTableReader stringReader, StructureLayout entryLayout)
        {
            int exprCount = (int)values.GetNumber("number of script expressions");
            ScriptExpressionsLocation = new Pointer(values.GetNumber("script expression table address"), addrConverter);

            ExpressionTable result = new ExpressionTable();
            reader.SeekTo(ScriptExpressionsLocation.AsOffset());
            for (int i = 0; i < exprCount; i++)
            {
                StructureValueCollection exprValues = StructureReader.ReadStructure(reader, entryLayout);
                result.AddExpression(new ThirdGenExpression(exprValues, (ushort)i, stringReader));
            }

            foreach (IExpression expr in result)
            {
                // FIXME: hax
                if (expr != null)
                    ((ThirdGenExpression)expr).ResolveReferences(result);
            }
            return result;
        }
        private CachedStringTable LoadStrings(StructureValueCollection values, IReader reader, StringTableReader stringReader, MetaAddressConverter addrConverter)
        {
            int stringsSize = (int)values.GetNumber("script string table size");
            Pointer stringsLocation = new Pointer(values.GetNumber("script string table address"), addrConverter);

            CachedStringTable result = new CachedStringTable();
            stringReader.ReadRequestedStrings(reader, stringsLocation, result);
            return result;
        }
        private List<IScript> LoadScripts(StructureValueCollection values, IReader reader, MetaAddressConverter addrConverter, IStringIDSource stringIDs, ExpressionTable expressions, StructureLayout entryLayout, BuildInformation buildInfo)
        {
            int script = (int)values.GetNumber("number of scripts");
            ScriptsLocation = new Pointer(values.GetNumber("script table address"), addrConverter);

            // Read all of the script entries first, then go back and create the objects
            // ThirdGenScript reads parameters from its constructor - this may or may not need cleaning up to make this more obvious
            reader.SeekTo(ScriptsLocation.AsOffset());
            List<StructureValueCollection> scriptData = new List<StructureValueCollection>();
            for (int i = 0; i < script; i++)
                scriptData.Add(StructureReader.ReadStructure(reader, entryLayout));

            List<IScript> result = new List<IScript>();
            foreach (StructureValueCollection scriptValues in scriptData)
                result.Add(new ThirdGenScript(reader, scriptValues, addrConverter, stringIDs, expressions, buildInfo));
            return result;
        }
        private List<IGlobalObject> LoadScriptObjects(StructureValueCollection values, IReader reader, MetaAddressConverter addrConverter, IStringIDSource stringIDs, StructureLayout entryLayout)
        {
            int objectsCount = (int)values.GetNumber("number of script objects");
            ScriptObjectsLocation = new Pointer(values.GetNumber("script object table address"), addrConverter);

            List<IGlobalObject> result = new List<IGlobalObject>();
            reader.SeekTo(ScriptObjectsLocation.AsOffset());
            for (int i = 0; i < objectsCount; i++)
            {
                StructureValueCollection objValues = StructureReader.ReadStructure(reader, entryLayout);
                result.Add(new ThirdGenGlobalObject(objValues, stringIDs));
            }
            return result;
        }
        private List<IGlobal> LoadScriptGlobals(StructureValueCollection values, IReader reader, MetaAddressConverter addrConverter, ExpressionTable expressions, StructureLayout entryLayout)
        {
            int globalsCount = (int)values.GetNumber("number of script globals");
            ScriptGlobalsLocation = new Pointer(values.GetNumber("script global table address"), addrConverter);

            List<IGlobal> result = new List<IGlobal>();
            reader.SeekTo(ScriptGlobalsLocation.AsOffset());
            for (int i = 0; i < globalsCount; i++)
            {
                StructureValueCollection globalValues = StructureReader.ReadStructure(reader, entryLayout);
                result.Add(new ThirdGenGlobal(globalValues, expressions));
            }
            return result;
        }
Example #18
0
 /// <summary>
 /// Creates a new Partition object, given a base pointer and a size.
 /// </summary>
 /// <param name="basePointer">The pointer to the start of the partition.</param>
 /// <param name="size">The partition's size.</param>
 public Partition(Pointer basePointer, uint size)
 {
     BasePointer = basePointer;
     Size = size;
 }
Example #19
0
        private List<ITagClass> ReadClasses(IReader reader, Pointer classTableLocation, int numClasses, BuildInformation buildInfo)
        {
            StructureLayout layout = buildInfo.GetLayout("class entry");

            List<ITagClass> result = new List<ITagClass>();
            reader.SeekTo(classTableLocation.AsOffset());
            for (int i = 0; i < numClasses; i++)
            {
                StructureValueCollection values = StructureReader.ReadStructure(reader, layout);
                result.Add(new ThirdGenTagClass(values));
            }
            return result;
        }
Example #20
0
 /// <summary>
 /// Converts a Pointer into a pointer which can be written to the file.
 /// </summary>
 /// <param name="pointer">The Pointer to convert.</param>
 /// <returns>The raw value of the Pointer.</returns>
 public uint PointerToRaw(Pointer pointer)
 {
     return OffsetToPointer(pointer.AsOffset());
 }
Example #21
0
        private void Load(StructureValueCollection values, IndexOffsetConverter converter)
        {
            StringCount = (int)values.GetNumber("string count");
            LocaleTableSize = (int)values.GetNumber("locale table size");
            LocaleIndexTableLocation = new Pointer(values.GetNumber("locale index table offset"), converter);
            LocaleDataLocation = new Pointer(values.GetNumber("locale data index offset"), converter);

            // H3 beta doesn't have hashes
            if (values.HasRaw("index table hash"))
                IndexTableHash = values.GetRaw("index table hash");
            if (values.HasRaw("string data hash"))
                StringDataHash = values.GetRaw("string data hash");
        }