示例#1
0
        public byte[] FileReader(int i)
        {
            if (!HasFiles)
            {
                return(null);
            }
            if (i >= Files.Count)
            {
                return(null);
            }

            FARCFile file = Files[i];

            if (Signature != Farc.FARC)
            {
                file.Data = Signature == Farc.FArC && file.SizeUnc > 0
                    ? File.ReadAllBytes(FilePath, file.SizeComp, file.Offset).InflateGZip(file.SizeUnc)
                    : File.ReadAllBytes(FilePath, file.SizeUnc, file.Offset);
                Files[i] = file;
                return(file.Data);
            }

            int FileSize = ((FARCType | file.Type) & Type.Enc) != 0 ? file.SizeComp.A(0x10)
                : (((FARCType | file.Type) & Type.GZip) != 0 ? file.SizeComp : file.SizeUnc);

            using (Stream stream = File.OpenReader(FilePath))
            {
                stream.S(file.Offset, 0);
                file.Data = stream.RBy(FileSize);
            }

            if ((FARCType & Type.Enc) != 0)
            {
                if (Format == Format.FT && (file.Type & Type.Enc) != 0)
                {
                    using (AesManaged aes = GetAes(true, null))
                        using (CryptoStream cryptoStream = new CryptoStream(new MSIO.MemoryStream(file.Data),
                                                                            aes.CreateDecryptor(), CryptoStreamMode.Read))
                            cryptoStream.Read(file.Data, 0, FileSize);
                    file.Data = SkipData(file.Data, 0x10);
                }
                else
                {
                    using (AesManaged aes = GetAes(false, null))
                        using (CryptoStream cryptoStream = new CryptoStream(new MSIO.MemoryStream(file.Data),
                                                                            aes.CreateDecryptor(), CryptoStreamMode.Read))
                            cryptoStream.Read(file.Data, 0, FileSize);
                }
            }

            if (((file.Type | FARCType) & Type.GZip) != 0 && file.SizeUnc > 0)
            {
                file.Data = file.Data.InflateGZip(file.SizeUnc);
            }

            Files[i] = file;
            return(file.Data);
        }
示例#2
0
 public void Pack()
 {
     NewFARC();
     string[] files = Directory.GetFiles(DirectoryPath);
     Files = new FARCFile[files.Length];
     for (int i = 0; i < files.Length; i++)
     {
         Files[i] = new FARCFile {
             Name = Path.GetFileName(files[i]), Data = File.ReadAllBytes(files[i])
         }
     }
     ;
     files = null;
     Save();
 }
示例#3
0
        private void CompressStuff(int i, ref Stream writer)
        {
            FARCFile file = Files[i];

            file.Offset  = writer.P;
            file.SizeUnc = file.Data.Length;
            file.Type    = Type.None;

            byte[] data = file.Data;
            if (Signature == Farc.FArC || (Signature == Farc.FARC && (FARCType & Type.GZip) != 0))
            {
                file.Type |= Type.GZip;
                MSIO.MemoryStream stream = new MSIO.MemoryStream();
                using (GZipStream gZipStream = new GZipStream(stream, CompressionMode.Compress))
                    gZipStream.Write(file.Data, 0, file.Data.Length);
                data = stream.ToArray();
                stream.Dispose();
                file.SizeComp = data.Length;
            }

            if (Signature == Farc.FARC && (FARCType & Type.ECB) != 0)
            {
                int    alignLength = data.Length.A(0x40);
                byte[] tempData    = new byte[alignLength];
                System.Array.Copy(data, tempData, data.Length);
                for (int i1 = file.Data.Length; i1 < alignLength; i1++)
                {
                    tempData[i1] = 0x78;
                }
                data          = Encrypt(tempData, false);
                file.SizeComp = data.Length;
            }
            writer.W(data);

            if (Signature != Farc.FARC)
            {
                int Align = writer.P.A(0x10) - writer.P;
                for (int i1 = 0; i1 < Align; i1++)
                {
                    writer.W((byte)(Signature == Farc.FArc ? 0x00 : 0x78));
                }
            }
            Files[i] = file;
        }
