示例#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++;
                    }
                }
            }
        }
示例#2
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();
                }
            }
        }