Beispiel #1
0
        private void LoadAssetsFile(string fullName, EndianBinaryReader reader)
        {
            var fileName = Path.GetFileName(fullName);

            if (!assetsFileListHash.Contains(fileName))
            {
                Logger.Info($"Loading {fileName}");
                try
                {
                    var assetsFile = new SerializedFile(this, fullName, reader);
                    assetsFileList.Add(assetsFile);
                    assetsFileListHash.Add(assetsFile.fileName);

                    foreach (var sharedFile in assetsFile.m_Externals)
                    {
                        var sharedFilePath = Path.Combine(Path.GetDirectoryName(fullName), sharedFile.fileName);
                        var sharedFileName = sharedFile.fileName;

                        if (!importFilesHash.Contains(sharedFileName))
                        {
                            if (!File.Exists(sharedFilePath))
                            {
                                var findFiles = Directory.GetFiles(Path.GetDirectoryName(fullName), sharedFileName, SearchOption.AllDirectories);
                                if (findFiles.Length > 0)
                                {
                                    sharedFilePath = findFiles[0];
                                }
                            }

                            if (File.Exists(sharedFilePath))
                            {
                                importFiles.Add(sharedFilePath);
                                importFilesHash.Add(sharedFileName);
                            }
                        }
                    }
                }
                catch (Exception e)
                {
                    Logger.Error($"Error while reading assets file {fileName}", e);
                    reader.Dispose();
                }
            }
            else
            {
                reader.Dispose();
            }
        }
Beispiel #2
0
        private void LoadAssetsFile(string fullName, EndianBinaryReader reader)
        {
            var fileName = Path.GetFileName(fullName);

            if (!assetsFileListHash.Contains(fileName))
            {
                Logger.Info($"Loading {fileName}");
                try
                {
                    var assetsFile = new SerializedFile(this, fullName, reader);
                    assetsFileList.Add(assetsFile);
                    assetsFileListHash.Add(assetsFile.fileName);

                    //foreach (var sharedFile in assetsFile.m_Externals)
                    //{
                    //    var sharedFilePath = Path.GetDirectoryName(fullName) + "\\" + sharedFile.fileName;
                    //    var sharedFileName = sharedFile.fileName;

                    //    if (!importFilesHash.Contains(sharedFileName))
                    //    {
                    //        if (!File.Exists(sharedFilePath))
                    //        {
                    //            var findFiles = Directory.GetFiles(Path.GetDirectoryName(fullName), sharedFileName, SearchOption.AllDirectories);
                    //            if (findFiles.Length > 0)
                    //            {
                    //                sharedFilePath = findFiles[0];
                    //            }
                    //        }

                    //        if (File.Exists(sharedFilePath))
                    //        {
                    //            importFiles.Add(sharedFilePath);
                    //            importFilesHash.Add(sharedFileName);
                    //        }
                    //    }
                    //}
                }
                catch
                {
                    reader.Dispose();
                    //Logger.Warning($"Unable to load assets file {fileName}");
                }
            }
            else
            {
                reader.Dispose();
            }
        }
Beispiel #3
0
        private static void LoadWebFile(string fullName, EndianBinaryReader reader)
        {
            var fileName = Path.GetFileName(fullName);

            StatusStripUpdate("Loading " + fileName);
            var webFile = new WebFile(reader);

            reader.Dispose();
            foreach (var file in webFile.fileList)
            {
                var dummyName = Path.GetDirectoryName(fullName) + "\\" + file.fileName;
                switch (CheckFileType(file.stream, out reader))
                {
                case FileType.AssetsFile:
                    LoadAssetsFile(dummyName, reader, fullName);
                    break;

                case FileType.BundleFile:
                    LoadBundleFile(dummyName, reader, fullName);
                    break;

                case FileType.WebFile:
                    LoadWebFile(dummyName, reader);
                    break;
                }
                resourceFileReaders.Add(file.fileName.ToUpper(), reader);
            }
        }