示例#4
0
 private void SaveToDisk()
 {
     if (DirectoryPath == null || Files.IsNull)
     {
         return;
     }
     if (DirectoryPath == "" || Files.Count < 1)
     {
         return;
     }
     MSIO.Directory.CreateDirectory(DirectoryPath);
     for (int i = 0; i < Files.Count; i++)
     {
         FARCFile file = Files[i];
         if (file.Data != null)
         {
             File.WriteAllBytes(Path.Combine(DirectoryPath, file.Name), file.Data);
         }
     }
 }
示例#5
0
        private void CompressStuff(int i, ref Stream writer)
        {
            FARCFile file = Files[i];

            file.Offset  = writer.P;
            file.SizeUnc = file.Data.Length;
            file.Type    = Type.None;

            byte[] data = file.Data;
            if (Signature == Farc.FArC || (Signature == Farc.FARC && (FARCType & Type.GZip) != 0))
            {
                file.Type |= Type.GZip;
                data       = file.Data.DeflateGZip(CompressionLevel);
            }
            file.SizeComp = data.Length;

            if (Signature == Farc.FARC && (FARCType & Type.Enc) != 0)
            {
                int    alignLength = data.Length.A(0x40);
                byte[] tempData    = new byte[alignLength];
                System.Array.Copy(data, tempData, data.Length);
                for (int i1 = file.Data.Length; i1 < alignLength; i1++)
                {
                    tempData[i1] = 0x78;
                }
                data = Encrypt(tempData, false);
            }
            writer.W(data);

            if (Signature != Farc.FARC)
            {
                int Align = writer.P.A(0x10) - writer.P;
                for (int i1 = 0; i1 < Align; i1++)
                {
                    writer.W((byte)(Signature == Farc.FArc ? 0x00 : 0x78));
                }
            }
            Files[i] = file;
        }
示例#6
0
        public void Pack()
        {
            NewFARC();
            string[] files = Directory.GetFiles(DirectoryPath);
            Files = new FARCFile[files.Length];

            for (int i = 0; i < files.Length; i++)
            {
                Files[i] = new FARCFile {
                    Name = files[i]
                };
                string ext = Path.GetExtension(files[i]).ToLower();
                if (ext == ".a3da" || ext == ".diva" || ext == ".vag")
                {
                    Signature = Farc.FArc;
                }
            }
            files = null;

            Stream writer = File.OpenWriter(DirectoryPath + ".farc", true);

            writer.WriteEndian((int)Signature, true);

            Stream HeaderWriter = File.OpenWriter();

            if (Signature == Farc.FArc)
            {
                HeaderWriter.WriteEndian(0x20, true);
            }
            else if (Signature == Farc.FArC)
            {
                HeaderWriter.WriteEndian(0x10, true);
            }
            else if (Signature == Farc.FARC)
            {
                HeaderWriter.WriteEndian((int)FARCType, true);
                HeaderWriter.Write(0x00);
                HeaderWriter.WriteEndian(0x40, true);
                HeaderWriter.Write(0x00);
            }
            int HeaderPartLength = Signature == Farc.FArc ? 0x09 : 0x0D;

            for (int i = 0; i < Files.Length; i++)
            {
                HeaderWriter.Length += Path.GetFileName(Files[i].Name).Length + HeaderPartLength;
            }
            writer.WriteEndian(HeaderWriter.Length, true);
            writer.Write(HeaderWriter.ToArray(true));
            HeaderWriter = null;

            int Align = writer.Position.Align(0x10) - writer.Position;

            for (int i1 = 0; i1 < Align; i1++)
            {
                if (Signature == Farc.FArc)
                {
                    writer.WriteByte(0x00);
                }
                else
                {
                    writer.WriteByte(0x78);
                }
            }

            for (int i = 0; i < Files.Length; i++)
            {
                CompressStuff(i, ref Files, ref writer);
            }

            if (Signature == Farc.FARC)
            {
                writer.Position = 0x1C;
            }
            else
            {
                writer.Position = 0x0C;
            }
            for (int i = 0; i < Files.Length; i++)
            {
                writer.Write(Path.GetFileName(Files[i].Name) + "\0");
                writer.WriteEndian(Files[i].Offset, true);
                if (Signature != Farc.FArc)
                {
                    writer.WriteEndian(Files[i].SizeComp, true);
                }
                writer.WriteEndian(Files[i].SizeUnc, true);
            }
            writer.Close();
        }
