| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397 | 
							- using System.Collections;
 
- using System.Collections.Generic;
 
- using System.IO;
 
- using UnityEngine;
 
- using static UnityFS.UnityBinUtils;
 
- namespace UnityFS
 
- {
 
-     public struct FileHeader
 
-     {
 
-         public const int kSize = 20;
 
-         public uint dataSize => fileSize - metadataSize;
 
-         public uint metadataSize;
 
-         public uint fileSize;
 
-         public uint version;
 
-         public uint dataOffset;
 
-         public byte endianess;
 
-         public void LoadFromStream(BinaryReader br)
 
-         {
 
-             long startPos = br.BaseStream.Position;
 
-             metadataSize = br.ReadUInt32();
 
-             fileSize = br.ReadUInt32();
 
-             version = br.ReadUInt32();
 
-             dataOffset = br.ReadUInt32();
 
-             endianess = br.ReadByte();
 
-             br.BaseStream.Position = startPos + kSize;
 
-             SwapEndianess();
 
-         }
 
-         public long SaveToStream(BinaryWriter bw)
 
-         {
 
-             SwapEndianess();
 
-             long startPos = bw.BaseStream.Position;
 
-             bw.Write(metadataSize);
 
-             bw.Write(fileSize);
 
-             bw.Write(version);
 
-             bw.Write(dataOffset);
 
-             bw.Write(endianess);
 
-             bw.BaseStream.Position = startPos + kSize;
 
-             return kSize;
 
-         }
 
-         void SwapEndianess()
 
-         {
 
-             SwapUInt(ref metadataSize);
 
-             SwapUInt(ref fileSize);
 
-             SwapUInt(ref version);
 
-             SwapUInt(ref dataOffset);
 
-         }
 
-     }
 
-     public struct MetaData
 
-     {
 
-         public long dataStartPos;
 
-         public string version;
 
-         public uint platform;
 
-         public bool enableTypeTree;
 
-         public int typeCount;
 
-         public ObjectType[] types;
 
-         public int objectCount;
 
-         public Dictionary<long, ObjectInfo> objects;
 
-         public int scriptTypeCount;
 
-         public ScriptType[] scriptTypes;
 
-         public int externalsCount;
 
-         public ExternalInfo[] externals;
 
- #if UNITY_2019_2_OR_NEWER
 
-         public int refTypeCount;
 
-         public ObjectType[] refTypes;
 
- #endif
 
-         public string dummyStr;
 
-         public void LoadFromStream(BinaryReader br, uint dataOffset)
 
-         {
 
-             long startPos = br.BaseStream.Position;
 
-             dataStartPos = startPos;
 
-             version = br.ReadRawString();
 
-             platform = br.ReadUInt32();
 
-             enableTypeTree = br.ReadBoolean();
 
-             typeCount = br.ReadInt32();
 
-             types = new ObjectType[typeCount];
 
-             for (int i = 0; i < typeCount; i++)
 
-             {
 
-                 types[i].LoadFromStream(br);
 
-             }
 
-             objectCount = br.ReadInt32();
 
-             objects = new Dictionary<long, ObjectInfo>();
 
-             for(int i = 0; i < objectCount; i++)
 
-             {
 
-                 long id = br.AlignedReadInt64();
 
-                 ObjectInfo objInfo = new ObjectInfo();
 
-                 objInfo.LoadFromStream(br);
 
-                 objInfo.realPos = objInfo.dataPos + dataOffset;
 
-                 objects.Add(id, objInfo);
 
-             }
 
-             scriptTypeCount = br.ReadInt32();
 
-             scriptTypes = new ScriptType[scriptTypeCount];
 
-             for(int i = 0; i < scriptTypeCount; i++)
 
-             {
 
-                 scriptTypes[i].LoadFromStream(br);
 
-             }
 
-             externalsCount = br.ReadInt32();
 
-             externals = new ExternalInfo[externalsCount];
 
-             for(int i = 0; i < externalsCount; i++)
 
-             {
 
-                 externals[i].LoadFromStream(br);
 
-             }
 
- #if UNITY_2019_2_OR_NEWER
 
-             refTypeCount = br.ReadInt32();
 
-             refTypes = new ObjectType[refTypeCount];
 
-             for(int i = 0; i < refTypeCount; i++)
 
-             {
 
-                 refTypes[i].LoadFromStream(br);
 
-             }
 
- #endif
 
-             dummyStr = br.ReadRawString();
 
-         }
 
-         public long SaveToStream(BinaryWriter bw)
 
-         {
 
-             long startPos = bw.BaseStream.Position;
 
-             bw.WriteRawString(version);
 
-             bw.Write(platform);
 
-             bw.Write(enableTypeTree);
 
-             
 
-             bw.Write(typeCount);
 
-             foreach(var type in types)
 
-                 type.SaveToStream(bw);
 
-             bw.Write(objectCount);
 
-             foreach (var kv in objects)
 
-             {
 
-                 bw.AlignedWriteInt64(kv.Key);
 
-                 kv.Value.SaveToStream(bw);
 
-             }
 
-                 
 
-             bw.Write(scriptTypeCount);
 
-             foreach(var st in scriptTypes)
 
-                 st.SaveToStream(bw);
 
-             bw.Write(externalsCount);
 
-             foreach(var external in externals)
 
-                 external.SaveToStream(bw);
 
- #if UNITY_2019_2_OR_NEWER
 
-             bw.Write(refTypeCount);
 
-             foreach(var refT in refTypes)
 
-                 refT.SaveToStream(bw);
 
- #endif
 
-             bw.WriteRawString(dummyStr);
 
-             return bw.BaseStream.Position - startPos;
 
-         }
 
-         public ScriptsData GetScriptData(BinaryReader br)
 
-         {
 
-             ObjectInfo objInfo = objects[UnityBinFile.kMonoManagerIdx];
 
-             br.BaseStream.Seek(objInfo.realPos, SeekOrigin.Begin);
 
-             ScriptsData data = new ScriptsData();
 
-             data.LoadFromStream(br);
 
-             return data;
 
-         }
 
-     }
 
-     public struct ObjectType
 
-     {
 
-         public int typeID;
 
-         public bool isStriped;
 
-         public short scriptTypeIndex;
 
-         public bool needReadScriptHash; // dont save
 
-         public Hash scriptSigHash;
 
-         public Hash typeHash;
 
-         public void LoadFromStream(BinaryReader br)
 
-         {
 
-             typeID = br.ReadInt32();
 
-             isStriped = br.ReadBoolean();
 
-             scriptTypeIndex = br.ReadInt16();
 
-             needReadScriptHash = typeID == -1 || typeID == 0x72;
 
-             if(needReadScriptHash)
 
-                 scriptSigHash.LoadFromStream(br);
 
-             typeHash.LoadFromStream(br);
 
-             // GlobalManagers does not has TypeTrees
 
-         }
 
-         public long SaveToStream(BinaryWriter bw)
 
-         {
 
-             long startPos = bw.BaseStream.Position;
 
-             bw.Write(typeID);
 
-             bw.Write(isStriped);
 
-             bw.Write(scriptTypeIndex);
 
-             
 
-             if(needReadScriptHash)
 
-                 scriptSigHash.SaveToStream(bw);
 
-             typeHash.SaveToStream(bw);
 
-             return bw.BaseStream.Position - startPos;
 
-         }
 
-         public int Size()
 
-         {
 
-             int ret = 0;
 
-             ret += sizeof(int);
 
-             ret += sizeof(bool);
 
-             ret += sizeof(short);
 
-             if (needReadScriptHash)
 
-                 ret += Hash.kSize;
 
-             ret += Hash.kSize;
 
-             return ret;
 
-         }
 
-     }
 
-     public struct ObjectInfo
 
-     {
 
-         public const int kSize = 12;
 
-         public uint dataPos;
 
-         public uint size;
 
-         public uint typeID;
 
-         public uint realPos; // dataPos + Header.dataOffset; // dont save
 
-         public void LoadFromStream(BinaryReader br)
 
-         {
 
-             dataPos = br.ReadUInt32();
 
-             size = br.ReadUInt32();
 
-             typeID = br.ReadUInt32();
 
-         }
 
-         public long SaveToStream(BinaryWriter bw)
 
-         {
 
-             bw.Write(dataPos);
 
-             bw.Write(size);
 
-             bw.Write(typeID);
 
-             return kSize;
 
-         }
 
-     }
 
-     public struct ScriptType
 
-     {
 
-         public int localFileIndex;
 
-         public long localIdentifierOfBin;
 
-         public void LoadFromStream(BinaryReader br)
 
-         {
 
-             localFileIndex = br.ReadInt32();
 
-             localIdentifierOfBin = br.AlignedReadInt64();
 
-         }
 
-         public long SaveToStream(BinaryWriter bw)
 
-         {
 
-             long startPos = bw.BaseStream.Position;
 
-             bw.Write(localFileIndex);
 
-             bw.AlignedWriteInt64(localIdentifierOfBin);
 
-             return bw.BaseStream.Position - startPos;
 
-         }
 
-     }
 
-     public struct ExternalInfo
 
-     {
 
-         public string dummy;
 
-         public Hash guid;
 
-         public int type;
 
-         public string name;
 
-         
 
-         public void LoadFromStream(BinaryReader br)
 
-         {
 
-             dummy = br.ReadRawString();
 
-             guid.LoadFromStream(br);
 
-             type = br.ReadInt32();
 
-             name = br.ReadRawString();
 
-         }
 
-         public long SaveToStream(BinaryWriter bw)
 
-         {
 
-             long startPos = bw.BaseStream.Position;
 
-             bw.WriteRawString(dummy);
 
-             guid.SaveToStream(bw);
 
-             bw.Write(type);
 
-             bw.WriteRawString(name);
 
-             return bw.BaseStream.Position - startPos;
 
-         }
 
-     }
 
-     public struct ScriptsData
 
-     {
 
-         public ScriptID[] scriptIDs;
 
-         public List<string> dllNames;
 
-         public List<int> dllTypes; // 16 is user type
 
-         public void LoadFromStream(BinaryReader br)
 
-         {
 
-             {
 
-                 int count = br.ReadInt32();
 
-                 scriptIDs = new ScriptID[count];
 
-                 for(int i = 0; i < count; i++)
 
-                     scriptIDs[i].LoadFromStream(br);
 
-             }
 
-             {
 
-                 int count = br.ReadInt32();
 
-                 dllNames = new List<string>(count);
 
-                 for (var i = 0; i < count; i++)
 
-                     dllNames.Add(br.ReadSizeString());
 
-             }
 
-             {
 
-                 int count = br.ReadInt32();
 
-                 dllTypes = new List<int>(count);
 
-                 for(var i = 0; i < count; i++)
 
-                     dllTypes.Add(br.ReadInt32());
 
-             }
 
-         }
 
-         public long SaveToStream(BinaryWriter bw)
 
-         {
 
-             long startPos = bw.BaseStream.Position;
 
-             bw.Write(scriptIDs.Length);
 
-             for(int i = 0; i < scriptIDs.Length; i++)
 
-                 scriptIDs[i].SaveToStream(bw);
 
-             bw.Write(dllNames.Count);
 
-             for(int i = 0, imax = dllNames.Count; i < imax; i++)
 
-                 bw.WriteSizeString(dllNames[i]);
 
-             bw.Write(dllTypes.Count);
 
-             for(int i = 0, imax = dllTypes.Count; i < imax; i++)
 
-                 bw.Write(dllTypes[i]);
 
-             return bw.BaseStream.Position - startPos;
 
-         }
 
-     }
 
-     public struct ScriptID
 
-     {
 
-         public int fileID;
 
-         public long pathID; // localIdentifier
 
-         public void LoadFromStream(BinaryReader br)
 
-         {
 
-             fileID = br.ReadInt32();
 
-             pathID = br.ReadInt64();
 
-         }
 
-         public long SaveToStream(BinaryWriter bw)
 
-         {
 
-             bw.Write(fileID);
 
-             bw.Write(pathID);
 
-             return 4 + 8;
 
-         }
 
-     }
 
-     public struct Hash
 
-     {
 
-         public const int kSize = 16;
 
-         public int[] data;
 
-         public void LoadFromStream(BinaryReader br)
 
-         {
 
-             data = new int[4];
 
-             for(int i = 0; i < data.Length; i++)
 
-             {
 
-                 data[i] = br.ReadInt32();
 
-             }
 
-         }
 
-         public long SaveToStream(BinaryWriter bw)
 
-         {
 
-             for(int i = 0; i < data.Length; i++)
 
-             {
 
-                 bw.Write(data[i]);
 
-             }
 
-             return kSize;
 
-         }
 
-     }
 
- }
 
 
  |