Beispiel #4
0
        private static int ExtractBundleFile(string bundleFileName)
        {
            int extractedCount = 0;
            var extractPath    = bundleFileName + "_unpacked\\";

            Directory.CreateDirectory(extractPath);
            var reader     = new EndianBinaryReader(File.OpenRead(bundleFileName));
            var bundleFile = new BundleFile(reader);

            reader.Dispose();
            if (bundleFile.fileList.Count > 0)
            {
                StatusStripUpdate($"Decompressing {Path.GetFileName(bundleFileName)} ...");
                foreach (var memFile in bundleFile.fileList)
                {
                    var filePath = extractPath + memFile.fileName.Replace('/', '\\');
                    if (!Directory.Exists(Path.GetDirectoryName(filePath)))
                    {
                        Directory.CreateDirectory(Path.GetDirectoryName(filePath));
                    }
                    if (!File.Exists(filePath))
                    {
                        File.WriteAllBytes(filePath, memFile.stream.ToArray());
                        memFile.stream.Dispose();
                        extractedCount += 1;
                    }
                }
            }
            return(extractedCount);
        }
Beispiel #5
0
        private void LoadWebFile(string fullName, EndianBinaryReader reader)
        {
            var fileName = Path.GetFileName(fullName);

            Logger.Info("Loading " + fileName);
            var webFile = new WebFile(reader);

            reader.Dispose();
            foreach (var file in webFile.fileList)
            {
                var dummyPath = Path.GetDirectoryName(fullName) + "\\" + file.fileName;
                switch (CheckFileType(file.stream, out reader))
                {
                case FileType.AssetsFile:
                    LoadAssetsFromMemory(dummyPath, reader, fullName);
                    break;

                case FileType.BundleFile:
                    LoadBundleFile(dummyPath, reader, fullName);
                    break;

                case FileType.WebFile:
                    LoadWebFile(dummyPath, reader);
                    break;
                }
            }
        }
        private void LoadBundleFile(string fullName, EndianBinaryReader reader, string parentPath = null)
        {
            var fileName = Path.GetFileName(fullName);

            Logger.Info("Loading " + fileName);
            try
            {
                var bundleFile = new BundleFile(reader, fullName);
                foreach (var file in bundleFile.fileList)
                {
                    var dummyPath = Path.GetDirectoryName(fullName) + "\\" + file.fileName;
                    LoadAssetsFromMemory(dummyPath, new EndianBinaryReader(file.stream), parentPath ?? fullName, bundleFile.versionEngine);
                }
            }
            catch
            {
                /*var str = $"Unable to load bundle file {fileName}";
                 * if (parentPath != null)
                 * {
                 *  str += $" from {Path.GetFileName(parentPath)}";
                 * }
                 * Logger.Error(str);*/
            }
            finally
            {
                reader.Dispose();
            }
        }
Beispiel #7
0
 public void Dispose()
 {
     this.m_BlocksInfo    = null;
     this.m_Header        = null;
     this.m_DirectoryInfo = null;
     reader?.Dispose();
 }
Beispiel #8
0
        private void LoadAssetsFile(string fullName, EndianBinaryReader reader)
        {
            var fileName = Path.GetFileName(fullName);

            if (!assetsfileListHash.Contains(fileName.ToUpper()))
            {
                Logger.Info($"Loading {fileName}");
                var assetsFile = new SerializedFile(this, fullName, reader);
                if (assetsFile.valid)
                {
                    assetsFileList.Add(assetsFile);
                    assetsfileListHash.Add(assetsFile.upperFileName);

                    foreach (var sharedFile in assetsFile.m_Externals)
                    {
                        var sharedFilePath = Path.GetDirectoryName(fullName) + "\\" + sharedFile.fileName;
                        var sharedFileName = sharedFile.fileName;

                        if (!importFilesHash.Contains(sharedFileName.ToUpper()))
                        {
                            if (!File.Exists(sharedFilePath))
                            {
                                var findFiles = Directory.GetFiles(Path.GetDirectoryName(fullName), sharedFileName, SearchOption.AllDirectories);
                                if (findFiles.Length > 0)
                                {
                                    sharedFilePath = findFiles[0];
                                }
                            }

                            if (File.Exists(sharedFilePath))
                            {
                                importFiles.Add(sharedFilePath);
                                importFilesHash.Add(sharedFileName.ToUpper());
                            }
                        }
                    }
                }
                else
                {
                    reader.Dispose();
                }
            }
            else
            {
                reader.Dispose();
            }
        }
