public void Read(AssetsFileReader reader) { reader.bigEndian = false; magic = reader.ReadStringLength(4); fileVersion = reader.ReadByte(); compressionType = reader.ReadByte(); stringTableOffset = reader.ReadUInt32(); stringTableLenUncompressed = reader.ReadUInt32(); stringTableLenCompressed = reader.ReadUInt32(); if (fileVersion == 1) //is this even right? { fileBlockSize = reader.ReadUInt32(); } else { fileBlockSize = 0; } fileCount = reader.ReadUInt32(); files = new List <ClassDatabaseFileRef>(); for (int i = 0; i < fileCount; i++) { files.Add(new ClassDatabaseFileRef() { offset = reader.ReadUInt32(), length = reader.ReadUInt32(), name = reader.ReadStringLength(15) }); } }
public ulong Read(uint version, ulong pos, AssetsFileReader reader, bool bigEndian) { if (version >= 0x0E) { index = reader.ReadUInt64(); } else { index = reader.ReadUInt32(); } offs_curFile = reader.ReadUInt32(); curFileSize = reader.ReadUInt32(); curFileTypeOrIndex = reader.ReadUInt32(); if (version < 0x10) { inheritedUnityClass = reader.ReadUInt16(); } if (version <= 0x10) { scriptIndex = reader.ReadUInt16(); } if (0x0F <= version && version <= 0x10) { unknown1 = reader.ReadByte(); reader.ReadBytes(3); } return(reader.Position); }
public void Read(uint version, AssetsFileReader reader) { if (version >= 0x0E) { index = reader.ReadInt64(); } else { index = reader.ReadUInt32(); } curFileOffset = reader.ReadUInt32(); curFileSize = reader.ReadUInt32(); curFileTypeOrIndex = reader.ReadInt32(); if (version < 0x10) { inheritedUnityClass = reader.ReadUInt16(); } if (version <= 0x10) { scriptIndex = reader.ReadUInt16(); } if (0x0F <= version && version <= 0x10) { unknown1 = reader.ReadByte(); reader.ReadBytes(3); } }
public byte[] unknown; //0x11, for format >= 9 ///public uint GetSizeBytes(); public void Read(AssetsFileReader reader) { metadataSize = reader.ReadUInt32(); fileSize = reader.ReadUInt32(); format = reader.ReadUInt32(); firstFileOffset = reader.ReadUInt32(); endianness = reader.ReadByte(); reader.bigEndian = endianness == 1 ? true : false; unknown = reader.ReadBytes(3); }
public void Read(AssetsFileReader reader, uint format) { version = reader.ReadUInt16(); depth = reader.ReadByte(); isArray = reader.ReadByte(); typeStringOffset = reader.ReadUInt32(); nameStringOffset = reader.ReadUInt32(); size = reader.ReadInt32(); index = reader.ReadUInt32(); flags = reader.ReadUInt32(); if (format >= 0x12) { unknown = reader.ReadBytes(8); } else { unknown = new byte[0]; } }
public void Read(AssetsFileReader reader) { reader.bigEndian = false; header = reader.ReadStringLength(4); if (header != "cldb") { throw new Exception("header not detected. is this a cldb file?"); } fileVersion = reader.ReadByte(); flags = 0; if (fileVersion == 4) { flags = reader.ReadByte(); } switch (fileVersion) { case 1: compressionType = 0; break; case 2: compressionType = reader.ReadByte(); break; case 3: case 4: compressionType = reader.ReadByte(); compressedSize = reader.ReadUInt32(); uncompressedSize = reader.ReadUInt32(); break; default: return; } unityVersionCount = reader.ReadByte(); unityVersions = new string[unityVersionCount]; for (int i = 0; i < unityVersionCount; i++) { unityVersions[i] = reader.ReadCountString(); } stringTableLen = reader.ReadUInt32(); stringTablePos = reader.ReadUInt32(); }
public byte[] unknown; //0x11, for format >= 9 ///public uint GetSizeBytes(); public ulong Read(ulong absFilePos, AssetsFileReader reader) { metadataSize = reader.ReadUInt32(); fileSize = reader.ReadUInt32(); format = reader.ReadUInt32(); offs_firstFile = reader.ReadUInt32(); endianness = reader.ReadByte(); reader.bigEndian = endianness == 1 ? true : false; unknown = reader.ReadBytes(3); return(reader.Position); }
public void Read(AssetsFileReader reader) { metadataSize = reader.ReadUInt32(); fileSize = reader.ReadUInt32(); format = reader.ReadUInt32(); firstFileOffset = reader.ReadUInt32(); endianness = reader.ReadByte(); //todo "fileSize - metadataSize" for v<9 but I have no files to test on reader.bigEndian = endianness == 1 ? true : false; unknown = reader.ReadBytes(3); reader.Align(); }
public byte[] unknown; //0x18 public ulong Read(ulong absFilePos, AssetsFileReader reader, uint format, bool bigEndian) { version = reader.ReadUInt16(); depth = reader.ReadByte(); isArray = reader.ReadByte(); typeStringOffset = reader.ReadUInt32(); nameStringOffset = reader.ReadUInt32(); size = reader.ReadUInt32(); index = reader.ReadUInt32(); flags = reader.ReadUInt32(); if (format >= 0x12) { unknown = reader.ReadBytes(8); } else { unknown = new byte[0]; } return(reader.Position); }
public byte[] bufferedPath; //for buffered (type=1) public ulong Read(ulong absFilePos, AssetsFileReader reader, bool bigEndian) { bufferedPath = new byte[] { reader.ReadByte() }; //-Dunno why it's here but it is guid = new GUID128(); guid.Read(reader.Position, reader); type = reader.ReadInt32(); assetPath = reader.ReadNullTerminated(); //todo: the switchero was here for testing purposes, should be handled by application for full control if (assetPath.StartsWith("library/")) { assetPath = "Resources\\" + assetPath.Substring(8); } return(reader.Position); }
public bool IsAssetsFile(AssetsFileReader reader, AssetBundleDirectoryInfo06 entry) { //todo - not fully implemented long offset = bundleHeader6.GetFileDataOffset() + entry.offset; if (entry.decompressedSize < 0x30) { return(false); } reader.Position = offset; string possibleBundleHeader = reader.ReadStringLength(7); if (possibleBundleHeader == "UnityFS") { return(false); } reader.Position = offset + 0x08; int possibleFormat = reader.ReadInt32(); if (possibleFormat > 99) { return(false); } reader.Position = offset + 0x14; if (possibleFormat >= 0x16) { reader.Position += 0x1c; } string possibleVersion = ""; char curChar; while (reader.Position < reader.BaseStream.Length && (curChar = (char)reader.ReadByte()) != 0x00) { possibleVersion += curChar; if (possibleVersion.Length > 0xFF) { return(false); } } string emptyVersion = Regex.Replace(possibleVersion, "[a-zA-Z0-9\\.]", ""); string fullVersion = Regex.Replace(possibleVersion, "[^a-zA-Z0-9\\.]", ""); return(emptyVersion == "" && fullVersion.Length > 0); }
public ulong Read(AssetsFileReader reader, ulong filePos) { reader.bigEndian = false; header = reader.ReadStringLength(4); if (header != "cldb") { return(reader.Position); } fileVersion = reader.ReadByte(); switch (fileVersion) { case 1: break; case 3: compressionType = reader.ReadByte(); if (compressionType != 0) { return(reader.Position); } compressedSize = reader.ReadUInt32(); uncompressedSize = reader.ReadUInt32(); break; default: return(reader.Position); } unityVersionCount = reader.ReadByte(); pUnityVersions = new string[unityVersionCount]; for (int i = 0; i < unityVersionCount; i++) { pUnityVersions[i] = reader.ReadCountString(); } stringTableLen = reader.ReadUInt32(); stringTablePos = reader.ReadUInt32(); return(reader.Position); }
public void Read(bool hasTypeTree, AssetsFileReader reader, uint version) { classId = reader.ReadInt32(); if (version >= 0x10) { unknown16_1 = reader.ReadByte(); } if (version >= 0x11) { scriptIndex = reader.ReadUInt16(); } else { scriptIndex = 0xffff; } if ((version < 0x11 && classId < 0) || (version >= 0x11 && classId == 0x72)) { scriptHash1 = reader.ReadUInt32(); scriptHash2 = reader.ReadUInt32(); scriptHash3 = reader.ReadUInt32(); scriptHash4 = reader.ReadUInt32(); } typeHash1 = reader.ReadUInt32(); typeHash2 = reader.ReadUInt32(); typeHash3 = reader.ReadUInt32(); typeHash4 = reader.ReadUInt32(); if (hasTypeTree) { typeFieldsExCount = reader.ReadUInt32(); stringTableLen = reader.ReadUInt32(); typeFieldsEx = new TypeField_0D[typeFieldsExCount]; for (int i = 0; i < typeFieldsExCount; i++) { TypeField_0D typefield0d = new TypeField_0D(); typefield0d.Read(reader, version); typeFieldsEx[i] = typefield0d; } stringTable = Encoding.UTF8.GetString(reader.ReadBytes((int)stringTableLen)); if (version >= 0x15) { dependenciesCount = reader.ReadInt32(); dependencies = new int[dependenciesCount]; for (int i = 0; i < dependenciesCount; i++) { dependencies[i] = reader.ReadInt32(); } } } }
public static bool IsAssetsFile(AssetsFileReader reader, long offset, long length) { //todo - not fully implemented if (length < 0x30) { return(false); } reader.Position = offset; string possibleBundleHeader = reader.ReadStringLength(5); if (possibleBundleHeader == "Unity") { return(false); } reader.Position = offset + 0x08; int possibleFormat = reader.ReadInt32(); if (possibleFormat > 99) { return(false); } reader.Position = offset + 0x14; if (possibleFormat >= 0x16) { reader.Position += 0x1c; } string possibleVersion = ""; char curChar; while (reader.Position < reader.BaseStream.Length && (curChar = (char)reader.ReadByte()) != 0x00) { possibleVersion += curChar; if (possibleVersion.Length > 0xFF) { return(false); } } string emptyVersion = Regex.Replace(possibleVersion, "[a-zA-Z0-9\\.\\n]", ""); string fullVersion = Regex.Replace(possibleVersion, "[^a-zA-Z0-9\\.\\n]", ""); return(emptyVersion == "" && fullVersion.Length > 0); }
public void Read(AssetsFileReader reader) { metadataSize = reader.ReadUInt32(); fileSize = reader.ReadUInt32(); format = reader.ReadUInt32(); firstFileOffset = reader.ReadUInt32(); endianness = reader.ReadByte(); //todo "fileSize - metadataSize" for v<9 but I have no files to test on unknown = reader.ReadBytes(3); reader.Align(); if (format >= 0x16) { metadataSize = reader.ReadUInt32(); fileSize = reader.ReadInt64(); firstFileOffset = reader.ReadInt64(); reader.Position += 8; } reader.bigEndian = endianness == 1; }
public void Read(AssetsFileReader reader) { metadataSize = reader.ReadUInt32(); fileSize = reader.ReadUInt32(); format = reader.ReadUInt32(); firstFileOffset = reader.ReadUInt32(); if (format < 9) { endianness = reader.ReadByte(); } else { endianness = 0; } reader.bigEndian = endianness == 1 ? true : false; if (format >= 9) { unknown = reader.ReadBytes(3); } reader.Align(); }
public ulong Read(bool hasTypeTree, ulong absFilePos, AssetsFileReader reader, uint version, uint typeVersion, bool bigEndian) { classId = reader.ReadInt32(); if (version >= 0x10) { unknown16_1 = reader.ReadByte(); } if (version >= 0x11) { scriptIndex = reader.ReadUInt16(); } //if ((version < 0x11 && classId < 0) || (version >= 0x11 && scriptIndex != 0xFFFF)) //original is if (classId == 114) //if ((version < 0x11 && classId < 0) || (version >= 0x11 && scriptIndex != 0xFFFF)) if ((version < 0x11 && classId < 0) || (version >= 0x11 && classId == 114)) { unknown1 = reader.ReadUInt32(); unknown2 = reader.ReadUInt32(); unknown3 = reader.ReadUInt32(); unknown4 = reader.ReadUInt32(); } unknown5 = reader.ReadUInt32(); unknown6 = reader.ReadUInt32(); unknown7 = reader.ReadUInt32(); unknown8 = reader.ReadUInt32(); if (hasTypeTree) { typeFieldsExCount = reader.ReadUInt32(); stringTableLen = reader.ReadUInt32(); pTypeFieldsEx = new TypeField_0D[typeFieldsExCount]; for (int i = 0; i < typeFieldsExCount; i++) { TypeField_0D typefield0d = new TypeField_0D(); typefield0d.Read(reader.Position, reader, version, bigEndian); pTypeFieldsEx[i] = typefield0d; } pStringTable = Encoding.UTF8.GetString(reader.ReadBytes((int)stringTableLen)); } return(reader.Position); }
public void Read(AssetsFileReader reader) { metadataSize = reader.ReadUInt32(); fileSize = reader.ReadUInt32(); format = reader.ReadUInt32(); firstFileOffset = reader.ReadUInt32(); endianness = reader.ReadByte(); //todo "fileSize - metadataSize" for v<9 but I have no files to test on unknown = reader.ReadBytes(3); reader.Align(); if (format >= 0x16) { metadataSize = reader.ReadUInt32(); fileSize = reader.ReadInt64(); firstFileOffset = reader.ReadInt64(); } reader.bigEndian = endianness == 1; if (format >= 0x16) { unknown1 = reader.ReadUInt32(); //seen as 0x00 everywhere unknown2 = reader.ReadUInt32(); //seen as 0x1b in bundles and 0x00 everywhere else } }
public AssetTypeValueField ReadType(AssetsFileReader reader, ulong filePos, AssetTypeValueField valueField, bool bigEndian) { if (valueField.templateField.isArray) { if (valueField.templateField.childrenCount == 2) { EnumValueTypes sizeType = valueField.templateField.children[0].valueType; if (sizeType == EnumValueTypes.ValueType_Int32 || sizeType == EnumValueTypes.ValueType_UInt32) { valueField.childrenCount = reader.ReadUInt32(); valueField.pChildren = new AssetTypeValueField[valueField.childrenCount]; for (int i = 0; i < valueField.childrenCount; i++) { valueField.pChildren[i] = new AssetTypeValueField(); valueField.pChildren[i].templateField = valueField.templateField.children[1]; valueField.pChildren[i] = ReadType(reader, reader.Position, valueField.pChildren[i], bigEndian); } if (valueField.templateField.align) { reader.Align(); } AssetTypeArray ata = new AssetTypeArray(); ata.size = valueField.childrenCount; valueField.value = new AssetTypeValue(EnumValueTypes.ValueType_Array, 0); valueField.value.Set(ata); } else { Debug.WriteLine("Invalid array value type! Found an unexpected " + sizeType.ToString() + " type instead!"); } } else { Debug.WriteLine("Invalid array!"); } } else { EnumValueTypes type = valueField.templateField.valueType; if (type != 0) { valueField.value = new AssetTypeValue(type, 0); } if (type == EnumValueTypes.ValueType_String) { valueField.value.Set(reader.ReadCountStringInt32()); reader.Align(); } else { valueField.childrenCount = valueField.templateField.childrenCount; if (valueField.childrenCount == 0) { valueField.pChildren = new AssetTypeValueField[0]; switch (valueField.templateField.valueType) { case EnumValueTypes.ValueType_Int8: valueField.value.Set(reader.ReadSByte()); if (valueField.templateField.align) { reader.Align(); } break; case EnumValueTypes.ValueType_UInt8: case EnumValueTypes.ValueType_Bool: valueField.value.Set(reader.ReadByte()); if (valueField.templateField.align) { reader.Align(); } break; case EnumValueTypes.ValueType_Int16: valueField.value.Set(reader.ReadInt16()); if (valueField.templateField.align) { reader.Align(); } break; case EnumValueTypes.ValueType_UInt16: valueField.value.Set(reader.ReadUInt16()); if (valueField.templateField.align) { reader.Align(); } break; case EnumValueTypes.ValueType_Int32: valueField.value.Set(reader.ReadInt32()); break; case EnumValueTypes.ValueType_UInt32: valueField.value.Set(reader.ReadUInt32()); break; case EnumValueTypes.ValueType_Int64: valueField.value.Set(reader.ReadInt64()); break; case EnumValueTypes.ValueType_UInt64: valueField.value.Set(reader.ReadUInt64()); break; case EnumValueTypes.ValueType_Float: valueField.value.Set(reader.ReadSingle()); break; case EnumValueTypes.ValueType_Double: valueField.value.Set(reader.ReadDouble()); break; } } else { valueField.pChildren = new AssetTypeValueField[valueField.childrenCount]; for (int i = 0; i < valueField.childrenCount; i++) { valueField.pChildren[i] = new AssetTypeValueField(); valueField.pChildren[i].templateField = valueField.templateField.children[i]; valueField.pChildren[i] = ReadType(reader, reader.Position, valueField.pChildren[i], bigEndian); } if (valueField.templateField.align) { reader.Align(); } } } } return(valueField); }
public AssetTypeValueField ReadType(AssetsFileReader reader, AssetTypeValueField valueField) { if (valueField.templateField.isArray) { if (valueField.templateField.childrenCount == 2) { EnumValueTypes sizeType = valueField.templateField.children[0].valueType; if (sizeType == EnumValueTypes.Int32 || sizeType == EnumValueTypes.UInt32) { if (valueField.templateField.valueType == EnumValueTypes.ByteArray) { valueField.childrenCount = 0; valueField.children = new AssetTypeValueField[0]; int size = reader.ReadInt32(); byte[] data = reader.ReadBytes(size); if (valueField.templateField.align) { reader.Align(); } AssetTypeByteArray atba = new AssetTypeByteArray(); atba.size = (uint)size; atba.data = data; valueField.value = new AssetTypeValue(EnumValueTypes.ByteArray, atba); } else { valueField.childrenCount = reader.ReadInt32(); valueField.children = new AssetTypeValueField[valueField.childrenCount]; for (int i = 0; i < valueField.childrenCount; i++) { valueField.children[i] = new AssetTypeValueField(); valueField.children[i].templateField = valueField.templateField.children[1]; valueField.children[i] = ReadType(reader, valueField.children[i]); } if (valueField.templateField.align) { reader.Align(); } AssetTypeArray ata = new AssetTypeArray(); ata.size = valueField.childrenCount; valueField.value = new AssetTypeValue(EnumValueTypes.Array, ata); } } else { throw new Exception("Invalid array value type! Found an unexpected " + sizeType.ToString() + " type instead!"); } } else { throw new Exception("Invalid array!"); } } else { EnumValueTypes type = valueField.templateField.valueType; if (type != 0) { valueField.value = new AssetTypeValue(type, null); } if (type == EnumValueTypes.String) { int length = reader.ReadInt32(); valueField.value.Set(reader.ReadBytes(length)); reader.Align(); } else { valueField.childrenCount = valueField.templateField.childrenCount; if (valueField.childrenCount == 0) { valueField.children = new AssetTypeValueField[0]; switch (valueField.templateField.valueType) { case EnumValueTypes.Int8: valueField.value.Set(reader.ReadSByte()); if (valueField.templateField.align) { reader.Align(); } break; case EnumValueTypes.UInt8: case EnumValueTypes.Bool: valueField.value.Set(reader.ReadByte()); if (valueField.templateField.align) { reader.Align(); } break; case EnumValueTypes.Int16: valueField.value.Set(reader.ReadInt16()); if (valueField.templateField.align) { reader.Align(); } break; case EnumValueTypes.UInt16: valueField.value.Set(reader.ReadUInt16()); if (valueField.templateField.align) { reader.Align(); } break; case EnumValueTypes.Int32: valueField.value.Set(reader.ReadInt32()); break; case EnumValueTypes.UInt32: valueField.value.Set(reader.ReadUInt32()); break; case EnumValueTypes.Int64: valueField.value.Set(reader.ReadInt64()); break; case EnumValueTypes.UInt64: valueField.value.Set(reader.ReadUInt64()); break; case EnumValueTypes.Float: valueField.value.Set(reader.ReadSingle()); break; case EnumValueTypes.Double: valueField.value.Set(reader.ReadDouble()); break; } } else { valueField.children = new AssetTypeValueField[valueField.childrenCount]; for (int i = 0; i < valueField.childrenCount; i++) { valueField.children[i] = new AssetTypeValueField(); valueField.children[i].templateField = valueField.templateField.children[i]; valueField.children[i] = ReadType(reader, valueField.children[i]); } if (valueField.templateField.align) { reader.Align(); } } } } return(valueField); }