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++; } } } }
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); }
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(); } } }