Beispiel #9
0
        private void LoadBundleFile(string fullName, EndianBinaryReader reader, string parentPath = null)
        {
            var fileName = Path.GetFileName(fullName);

            Logger.Info("Decompressing " + fileName);
            var bundleFile = new BundleFile(reader, fullName);

            reader.Dispose();
            foreach (var file in bundleFile.fileList)
            {
                var dummyPath = Path.GetDirectoryName(fullName) + "\\" + file.fileName;
                LoadAssetsFromMemory(dummyPath, new EndianBinaryReader(file.stream), parentPath ?? fullName, bundleFile.versionEngine);
            }
        }
Beispiel #10
0
        private static int ExtractBundleFile(string bundleFileName, EndianBinaryReader reader)
        {
            var bundleFile = new BundleFile(reader);

            reader.Dispose();
            if (bundleFile.fileList.Count > 0)
            {
                StatusStripUpdate($"Decompressing {Path.GetFileName(bundleFileName)} ...");
                var extractPath = bundleFileName + "_unpacked\\";
                Directory.CreateDirectory(extractPath);
                return(ExtractMemoryFile(extractPath, bundleFile.fileList));
            }
            return(0);
        }
Beispiel #11
0
        private static int ExtractWebDataFile(string webFileName, EndianBinaryReader reader)
        {
            StatusStripUpdate($"Decompressing {Path.GetFileName(webFileName)} ...");
            var webFile = new WebFile(reader);

            reader.Dispose();
            if (webFile.fileList.Count > 0)
            {
                var extractPath = webFileName + "_unpacked\\";
                Directory.CreateDirectory(extractPath);
                return(ExtractStreamFile(extractPath, webFile.fileList));
            }
            return(0);
        }
Beispiel #12
0
        private void LoadMxrFile(string fullName, EndianBinaryReader reader)
        {
            var fileName = Path.GetFileName(fullName);

            if (!assetsFileListHash.Contains(fileName))
            {
                Logger.Info($"Loading {fileName}");
                try
                {
                    var assetsFile = new Mxr.MxrSerializedFile(this, fullName, reader);
                    assetsFileList.Add(assetsFile);
                    assetsFileListHash.Add(assetsFile.fileName);
                }
                catch
                {
                    reader.Dispose();
                    //Logger.Warning($"Unable to load MXR file {fileName}");
                }
            }
            else
            {
                reader.Dispose();
            }
        }
Beispiel #13
0
        private void LoadWebFile(string fullName, EndianBinaryReader reader)
        {
            var fileName = Path.GetFileName(fullName);

            Logger.Info("Loading " + fileName);
            try
            {
                var webFile = new WebFile(reader);
                foreach (var file in webFile.fileList)
                {
                    var dummyPath = Path.Combine(Path.GetDirectoryName(fullName), file.fileName);
                    switch (CheckFileType(file.stream, out var fileReader))
                    {
                    case FileType.AssetsFile:
                        LoadAssetsFromMemory(dummyPath, fileReader, fullName);
                        break;

                    case FileType.BundleFile:
                        LoadBundleFile(dummyPath, fileReader, fullName);
                        break;

                    case FileType.WebFile:
                        LoadWebFile(dummyPath, fileReader);
                        break;

                    case FileType.ResourceFile:
                        resourceFileReaders[file.fileName] = fileReader;     //TODO
                        break;
                    }
                }
            }
            catch (Exception e)
            {
                Logger.Error($"Error while reading web file {fileName}", e);
            }
            finally
            {
                reader.Dispose();
            }
        }
