/* TAH Procedures*/ public void extract_TAH_directory() { Entries = null; UInt32 arc_size = (UInt32)reader.BaseStream.Length; header tah_header = new header(); byte[] magic = reader.ReadBytes(4); if (magic[0] != (byte)'T' || magic[1] != (byte)'A' || magic[2] != (byte)'H' || magic[3] != (byte)'2') { throw new Exception("File is not TAH"); } tah_header.index_entry_count = reader.ReadUInt32(); tah_header.unknown = reader.ReadUInt32(); tah_header.reserved = reader.ReadUInt32(); UInt32 index_buffer_size = tah_header.index_entry_count * 8; //sizeof(index_entry) == 8 Entries = new TAHEntry[tah_header.index_entry_count]; for (int i = 0; i < tah_header.index_entry_count; i++) { Entries[i] = new TAHEntry(); Entries[i].hash_name = reader.ReadUInt32(); Entries[i].offset = reader.ReadUInt32(); } UInt32 output_length = reader.ReadUInt32(); //entry情報の読み出し長さ UInt32 input_length = Entries[0].offset - /*sizeof(header)*/ 16 - index_buffer_size; //entry情報の読み出しバッファ byte[] data_input = new byte[input_length]; data_input = reader.ReadBytes((int)input_length); //-- entry情報の読み込み完了! -- byte[] output_data = new byte[output_length]; Decompression.decrypt(ref data_input, input_length, ref output_data, output_length); //-- entry情報の復号完了! -- build_TAHEntries(output_data, arc_size); }
public int ExtractResource(TAHEntry entry, out byte[] data_output) { //data読み込み長さ //-4はdata書き出し長さ格納領域 (UInt32) を減じている UInt32 data_input_length = entry.length - 4; //data読み込みバッファ byte[] data_input = new byte[data_input_length]; UInt32 data_output_length; reader.BaseStream.Position = entry.offset; try { //data書き出し長さ data_output_length = reader.ReadUInt32(); data_input = reader.ReadBytes((int)data_input_length); } catch (Exception) { System.Console.Out.WriteLine("Error: Cannot read out compressed data of the archive."); data_output = new byte[0]; return(-1); } //-- data読み込み(復号前)完了! -- //data書き出しバッファ data_output = new byte[data_output_length]; try { Decompression.decrypt(ref data_input, data_input_length, ref data_output, data_output_length); } catch (Exception) { System.Console.Out.WriteLine("Error: Failed to decrypt data. Possible error in archive."); return(-1); } //-- data復号完了! -- return(0); }
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { BackgroundWorker worker = sender as BackgroundWorker; Encrypter encrypter = new Encrypter(); encrypter.SourcePath = @"."; Dictionary <string, TAHEntry> entries = new Dictionary <string, TAHEntry>(); foreach (TAHEntry entry in decrypter.Entries) { string ext = Path.GetExtension(entry.file_name).ToLower(); if (ext == ".tmo") { string true_file_name = encrypter.SourcePath + "/" + entry.file_name; entries[true_file_name] = entry; encrypter.Add(true_file_name); } } int entries_count = encrypter.Count; int current_index = 0; encrypter.GetFileEntryStream = delegate(string true_file_name) { Console.WriteLine("compressing {0}", true_file_name); TAHEntry entry = entries[true_file_name]; byte[] data_output; decrypter.ExtractResource(entry, out data_output); current_index++; int percent = current_index * 100 / entries_count; worker.ReportProgress(percent); return(new MemoryStream(data_output)); }; encrypter.Save(@"tmo-" + Path.GetFileName(source_file)); }