Exemplo n.º 1
0
        private void ReadInstanceData(long offset)
        {
            Records            = new List <STUInstanceRecord>();
            Stream.Position    = offset;
            TypeHashes         = new HashSet <uint>();
            EmbedRequests      = new Dictionary <KeyValuePair <object, FieldInfo>, int>();
            EmbedArrayRequests = new Dictionary <Array, int[]>();
            Start = offset;
            using (BinaryReader reader = new BinaryReader(Stream, Encoding.UTF8, true)) {
                if (_InstanceTypes == null)
                {
                    LoadInstanceTypes();
                }
                STUHeader instance = new STUHeader();
                _data = (STUHeader)InitializeObject(instance, typeof(STUHeader), reader, false, false);

                STUInstanceRecord[] instanceTable = new STUInstanceRecord[_data.InstanceCount];
                for (int i = 0; i < _data.InstanceCount; i++)
                {
                    instanceTable[i] = reader.Read <STUInstanceRecord>();
                    Records.Add(instanceTable[i]);
                }

                foreach (STUInstanceRecord record in instanceTable)
                {
                    ReadInstance(record.Offset, reader);
                }

                foreach (KeyValuePair <KeyValuePair <object, FieldInfo>, int> embedRequest in EmbedRequests)
                {
                    if (!_instances.ContainsKey(embedRequest.Value))
                    {
                        continue;
                    }
                    embedRequest.Key.Value.SetValue(embedRequest.Key.Key, _instances[embedRequest.Value]);
                    if (_instances[embedRequest.Value] == null)
                    {
                        continue;
                    }
                    _instances[embedRequest.Value].Usage = InstanceUsage.Embed;
                }
                foreach (KeyValuePair <Array, int[]> request in EmbedArrayRequests)
                {
                    int arrayIndex = 0;
                    foreach (int i in request.Value)
                    {
                        if (_instances.ContainsKey(i))
                        {
                            request.Key.SetValue(_instances[i], arrayIndex);
                            if (_instances[i] == null)
                            {
                                continue;
                            }
                            _instances[i].Usage = InstanceUsage.EmbedArray;
                        }
                        arrayIndex++;
                    }
                }
            }
        }
Exemplo n.º 2
0
        protected bool ReadHeaderData(BinaryReader reader)
        {
            Header = reader.Read <STUHeader>();
            if (Header.InstanceCount == 0 || Header.InstanceListOffset == 0)
            {
                return(false);
            }

            InstanceInfo    = new STUInstanceRecord[Header.InstanceCount];
            Stream.Position = Header.InstanceListOffset;
            for (uint i = 0; i < InstanceInfo.Length; ++i)
            {
                InstanceInfo[i] = reader.Read <STUInstanceRecord>();
            }

            InstanceArrayRef = new STUInstanceArrayRef[Header.EntryInstanceCount];
            Stream.Position  = Header.EntryInstanceListOffset;
            for (uint i = 0; i < InstanceArrayRef.Length; ++i)
            {
                InstanceArrayRef[i] = reader.Read <STUInstanceArrayRef>();
            }

            InstanceFieldLists = new STUInstanceFieldList[Header.InstanceFieldListCount];
            Stream.Position    = Header.InstanceFieldListOffset;
            for (uint i = 0; i < InstanceFieldLists.Length; ++i)
            {
                InstanceFieldLists[i] = reader.Read <STUInstanceFieldList>();
            }


            InstanceFieldLists = new STUInstanceFieldList[Header.InstanceFieldListCount];
            Stream.Position    = Header.InstanceFieldListOffset;
            for (uint i = 0; i < InstanceFieldLists.Length; ++i)
            {
                InstanceFieldLists[i] = reader.Read <STUInstanceFieldList>();
            }

            InstanceFields = new STUInstanceField[Header.InstanceFieldListCount][];
            for (uint i = 0; i < InstanceFieldLists.Length; ++i)
            {
                InstanceFields[i] = new STUInstanceField[InstanceFieldLists[i].FieldCount];
                Stream.Position   = InstanceFieldLists[i].ListOffset;
                for (uint j = 0; j < InstanceFields[i].Length; ++j)
                {
                    InstanceFields[i][j] = reader.Read <STUInstanceField>();
                }
            }

            Metadata = new MemoryStream((int)Header.MetadataSize);
            Metadata.Write(reader.ReadBytes((int)Header.MetadataSize), 0, (int)Header.MetadataSize);
            Metadata.Position = 0;
            MetadataReader    = new BinaryReader(Metadata, Encoding.UTF8, false);

            return(true);
        }
Exemplo n.º 3
0
        public static void ListSTU(Stream file)
        {
            using (BinaryReader reader = new BinaryReader(file)) {
                STUHeader header = reader.Read <STUHeader>();

                Util.DumpStruct(header, "");
                Console.Out.WriteLine("{0} instances", header.InstanceCount);
                file.Position = header.InstanceListOffset;
                long totalSize = 0;
                for (uint i = 0; i < header.InstanceCount; ++i)
                {
                    STUInstanceRecord record = reader.Read <STUInstanceRecord>();
                    Console.Out.WriteLine("\t{0:X8} - {1:X8} - {2} - {3} bytes", record.InstanceChecksum, record.AssignFieldChecksum, record.AssignInstanceIndex, record.InstanceSize - 4);
                    long position = file.Position;
                    file.Position = header.Offset + totalSize;
                    int listIndex = reader.ReadInt32();
                    if (listIndex > -1 && (uint)listIndex >= header.InstanceFieldListCount)
                    {
                        throw new Exception();
                    }
                    Console.Out.WriteLine("\t\tfield list index {0:X}", listIndex);
                    file.Position = position;
                    totalSize    += record.InstanceSize;
                }
                Console.Out.WriteLine("Total: {0} bytes", totalSize);
                if (header.EntryInstanceCount > 0)
                {
                    Console.Out.WriteLine("{0} reference entries", header.EntryInstanceCount);
                    file.Position = header.EntryInstanceListOffset;
                    for (int i = (int)header.EntryInstanceCount; i > 0; --i)
                    {
                        STUInstanceField entry = reader.Read <STUInstanceField>();
                        Console.Out.WriteLine("\t\t{0:X8} - {1} bytes", entry.FieldChecksum, entry.FieldSize);
                    }
                }
                Console.Out.WriteLine("{0} variable lists", header.InstanceFieldListCount);
                file.Position = header.InstanceFieldListOffset;
                for (uint i = 0; i < header.InstanceFieldListCount; ++i)
                {
                    STUInstanceFieldList info = reader.Read <STUInstanceFieldList>();
                    Console.Out.WriteLine("\t{0} variables", info.FieldCount);
                    long tmp = file.Position;
                    file.Position = info.ListOffset;
                    totalSize     = 0;
                    for (uint j = 0; j < info.FieldCount; ++j)
                    {
                        STUInstanceField entry = reader.Read <STUInstanceField>();
                        Console.Out.WriteLine("\t\t{0:X8} - {1} bytes", entry.FieldChecksum, entry.FieldSize);
                        totalSize += entry.FieldSize;
                    }
                    Console.Out.WriteLine("\t\tTotal: {0} bytes", totalSize);
                    file.Position = tmp;
                }

                if (System.Diagnostics.Debugger.IsAttached)
                {
                    file.Position = 0;
                    ISTU stu = ISTU.NewInstance(file, uint.MaxValue);
                    System.Diagnostics.Debugger.Break();
                }
            }
        }