Beispiel #14
0
        private void LoadWebFile(string fullName, EndianBinaryReader reader)
        {
            var fileName = Path.GetFileName(fullName);

            Logger.Info("Loading " + fileName);
            try
            {
                var webFile = new WebFile(reader);
                foreach (var file in webFile.fileList)
                {
                    var dummyPath = Path.GetDirectoryName(fullName) + "\\" + file.fileName;
                    switch (CheckFileType(file.stream, out var fileReader))
                    {
                    case FileType.AssetsFile:
                        LoadAssetsFromMemory(dummyPath, fileReader, fullName);
                        break;

                    case FileType.BundleFile:
                        LoadBundleFile(dummyPath, fileReader, fullName);
                        break;

                    case FileType.WebFile:
                        LoadWebFile(dummyPath, fileReader);
                        break;

                    case FileType.ResourceFile:
                        resourceFileReaders.Add(file.fileName, fileReader);
                        break;
                    }
                }
            }
            catch
            {
                //Logger.Error($"Unable to load web file {fileName}");
            }
            finally
            {
                reader.Dispose();
            }
        }
Beispiel #15
0
        private void LoadBundleFile(string fullName, EndianBinaryReader reader, string parentPath = null)
        {
            var fileName = Path.GetFileName(fullName);

            Logger.Info("Loading " + fileName);
            try
            {
                var bundleFile = new BundleFile(reader, fullName);
                foreach (var file in bundleFile.fileList)
                {
                    var subReader = new EndianBinaryReader(file.stream);
                    if (SerializedFile.IsSerializedFile(subReader))
                    {
                        var dummyPath = Path.GetDirectoryName(fullName) + Path.DirectorySeparatorChar + file.fileName;
                        if (bundleFile.fileList.Length == 1)
                        {
                            dummyPath = fullName;
                        }
                        LoadAssetsFromMemory(dummyPath, subReader, parentPath ?? fullName, bundleFile.m_Header.unityRevision, (bundleFile.fileList.Length == 1));
                    }
                    else
                    {
                        resourceFileReaders.Add(file.fileName, subReader);
                    }
                }
            }
            catch
            {
                /*var str = $"Unable to load bundle file {fileName}";
                 * if (parentPath != null)
                 * {
                 *  str += $" from {Path.GetFileName(parentPath)}";
                 * }
                 * Logger.Error(str);*/
            }
            finally
            {
                reader.Dispose();
            }
        }
Beispiel #16
0
        private static void LoadBundleFile(string fullName, List <AssetsFile> assetsfileList,
                                           EndianBinaryReader reader, Dictionary <string, EndianBinaryReader> resourceFileReaders, string parentPath = null)
        {
            var fileName = Path.GetFileName(fullName);

            StatusStripUpdate("Decompressing " + fileName);
            var bundleFile = new BundleFile(reader, fullName);

            reader.Dispose();
            foreach (var file in bundleFile.fileList)
            {
                if (!assetsfileListHash.Value.Contains(file.fileName.ToUpper()))
                {
                    StatusStripUpdate("Loading " + file.fileName);
                    var assetsFile = new AssetsFile(Path.GetDirectoryName(fullName) + "\\" + file.fileName, new EndianBinaryReader(file.stream));
                    if (assetsFile.valid)
                    {
                        assetsFile.parentPath = parentPath ?? fullName;

                        if (assetsFile.fileGen == 6) //2.6.x and earlier don't have a string version before the preload table
                        {
                            //make use of the bundle file version
                            assetsFile.m_Version = bundleFile.versionEngine;
                            assetsFile.version   = Regex.Matches(bundleFile.versionEngine, @"\d").Cast <Match>().Select(m => int.Parse(m.Value)).ToArray();
                            assetsFile.buildType = Regex.Replace(bundleFile.versionEngine, @"\d", "").Split(new[] { "." }, StringSplitOptions.RemoveEmptyEntries);
                        }

                        assetsfileList.Add(assetsFile);
                        assetsfileListHash.Value.Add(assetsFile.upperFileName);
                    }
                    else
                    {
                        resourceFileReaders.Add(assetsFile.upperFileName, assetsFile.reader);
                    }
                }
            }
        }