示例#7
0
        public void Pack(string file)
        {
            Files = null;
            FT    = false;
            string[] files = Directory.GetFiles(file);
            Files = new FARCFile[files.Length];

            for (int i = 0; i < files.Length; i++)
            {
                Files[i] = new FARCFile {
                    Name = files[i]
                };
                string ext = Path.GetExtension(files[i]).ToLower();
                if (ext == ".a3da" || ext == ".mot" || ext == ".vag")
                {
                    Signature = Farc.FArc;
                }
            }
            files = null;

            KKtIO writer = KKtIO.OpenWriter(file + ".farc", true);

            if (Signature == Farc.FArc)
            {
                writer.Write(Text.ToASCII("FArc"));
            }
            else if (Signature == Farc.FArC)
            {
                writer.Write(Text.ToASCII("FArC"));
            }
            else
            {
                writer.Write(Text.ToASCII("FARC"));
            }

            KKtIO HeaderWriter = new KKtIO(new MemoryStream());

            for (int i = 0; i < 3; i++)
            {
                HeaderWriter.Write((byte)0x00);
            }
            if (Signature == Farc.FArc)
            {
                HeaderWriter.Write((byte)0x20);
            }
            else if (Signature == Farc.FArC)
            {
                HeaderWriter.Write((byte)0x10);
            }
            else if (Signature == Farc.FARC)
            {
                HeaderWriter.Write((byte)0x06);
                for (int i = 0; i < 7; i++)
                {
                    HeaderWriter.Write((byte)0x00);
                }
                HeaderWriter.Write((byte)0x40);
                for (int i = 0; i < 8; i++)
                {
                    HeaderWriter.Write((byte)0x00);
                }
            }
            for (int i = 0; i < Files.Length; i++)
            {
                for (int i1 = 0; i1 < Path.GetFileName(Files[i].Name).Length +
                     (Signature == Farc.FArc ? 0x09 : 0x0D); i1++)
                {
                    HeaderWriter.Write((byte)0x00);
                }
            }
            writer.WriteEndian((uint)HeaderWriter.Length, true);
            writer.Write(HeaderWriter.ToArray());
            HeaderWriter = null;

            int Align = (int)Main.Align(writer.Position, 0x10) - (int)writer.Position;

            for (int i1 = 0; i1 < Align; i1++)
            {
                if (Signature == Farc.FArc)
                {
                    writer.Write((byte)0x00);
                }
                else
                {
                    writer.Write((byte)0x78);
                }
            }

            for (int i = 0; i < Files.Length; i++)
            {
                CompressStuff(i, ref Files, ref writer);
            }

            if (Signature == Farc.FARC)
            {
                writer.Seek(0x1C, 0);
            }
            else
            {
                writer.Seek(0x0C, 0);
            }
            for (int i = 0; i < Files.Length; i++)
            {
                writer.Write(Text.ToUTF8(Path.GetFileName(Files[i].Name) + "\0"));
                writer.WriteEndian(Files[i].Offset, true);
                if (Signature != Farc.FArc)
                {
                    writer.WriteEndian(Files[i].SizeComp, true);
                }
                writer.WriteEndian(Files[i].SizeUnc, true);
            }
            writer.Close();
        }
示例#8
0
 public FARC()
 {
     Files = new FARCFile[0]; Signature = Farc.FArC; FT = false;
 }
