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); }
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(); }
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; }
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); } } }
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; }
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(); }
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(); }
public FARC() { Files = new FARCFile[0]; Signature = Farc.FArC; FT = false; }
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); }
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(); }
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); }