Beispiel #17
0
        private void LoadBundleFile(string fullName, EndianBinaryReader reader, string parentPath = null)
        {
            var fileName = Path.GetFileName(fullName);

            Logger.Info("Loading " + fileName);
            try
            {
                var bundleFile = new BundleFile(reader, fullName);
                foreach (var file in bundleFile.fileList)
                {
                    var subReader = new EndianBinaryReader(file.stream);
                    if (SerializedFile.IsSerializedFile(subReader))
                    {
                        var dummyPath = Path.GetDirectoryName(fullName) + Path.DirectorySeparatorChar + file.fileName;
                        LoadAssetsFromMemory(dummyPath, subReader, parentPath ?? fullName, bundleFile.m_Header.unityRevision);
                    }
                    else
                    {
                        resourceFileReaders[file.fileName] = subReader; //TODO
                    }
                }
            }
            catch (Exception e)
            {
                var str = $"Error while reading bundle file {fileName}";
                if (parentPath != null)
                {
                    str += $" from {Path.GetFileName(parentPath)}";
                }
                Logger.Error(str, e);
            }
            finally
            {
                reader.Dispose();
            }
        }
Beispiel #18
0
        private void readBase5()
        {
            int classID = assetsFileReader.ReadInt32();

            if (fileGen > 15)//5.5.0 and up
            {
                assetsFileReader.ReadByte();
                int type1;
                if ((type1 = assetsFileReader.ReadInt16()) >= 0)
                {
                    type1 = -1 - type1;
                }
                else
                {
                    type1 = classID;
                }
                classIDs.Add(new[] { type1, classID });
                if (classID == 114)
                {
                    assetsFileReader.Position += 16;
                }
                classID = type1;
            }
            else if (classID < 0)
            {
                assetsFileReader.Position += 16;
            }
            assetsFileReader.Position += 16;

            if (baseDefinitions)
            {
                int varCount   = assetsFileReader.ReadInt32();
                int stringSize = assetsFileReader.ReadInt32();

                assetsFileReader.Position += varCount * 24;
                var    stringReader = new EndianBinaryReader(new MemoryStream(assetsFileReader.ReadBytes(stringSize)));
                string className    = "";
                var    classVar     = new List <ClassMember>();
                //build Class Structures
                assetsFileReader.Position -= varCount * 24 + stringSize;
                for (int i = 0; i < varCount; i++)
                {
                    ushort num0    = assetsFileReader.ReadUInt16();
                    byte   level   = assetsFileReader.ReadByte();
                    bool   isArray = assetsFileReader.ReadBoolean();

                    ushort varTypeIndex = assetsFileReader.ReadUInt16();
                    ushort test         = assetsFileReader.ReadUInt16();
                    string varTypeStr;
                    if (test == 0) //varType is an offset in the string block
                    {
                        stringReader.Position = varTypeIndex;
                        varTypeStr            = stringReader.ReadStringToNull();
                    }
                    else //varType is an index in an internal strig array
                    {
                        varTypeStr = baseStrings.ContainsKey(varTypeIndex) ? baseStrings[varTypeIndex] : varTypeIndex.ToString();
                    }

                    ushort varNameIndex = assetsFileReader.ReadUInt16();
                    test = assetsFileReader.ReadUInt16();
                    string varNameStr;
                    if (test == 0)
                    {
                        stringReader.Position = varNameIndex;
                        varNameStr            = stringReader.ReadStringToNull();
                    }
                    else
                    {
                        varNameStr = baseStrings.ContainsKey(varNameIndex) ? baseStrings[varNameIndex] : varNameIndex.ToString();
                    }

                    int size  = assetsFileReader.ReadInt32();
                    int index = assetsFileReader.ReadInt32();
                    int flag  = assetsFileReader.ReadInt32();

                    if (index == 0)
                    {
                        className = varTypeStr + " " + varNameStr;
                    }
                    else
                    {
                        classVar.Add(new ClassMember
                        {
                            Level = level - 1,
                            Type  = varTypeStr,
                            Name  = varNameStr,
                            Size  = size,
                            Flag  = flag
                        });
                    }
                }
                stringReader.Dispose();
                assetsFileReader.Position += stringSize;

                var aClass = new ClassStruct {
                    ID = classID, Text = className, members = classVar
                };
                aClass.SubItems.Add(classID.ToString());
                ClassStructures[classID] = aClass;
            }
        }
