Beispiel #1
0
        public bool Identify(System.IO.Stream stream)
        {
            using (var reader = new Toolbox.Library.IO.FileReader(stream, true))
            {
                reader.ByteOrder = Syroot.BinaryData.ByteOrder.BigEndian;
                if (reader.ReadUInt32() == 0x5824F3A9)
                {
                    //This value seems consistant enough to tell apart from LM3
                    reader.SeekBegin(12);
                    return(reader.ReadUInt32() == 0x78340300);
                }

                return(false);
            }
        }
Beispiel #2
0
 public bool Identify(System.IO.Stream stream)
 {
     using (var reader = new Toolbox.Library.IO.FileReader(stream, true))
     {
         return(reader.ReadUInt32() == 0x04B40000);
     }
 }
Beispiel #3
0
 public bool Identify(System.IO.Stream stream)
 {
     using (var reader = new Toolbox.Library.IO.FileReader(stream, true)) {
         reader.ByteOrder = Syroot.BinaryData.ByteOrder.BigEndian;
         return(reader.ReadUInt32() == 0x02020000 || Utils.GetExtension(FileName) == ".kcl");
     }
 }
Beispiel #4
0
 public bool Identify(System.IO.Stream stream)
 {
     using (var reader = new Toolbox.Library.IO.FileReader(stream, true))
     {
         reader.ByteOrder = Syroot.BinaryData.ByteOrder.BigEndian;
         return(reader.ReadUInt32() == 0x5824F3A9);
     }
 }
Beispiel #5
0
 public bool Identify(System.IO.Stream stream)
 {
     using (var reader = new Toolbox.Library.IO.FileReader(stream, true))
     {
         uint magic = reader.ReadUInt32();
         reader.Position = 0;
         return(magic == 0x1A879BD9 || magic == 0x1E1AF836 || magic == 0xC1DE68F3);
     }
 }
Beispiel #6
0
        public bool Identify(System.IO.Stream stream)
        {
            using (var reader = new Toolbox.Library.IO.FileReader(stream, true))
            {
                reader.ByteOrder = Syroot.BinaryData.ByteOrder.BigEndian;

                uint signature = reader.ReadUInt32();
                reader.Position = 0;
                return(signature == BEMagic || signature == LEMagic);
            }
        }
Beispiel #7
0
        public bool Identify(System.IO.Stream stream)
        {
            using (var reader = new Toolbox.Library.IO.FileReader(stream, true))
            {
                reader.SetByteOrder(true);
                bool IsBMD = reader.ReadUInt32() == 0x4A334432;
                reader.Position = 0;

                return(IsBMD);
            }
        }