示例#9
0
        public bool HeaderReader()
        {
            NewFARC();
            if (!File.Exists(FilePath))
            {
                return(false);
            }

            Stream reader = File.OpenReader(FilePath);

            DirectoryPath = Path.GetFullPath(FilePath).Replace(Path.GetExtension(FilePath), "");
            Signature     = (Farc)reader.RI32E(true);
            if (Signature != Farc.FArc && Signature != Farc.FArC && Signature != Farc.FARC)
            {
                reader.Dispose(); return(false);
            }

            int headerLength = reader.RI32E(true);

            if (Signature == Farc.FARC)
            {
                FARCType = (Type)reader.RI32E(true);
                reader.RI32();

                int farcMode = reader.RI32E(true);
                ft  = farcMode == 0x10;
                cbc = farcMode != 0x10 && farcMode != 0x40;

                if (cbc && (FARCType & Type.ECB) != 0)
                {
                    reader.Dispose();
                    byte[]          header = new byte[headerLength - 0x08];
                    MSIO.FileStream stream = new MSIO.FileStream(FilePath, MSIO.FileMode.Open,
                                                                 MSIO.FileAccess.ReadWrite, MSIO.FileShare.ReadWrite)
                    {
                        Position = 0x10
                    };

                    using (AesManaged aes = GetAes(true, null))
                        using (CryptoStream cryptoStream = new CryptoStream(stream,
                                                                            aes.CreateDecryptor(), CryptoStreamMode.Read))
                            cryptoStream.Read(header, 0x00, headerLength - 0x08);
                    header = SkipData(header, 0x10);
                    reader = File.OpenReader(header);

                    farcMode = reader.RI32E(true);
                    ft       = farcMode == 0x10;
                }
            }

            if (Signature == Farc.FARC)
            {
                if (reader.RI32E(true) == 1)
                {
                    Files.Capacity = reader.RI32E(true);
                }
            }
            reader.RI32();

            if (Files.Capacity == 0)
            {
                int  Count    = 0;
                long Position = reader.PI64;
                while (reader.PI64 < headerLength)
                {
                    reader.NT();
                    reader.RI32();
                    if (Signature != Farc.FArc)
                    {
                        reader.RI32();
                    }
                    reader.RI32();
                    if (Signature == Farc.FARC && ft)
                    {
                        reader.RI32();
                    }
                    Count++;
                }
                reader.PI64    = Position;
                Files.Capacity = Count;
            }

            for (int i = 0; i < Files.Capacity; i++)
            {
                FARCFile file = default;
                file.Name   = reader.NTUTF8();
                file.Offset = reader.RI32E(true);
                if (Signature != Farc.FArc)
                {
                    file.SizeComp = reader.RI32E(true);
                }
                file.SizeUnc = reader.RI32E(true);
                if (Signature == Farc.FARC && ft)
                {
                    file.Type = (Type)reader.RI32E(true);
                }
                Files.Add(file);
            }

            reader.Dispose();
            return(true);
        }
示例#10
0
        public void Save()
        {
            if (!HasFiles)
            {
                return;
            }

            for (int i = 0; i < Files.Count; i++)
            {
                string ext = Path.GetExtension(Files[i].Name).ToLower();
                if (ext == ".a3da" || ext == ".diva" || ext == ".vag")
                {
                    Signature = Farc.FArc; break;
                }
            }

            Stream writer = File.OpenWriter(DirectoryPath + ".farc", true);

            writer.WE((int)Signature, true);

            using (Stream headerWriter = File.OpenWriter())
            {
                if (Signature == Farc.FArc)
                {
                    headerWriter.WE(0x20, true);
                }
                else if (Signature == Farc.FArC)
                {
                    headerWriter.WE(0x10, true);
                }
                else if (Signature == Farc.FARC)
                {
                    headerWriter.WE((int)FARCType, true);
                    headerWriter.W(0x00);
                    headerWriter.WE(0x40, true);
                    headerWriter.W(0x00);
                }
                int HeaderPartLength = Signature == Farc.FArc ? 0x09 : 0x0D;
                for (int i = 0; i < Files.Count; i++)
                {
                    headerWriter.L += Path.GetFileName(Files[i].Name).Length + HeaderPartLength + 1;
                }
                writer.WE(headerWriter.L, true);
                writer.W(headerWriter.ToArray(true));
            }

            int align = writer.P.A(0x10) - writer.P;

            for (int i1 = 0; i1 < align; i1++)
            {
                writer.W((byte)(Signature == Farc.FArc ? 0x00 : 0x78));
            }

            for (int i = 0; i < Files.Count; i++)
            {
                CompressStuff(i, ref writer);
            }

            writer.P = Signature == Farc.FARC ? 0x1C : 0x0C;
            for (int i = 0; i < Files.Count; i++)
            {
                FARCFile file = Files[i];
                writer.W(Path.GetFileName(file.Name) + "\0");
                writer.WE(file.Offset, true);
                if (Signature != Farc.FArc)
                {
                    writer.WE(file.SizeComp, true);
                }
                writer.WE(file.SizeUnc, true);
            }
            writer.Dispose();
        }