Beispiel #19
0
        private static void LoadAssetsFile(string fullName, EndianBinaryReader reader, string parentPath = null)
        {
            var fileName = Path.GetFileName(fullName);

            StatusStripUpdate("Loading " + fileName);
            if (!assetsfileListHash.Contains(fileName.ToUpper()))
            {
                var assetsFile = new AssetsFile(fullName, reader);
                if (assetsFile.valid)
                {
                    assetsFile.parentPath = parentPath;
                    assetsfileList.Add(assetsFile);
                    assetsfileListHash.Add(assetsFile.upperFileName);

                    #region for 2.6.x find mainData and get string version
                    if (assetsFile.header.m_Version == 6 && fileName != "mainData")
                    {
                        var mainDataFile = assetsfileList.Find(aFile => aFile.fileName == "mainData");
                        if (mainDataFile != null)
                        {
                            assetsFile.unityVersion = mainDataFile.unityVersion;
                            assetsFile.version      = mainDataFile.version;
                            assetsFile.buildType    = mainDataFile.buildType;
                        }
                        else if (File.Exists(Path.GetDirectoryName(fullName) + "\\mainData"))
                        {
                            mainDataFile            = new AssetsFile(Path.GetDirectoryName(fullName) + "\\mainData", new EndianBinaryReader(File.OpenRead(Path.GetDirectoryName(fullName) + "\\mainData")));
                            assetsFile.unityVersion = mainDataFile.unityVersion;
                            assetsFile.version      = mainDataFile.version;
                            assetsFile.buildType    = mainDataFile.buildType;
                        }
                    }
                    #endregion

                    int value = 0;
                    foreach (var sharedFile in assetsFile.sharedAssetsList)
                    {
                        var sharedFilePath = Path.GetDirectoryName(fullName) + "\\" + sharedFile.fileName;
                        var sharedFileName = sharedFile.fileName;

                        if (!importFilesHash.Contains(sharedFileName.ToUpper()))
                        {
                            if (!File.Exists(sharedFilePath))
                            {
                                var findFiles = Directory.GetFiles(Path.GetDirectoryName(fullName), sharedFileName, SearchOption.AllDirectories);
                                if (findFiles.Length > 0)
                                {
                                    sharedFilePath = findFiles[0];
                                }
                            }

                            if (File.Exists(sharedFilePath))
                            {
                                importFiles.Add(sharedFilePath);
                                importFilesHash.Add(sharedFileName.ToUpper());
                                value++;
                            }
                        }
                    }
                    if (value > 0)
                    {
                        ProgressBarMaximumAdd(value);
                    }
                }
                else
                {
                    reader.Dispose();
                }
            }
        }