Beispiel #8
0
        public bool Identify(System.IO.Stream stream)
        {
            using (var reader = new Toolbox.Library.IO.FileReader(stream, true))
            {
                reader.ByteOrder = Syroot.BinaryData.ByteOrder.BigEndian;

                bool IsMatch = reader.ReadUInt32() == 0x20000000;
                reader.Position = 0;

                return(IsMatch);
            }
        }
            public static bool IsCompressed(Stream stream)
            {
                if (stream.Length < 32)
                {
                    return(false);
                }

                using (var reader = new FileReader(stream, true))
                {
                    reader.ByteOrder = Syroot.BinaryData.ByteOrder.BigEndian;
                    reader.Position  = 0;
                    uint chunkSize        = reader.ReadUInt32();
                    uint chunkCount       = reader.ReadUInt32();
                    uint decompressedSize = reader.ReadUInt32();
                    if (reader.BaseStream.Length > 8 + (chunkCount * 4) + 128)
                    {
                        uint[] chunkSizes = reader.ReadUInt32s((int)chunkCount);
                        reader.Align(128);

                        //Now search for zlibbed chunks
                        uint   size  = reader.ReadUInt32();
                        ushort magic = reader.ReadUInt16();

                        reader.Position = 0;
                        if (magic == 0x78da)
                        {
                            return(true);
                        }
                        else
                        {
                            return(false);
                        }
                    }

                    reader.Position = 0;
                }

                return(false);
            }
        /// <summary>
        /// Gets the <see cref="IFileFormat"/> from a file or byte array.
        /// </summary>
        /// <param name="FileName">The name of the file</param>
        /// <param name="data">The byte array of the data</param>
        /// <param name="InArchive">If the file is in an archive so it can be saved back</param>
        /// <param name="archiveNode">The node being replaced from an archive</param>
        /// <param name="Compressed">If the file is being compressed or not</param>
        /// <param name="CompType">The type of <see cref="CompressionType"/> being used</param>
        /// <returns></returns>
        public static IFileFormat OpenFileFormat(Stream stream, string FileName, byte[] data = null, bool LeaveStreamOpen = false, bool InArchive = false,
                                                 TreeNode archiveNode = null, bool Compressed = false, CompressionType CompType = 0, uint DecompressedSize = 0, uint CompressedSize = 0)
        {
            uint DecompressedFileSize = 0;
            uint CompressedFileSize   = 0;

            using (var fileReader = new FileReader(stream, true))
            {
                if (CompType == CompressionType.None)
                {
                    DecompressedFileSize = (uint)fileReader.BaseStream.Length;
                }
                if (CompType != CompressionType.None)
                {
                    CompressedFileSize = (uint)fileReader.BaseStream.Length;
                }

                if (fileReader.BaseStream.Length <= 4)
                {
                    fileReader.Close();
                    fileReader.Dispose();
                    return(null);
                }

                Cursor.Current       = Cursors.WaitCursor;
                fileReader.ByteOrder = ByteOrder.BigEndian;
                uint MagicHex = fileReader.ReadUInt32();

                string Magic = fileReader.ReadMagic(0, 4);

                fileReader.Position = 0;
                ushort MagicHex2 = fileReader.ReadUInt16();

                //Another hacky magic check if decomp size is first
                fileReader.Position = 4;
                ushort MagicHex3 = fileReader.ReadUInt16();

                //Note this method will soon be how all compression formats are handled rather than being checked here
                foreach (ICompressionFormat compressionFormat in FileManager.GetCompressionFormats())
                {
                    if (compressionFormat.Identify(stream))
                    {
                        stream = compressionFormat.Decompress(stream);
                    }
                }

                if (Magic == "Yaz0")
                {
                    if (data != null)
                    {
                        data = EveryFileExplorer.YAZ0.Decompress(data);
                    }
                    else
                    {
                        data = EveryFileExplorer.YAZ0.Decompress(FileName);
                    }

                    return(OpenFileFormat(FileName, data, LeaveStreamOpen, InArchive, archiveNode, true,
                                          CompressionType.Yaz0, DecompressedFileSize, CompressedFileSize));
                }
                if (Path.GetExtension(FileName) == ".cbtex")
                {
                    fileReader.Position = 0;
                    byte compType = fileReader.ReadByte();
                    if (compType == 0x50)
                    {
                        if (data == null)
                        {
                            data = File.ReadAllBytes(FileName);
                        }

                        fileReader.ByteOrder = Syroot.BinaryData.ByteOrder.BigEndian;

                        fileReader.Seek(4, System.IO.SeekOrigin.Begin);
                        uint decompSize = fileReader.ReadUInt32();
                        uint compSize   = (uint)fileReader.BaseStream.Length - 8;

                        var comp = new STLibraryCompression.MTA_CUSTOM();
                        data = comp.Decompress(data, decompSize);

                        return(OpenFileFormat(FileName, data, LeaveStreamOpen, InArchive, archiveNode, true,
                                              CompressionType.MarioTennisCustom, DecompressedFileSize, CompressedFileSize));
                    }
                    fileReader.Position = 0;
                }
                if (Path.GetExtension(FileName) == ".lz")
                {
                    if (data == null)
                    {
                        data = File.ReadAllBytes(FileName);
                    }

                    data = LZ77_WII.Decompress(fileReader.getSection(16, data.Length - 16));

                    return(OpenFileFormat(FileName, data, LeaveStreamOpen, InArchive, archiveNode, true,
                                          CompressionType.Yaz0, DecompressedFileSize, CompressedFileSize));
                }
                if (MagicHex == 0x28B52FFD || MagicHex == 0xFD2FB528)
                {
                    if (data != null)
                    {
                        data = STLibraryCompression.ZSTD.Decompress(fileReader.getSection(0, data.Length));
                    }
                    else
                    {
                        data = STLibraryCompression.ZSTD.Decompress(File.ReadAllBytes(FileName));
                    }

                    return(OpenFileFormat(FileName, data, LeaveStreamOpen, InArchive, archiveNode, true,
                                          CompressionType.Zstb, DecompressedFileSize, CompressedFileSize));
                }
                if (Magic == "ZCMP" || MagicHex2 == 0x789C || MagicHex2 == 0x78DA || Path.GetExtension(FileName) == ".z" && CompType == CompressionType.None)
                {
                    if (data == null)
                    {
                        data = File.ReadAllBytes(FileName);
                    }

                    data = STLibraryCompression.ZLIB.Decompress(data);
                    return(OpenFileFormat(FileName, data, LeaveStreamOpen, InArchive, archiveNode, true,
                                          CompressionType.Zlib, DecompressedFileSize, CompressedFileSize));
                }
                if (MagicHex3 == 0x789C || MagicHex3 == 0x78DA && CompType == CompressionType.None)
                {
                    if (data == null)
                    {
                        data = File.ReadAllBytes(FileName);
                    }

                    fileReader.Position = 0;
                    int OuSize = fileReader.ReadInt32();
                    int InSize = data.Length - 4;
                    data = STLibraryCompression.ZLIB.Decompress(fileReader.getSection(4, InSize));
                    return(OpenFileFormat(FileName, data, LeaveStreamOpen, InArchive, archiveNode, true,
                                          CompressionType.Zlib, DecompressedFileSize, CompressedFileSize));
                }
                if (Path.GetExtension(FileName) == ".carc" && CompType == CompressionType.None)
                {
                    if (data == null)
                    {
                        data = File.ReadAllBytes(FileName);
                    }

                    data = STLibraryCompression.ZLIB.Decompress(fileReader.getSection(0x10, data.Length - 0x10));
                    return(OpenFileFormat(FileName, data, LeaveStreamOpen, InArchive, archiveNode, true,
                                          CompressionType.Zlib, DecompressedFileSize, CompressedFileSize));
                }
                if (Magic == "ZLIB")
                {
                    if (data == null)
                    {
                        data = File.ReadAllBytes(FileName);
                    }

                    data = STLibraryCompression.GZIP.Decompress(fileReader.getSection(64, data.Length - 64));
                    return(OpenFileFormat(FileName, data, LeaveStreamOpen, InArchive, archiveNode, true,
                                          CompressionType.Zlib, DecompressedFileSize, CompressedFileSize));
                }
                if (MagicHex == 0x1f8b0808 || MagicHex2 == 0x1f8b && CompType == CompressionType.None)
                {
                    if (data == null)
                    {
                        data = File.ReadAllBytes(FileName);
                    }

                    data = STLibraryCompression.GZIP.Decompress(data);
                    return(OpenFileFormat(FileName, data, LeaveStreamOpen, InArchive, archiveNode, true,
                                          CompressionType.Gzip, DecompressedFileSize, CompressedFileSize));
                }
                if (MagicHex == 0x184D2204)
                {
                    if (data == null)
                    {
                        data = File.ReadAllBytes(FileName);
                    }

                    data = STLibraryCompression.Type_LZ4.Decompress(data);
                    return(OpenFileFormat(FileName, data, LeaveStreamOpen, InArchive, archiveNode, true,
                                          CompressionType.Lz4, DecompressedFileSize, CompressedFileSize));
                }
                if (Path.GetExtension(FileName) == ".lz" && CompType == CompressionType.None)
                {
                    if (data == null)
                    {
                        data = File.ReadAllBytes(FileName);
                    }

                    data = STLibraryCompression.LZ77.Decompress(fileReader.getSection(16, data.Length - 16));
                    return(OpenFileFormat(FileName, data, LeaveStreamOpen, InArchive, archiveNode, true,
                                          CompressionType.Zlib, DecompressedFileSize, CompressedFileSize));
                }
                if (Path.GetExtension(FileName) == ".cmp" && CompType == CompressionType.None)
                {
                    if (stream != null)
                    {
                        data = stream.ToArray();
                    }
                    if (data == null)
                    {
                        data = File.ReadAllBytes(FileName);
                    }

                    fileReader.Position = 0;
                    int OuSize = fileReader.ReadInt32();
                    int InSize = data.Length - 4;
                    data = STLibraryCompression.Type_LZ4F.Decompress(fileReader.getSection(4, InSize));

                    return(OpenFileFormat(FileName, data, InArchive, LeaveStreamOpen, archiveNode, true,
                                          CompressionType.Lz4f, DecompressedFileSize, CompressedFileSize));
                }
            }

            foreach (IFileFormat fileFormat in FileManager.GetFileFormats())
            {
                //Set the file name so we can check it's extension in the identifier.
                //Most is by magic but some can be extension or name.

                fileFormat.FileName = Path.GetFileName(FileName);

                if (fileFormat.Identify(stream))
                {
                    fileFormat.IFileInfo = new IFileInfo();
                    fileFormat.IFileInfo.DecompressedSize = DecompressedFileSize;
                    fileFormat.IFileInfo.CompressedSize   = CompressedFileSize;
                    return(SetFileFormat(fileFormat, FileName, stream, LeaveStreamOpen, InArchive, archiveNode, Compressed, CompType));
                }
            }

            return(null);
        }