/// <summary> /// Dumps the content of the first .raf/.raf.dat archive seen in the given directory. /// Outputs to the given ostream /// </summary> public static bool Dump(string directory, StreamWriter ostream) { #region output_usage_header ostream.WriteLine("Experimental RAF Dumper by ItzWarty @ ItzWarty.com April 28 2011 10:00pm pst"); ostream.WriteLine("RAF dogcumentation @ bit.ly/mSyYrR "); ostream.WriteLine("USAGE: RAF_DUMP (Or just double click executable)"); ostream.WriteLine("Precondition: RAF_DUMP is sitting next to a Riot Archive File."); ostream.WriteLine("Postcondition: 'dump' folder created. RAF extracted into folder."); #endregion //string dumpDir = @"C:\Riot Games\League of Legends\RADS\projects\lol_game_client\filearchives\0.0.0.28\dump\"; //We write the file containing "name hash" next to our program. string hashesFile = Environment.CurrentDirectory + "\\hashes.txt"; string hashesLog = ""; //We write to this file saying what we don't compress string notcompressedsFile = Environment.CurrentDirectory + "\\nocompress.txt"; string notcompressedsLog = ""; string dumpDir = Environment.CurrentDirectory + "\\dump\\"; String[] filesInDir = Directory.GetFiles(Environment.CurrentDirectory); String rafName = ""; foreach (String fileName in filesInDir) { if (fileName.Split("\\").Last().EndsWith(".raf", StringComparison.InvariantCultureIgnoreCase)) { rafName = fileName; } } if (rafName == "") { ostream.WriteLine("Couldn't find RAF file!!"); //ostream.WriteLine("This executable must be in the same folder as a *.raf and *.raf.dat file!"); //ostream.WriteLine("Exiting... Press a key (or two) to exit"); //ostream.ReadKey(); return false; } ostream.WriteLine("Found RAF: " + rafName); RAFArchive raf = new RAFArchive(rafName); FileStream fStream = raf.GetDataFileContentStream(); //DeflateStream dfStream = new DeflateStream(fStream, CompressionMode.Decompress); //int loggingOffset = 10; //No longer applicable since we aren't logging to system.out console directly List<RAFFileListEntry> files = raf.GetDirectoryFile().GetFileList().GetFileEntries(); foreach (RAFFileListEntry entry in files) { //ostream.SetCursorPosition(0, 7); ostream.WriteLine("Dumping: " + entry.FileName.Split("\\").Last() + " ".Repeat(40)); //ostream.SetCursorPosition(0, 8); ostream.WriteLine(" Data File Offset: $" + entry.FileOffset.ToString("x") + "; Size:" + entry.FileSize + " ($" + entry.FileSize.ToString("x") + ")" + " ".Repeat(40)); //Console.SetCursorPosition(0, 7); //Console.WriteLine(" Expected FileName Checksum: $" + entry.StringNameHash.ToString("x") + "; Calculated:" + Adler32(entry.GetFileName).ToString("x")/*entry.GetFileName.GetHashCode().ToString("x")*/ + " ".Repeat(40)); //Console.WriteLine(" To: " + dumpDir + entry.GetFileName+";;"); hashesLog += entry.FileName + "|||" + entry.StringNameHash + "\n"; //zlib.ad byte[] buffer = new byte[entry.FileSize]; fStream.Seek(entry.FileOffset, SeekOrigin.Begin); fStream.Read(buffer, 0, (int)entry.FileSize); PrepareDirectory((dumpDir + entry.FileName).Replace("/", "\\")); try { MemoryStream mStream = new MemoryStream(buffer); zlib.ZInputStream zinput = new zlib.ZInputStream(mStream); List<byte> dBuffer = new List<byte>(); //decompressed buffer, arraylist to my knowledge... int data = 0; while ((data = zinput.Read()) != -1) dBuffer.Add((byte)data); //ComponentAce.Compression.Libs.zlib.ZStream a = new ComponentAce.Compression.Libs.zlib.ZStream(); File.WriteAllBytes((dumpDir + entry.FileName).Replace("/", "\\"), dBuffer.ToArray()); } catch { notcompressedsLog += entry.FileName.ToLower() + "\n"; //Console.SetCursorPosition(2, loggingOffset++); ostream.Write("UNABLE TO DECOMPRESS FILE, WRITING DEFLATED FILE:"); //Console.SetCursorPosition(4, loggingOffset++); ostream.Write(" " + entry.FileName); File.WriteAllBytes((dumpDir + entry.FileName).Replace("/", "\\"), buffer.ToArray()); } } //Console.SetCursorPosition(0, 0); ostream.WriteLine("Write hashes and nocompress file"); File.WriteAllText(hashesFile, hashesLog); File.WriteAllText(notcompressedsFile, notcompressedsLog); ostream.WriteLine("DONE!" + " ".Repeat(30)); //fStream.Close(); return true; //Application.EnableVisualStyles(); //Application.SetCompatibleTextRenderingDefault(false); //Application.Run(new Form1()); }
/// <summary> /// Dumps the content of the first .raf/.raf.dat archive seen in the given directory. /// Outputs to the given ostream /// </summary> public static bool Dump(string directory, StreamWriter ostream) { #region output_usage_header ostream.WriteLine("Experimental RAF Dumper by ItzWarty @ ItzWarty.com April 28 2011 10:00pm pst"); ostream.WriteLine("RAF dogcumentation @ bit.ly/mSyYrR "); ostream.WriteLine("USAGE: RAF_DUMP (Or just double click executable)"); ostream.WriteLine("Precondition: RAF_DUMP is sitting next to a Riot Archive File."); ostream.WriteLine("Postcondition: 'dump' folder created. RAF extracted into folder."); #endregion //string dumpDir = @"C:\Riot Games\League of Legends\RADS\projects\lol_game_client\filearchives\0.0.0.28\dump\"; //We write the file containing "name hash" next to our program. string hashesFile = Environment.CurrentDirectory + "\\hashes.txt"; string hashesLog = ""; //We write to this file saying what we don't compress string notcompressedsFile = Environment.CurrentDirectory + "\\nocompress.txt"; string notcompressedsLog = ""; string dumpDir = Environment.CurrentDirectory + "\\dump\\"; String[] filesInDir = Directory.GetFiles(Environment.CurrentDirectory); String rafName = ""; foreach (String fileName in filesInDir) { if (fileName.Split("\\").Last().EndsWith(".raf", StringComparison.InvariantCultureIgnoreCase)) { rafName = fileName; } } if (rafName == "") { ostream.WriteLine("Couldn't find RAF file!!"); //ostream.WriteLine("This executable must be in the same folder as a *.raf and *.raf.dat file!"); //ostream.WriteLine("Exiting... Press a key (or two) to exit"); //ostream.ReadKey(); return(false); } ostream.WriteLine("Found RAF: " + rafName); RAFArchive raf = new RAFArchive(rafName); FileStream fStream = raf.GetDataFileContentStream(); //DeflateStream dfStream = new DeflateStream(fStream, CompressionMode.Decompress); //int loggingOffset = 10; //No longer applicable since we aren't logging to system.out console directly List <RAFFileListEntry> files = raf.GetDirectoryFile().GetFileList().GetFileEntries(); foreach (RAFFileListEntry entry in files) { //ostream.SetCursorPosition(0, 7); ostream.WriteLine("Dumping: " + entry.FileName.Split("\\").Last() + " ".Repeat(40)); //ostream.SetCursorPosition(0, 8); ostream.WriteLine(" Data File Offset: $" + entry.FileOffset.ToString("x") + "; Size:" + entry.FileSize + " ($" + entry.FileSize.ToString("x") + ")" + " ".Repeat(40)); //Console.SetCursorPosition(0, 7); //Console.WriteLine(" Expected FileName Checksum: $" + entry.StringNameHash.ToString("x") + "; Calculated:" + Adler32(entry.GetFileName).ToString("x")/*entry.GetFileName.GetHashCode().ToString("x")*/ + " ".Repeat(40)); //Console.WriteLine(" To: " + dumpDir + entry.GetFileName+";;"); hashesLog += entry.FileName + "|||" + entry.StringNameHash + "\n"; //zlib.ad byte[] buffer = new byte[entry.FileSize]; fStream.Seek(entry.FileOffset, SeekOrigin.Begin); fStream.Read(buffer, 0, (int)entry.FileSize); PrepareDirectory((dumpDir + entry.FileName).Replace("/", "\\")); try { MemoryStream mStream = new MemoryStream(buffer); zlib.ZInputStream zinput = new zlib.ZInputStream(mStream); List <byte> dBuffer = new List <byte>(); //decompressed buffer, arraylist to my knowledge... int data = 0; while ((data = zinput.Read()) != -1) { dBuffer.Add((byte)data); } //ComponentAce.Compression.Libs.zlib.ZStream a = new ComponentAce.Compression.Libs.zlib.ZStream(); File.WriteAllBytes((dumpDir + entry.FileName).Replace("/", "\\"), dBuffer.ToArray()); } catch { notcompressedsLog += entry.FileName.ToLower() + "\n"; //Console.SetCursorPosition(2, loggingOffset++); ostream.Write("UNABLE TO DECOMPRESS FILE, WRITING DEFLATED FILE:"); //Console.SetCursorPosition(4, loggingOffset++); ostream.Write(" " + entry.FileName); File.WriteAllBytes((dumpDir + entry.FileName).Replace("/", "\\"), buffer.ToArray()); } } //Console.SetCursorPosition(0, 0); ostream.WriteLine("Write hashes and nocompress file"); File.WriteAllText(hashesFile, hashesLog); File.WriteAllText(notcompressedsFile, notcompressedsLog); ostream.WriteLine("DONE!" + " ".Repeat(30)); //fStream.Close(); return(true); //Application.EnableVisualStyles(); //Application.SetCompatibleTextRenderingDefault(false); //Application.Run(new Form1()); }