示例#11
0
        public byte[] FileReader(int i)
        {
            if (!HasFiles)
            {
                return(null);
            }
            if (i >= Files.Count)
            {
                return(null);
            }

            FARCFile file = Files[i];

            if (Signature != Farc.FARC)
            {
                if (Signature == Farc.FArC)
                {
                    using (MSIO.MemoryStream memorystream = new MSIO.MemoryStream(
                               File.ReadAllBytes(FilePath, file.SizeComp, file.Offset)))
                        using (GZipStream gZipStream = new GZipStream(memorystream, CompressionMode.Decompress))
                        {
                            file.Data = new byte[file.SizeUnc];
                            gZipStream.Read(file.Data, 0, file.SizeUnc);
                        }
                }
                else
                {
                    file.Data = File.ReadAllBytes(FilePath, file.SizeUnc, file.Offset);
                }
                Files[i] = file;
                return(file.Data);
            }

            int FileSize = (FARCType & Type.ECB) != 0 || (file.Type & Type.ECB) != 0 ?
                           file.SizeComp.A(0x10) : file.SizeComp;

            using (MSIO.FileStream stream = new MSIO.FileStream(FilePath, MSIO.FileMode.Open,
                                                                MSIO.FileAccess.ReadWrite, MSIO.FileShare.ReadWrite))
            {
                stream.Seek(file.Offset, 0);
                file.Data = new byte[FileSize];

                bool encrypted = false;
                if ((FARCType & Type.ECB) != 0)
                {
                    if ((ft && (file.Type & Type.ECB) != 0) || cbc)
                    {
                        using (AesManaged aes = GetAes(true, null))
                            using (CryptoStream cryptoStream = new CryptoStream(stream,
                                                                                aes.CreateDecryptor(), CryptoStreamMode.Read))
                                cryptoStream.Read(file.Data, 0, FileSize);
                        file.Data = SkipData(file.Data, 0x10);
                    }
                    else
                    {
                        using (AesManaged aes = GetAes(false, null))
                            using (CryptoStream cryptoStream = new CryptoStream(stream,
                                                                                aes.CreateDecryptor(), CryptoStreamMode.Read))
                                cryptoStream.Read(file.Data, 0, FileSize);
                    }
                    encrypted = true;
                }

                bool compressed = false;
                if (((ft && (file.Type & Type.GZip) != 0) ||
                     (FARCType & Type.GZip) != 0) && file.SizeUnc > 0)
                {
                    GZipStream gZipStream = new GZipStream(encrypted ? new MSIO.MemoryStream(file.Data) :
                                                           (MSIO.Stream)stream, CompressionMode.Decompress);
                    byte[] Temp = new byte[file.SizeUnc];
                    gZipStream.Read(Temp, 0, file.SizeUnc);
                    file.Data = Temp;
                    gZipStream.Dispose();
                    compressed = true;
                }

                if (!encrypted && !compressed)
                {
                    file.Data = new byte[file.SizeUnc];
                    stream.Read(file.Data, 0, file.SizeUnc);
                }
            }
            Files[i] = file;
            return(file.Data);
        }