public static byte[] GetBinaryFileData(IArchiveBinaryFile file, RageArchiveEncryption7 encryption) { using (var ms = new MemoryStream()) { file.Export(ms); byte[] data = ms.ToArray(); if (file.IsEncrypted) { if (encryption == RageArchiveEncryption7.AES) { data = GTA5Crypto.DecryptAES(data); } else // if(encryption == RageArchiveEncryption7.NG) { data = GTA5Crypto.DecryptNG(data, file.Name, (uint)file.UncompressedSize); } } if (file.IsCompressed) { using (var dfls = new DeflateStream(new MemoryStream(data), CompressionMode.Decompress)) { using (var outstr = new MemoryStream()) { dfls.CopyTo(outstr); data = outstr.ToArray(); } } } return(data); } }
public void Rebuild(IArchiveResourceFile sourceFile, IArchiveDirectory targetDirectory, RageArchiveEncryption7 encryption) { try { var resourceStream = new MemoryStream(); sourceFile.Export(resourceStream); var buffer = new byte[resourceStream.Length]; resourceStream.Position = 0; resourceStream.Read(buffer, 0, (int)resourceStream.Length); resourceStream = new MemoryStream(buffer); var resource = new ResourceFile_GTA5_pc <T>(); resourceStream.Position = 0; resource.Load(resourceStream); if (resource.Version != fileType.Version) { throw new Exception("Wrong version"); } var newResourceStream = new MemoryStream(); resource.Save(newResourceStream); buffer = new byte[newResourceStream.Length]; newResourceStream.Position = 0; newResourceStream.Read(buffer, 0, (int)newResourceStream.Length); newResourceStream = new MemoryStream(buffer); var targetResource = targetDirectory.CreateResourceFile(); targetResource.Name = sourceFile.Name; newResourceStream.Position = 0; targetResource.Import(newResourceStream); Console.WriteLine("Rebuilt " + sourceFile.Name); } catch (Exception ex) { Console.WriteLine("ERROR in " + sourceFile.Name + ": " + ex.Message); } }
private void RebuildResourceFile(IArchiveResourceFile sourceFile, IArchiveDirectory destinationDirectory, RageArchiveEncryption7 archiveEncryption) { foreach (var handler in ResourceFileHandlers) { if (handler.CanRebuild(sourceFile)) { handler.Rebuild(sourceFile, destinationDirectory, archiveEncryption); return; } } CopyResource(sourceFile, destinationDirectory); }
private void RebuildBinaryFile(IArchiveBinaryFile sourceFile, IArchiveDirectory destinationDirectory, RageArchiveEncryption7 archiveEncryption) { foreach (var handler in BinaryFileHandlers) { if (handler.CanRebuild(sourceFile)) { handler.Rebuild(sourceFile, destinationDirectory, archiveEncryption); return; } } var ms = new MemoryStream(); sourceFile.Export(ms); ms.Position = 0; var buf = new byte[ms.Length]; ms.Position = 0; ms.Read(buf, 0, buf.Length); var newF = destinationDirectory.CreateBinaryFile(); newF.Name = sourceFile.Name; newF.Import(new MemoryStream(buf)); newF.IsEncrypted = sourceFile.IsEncrypted; if (sourceFile.IsCompressed) { newF.IsCompressed = sourceFile.IsCompressed; newF.UncompressedSize = sourceFile.UncompressedSize; } }
private void RebuildFile(IArchiveFile sourceFile, IArchiveDirectory destinationDirectory, RageArchiveEncryption7 archiveEncryption) { if (sourceFile is IArchiveBinaryFile) { var binaryFile = (IArchiveBinaryFile)sourceFile; if (binaryFile.Name.EndsWith(".rpf", StringComparison.OrdinalIgnoreCase)) { RebuildArchiveFile(binaryFile, destinationDirectory); } else { RebuildBinaryFile(binaryFile, destinationDirectory, archiveEncryption); } } else { var resourceFile = (IArchiveResourceFile)sourceFile; RebuildResourceFile(resourceFile, destinationDirectory, archiveEncryption); } }
private void RebuildDictionary(IArchiveDirectory sourceDirectory, IArchiveDirectory destinationDirectory, RageArchiveEncryption7 archiveEncryption) { foreach (var sourceFile in sourceDirectory.GetFiles()) { RebuildFile(sourceFile, destinationDirectory, archiveEncryption); } foreach (var sourceSubDirectory in sourceDirectory.GetDirectories()) { var destinationSubDirectory = destinationDirectory.CreateDirectory(); destinationSubDirectory.Name = sourceSubDirectory.Name; RebuildDictionary(sourceSubDirectory, destinationSubDirectory, archiveEncryption); } }
private static void ForEachFile(string fullPathName, IArchiveDirectory directory, RageArchiveEncryption7 encryption, ProcessFileDelegate processDelegate) { foreach (var file in directory.GetFiles()) { processDelegate(fullPathName + "\\" + file.Name, file, encryption); if ((file is IArchiveBinaryFile) && file.Name.EndsWith(".rpf", StringComparison.OrdinalIgnoreCase)) { var fileStream = ((IArchiveBinaryFile)file).GetStream(); var inputArchive = RageArchiveWrapper7.Open(fileStream, file.Name); ForEachFile(fullPathName + "\\" + file.Name, inputArchive.Root, inputArchive.archive_.Encryption, processDelegate); } } foreach (var subDirectory in directory.GetDirectories()) { ForEachFile(fullPathName + "\\" + subDirectory.Name, subDirectory, encryption, processDelegate); } }