|
@@ -1,397 +0,0 @@
|
|
|
-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;
|
|
|
- }
|
|
|
- }
|
|
|
-}
|