123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397 |
- using System.Collections;
- using System.Collections.Generic;
- using System.IO;
- using UnityEngine;
- using static HybridCLR.Editor.GlobalManagers.UnityBinUtils;
- namespace HybridCLR.Editor.GlobalManagers
- {
- 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;
- }
- }
- }
|