public async Task <bool> DoWork(string outputFilename, CancellationToken cancellation) { bool retval = true; Trace.WriteLine(string.Format("Amount of processors: {0}", Environment.ProcessorCount)); Trace.WriteLine(string.Format("Amount of regions: {0}", Regions.Length)); for (int i = 0; i < Regions.Length; i++) { Trace.WriteLine(string.Format("Region {0}: {1} from {2:X2} with length {3:X2}", i, Regions[i].GetType().Name, Regions[i].Start, Regions[i].Length)); } using (Ripp3rStream inputStream = new Ripp3rStream(inputFilename)) { using (Ripp3rStream outputStream = new Ripp3rStream( IsDecrypting && Interaction.Instance.Compress ? StreamType.Zip : StreamType.Normal, outputFilename)) { retval &= await DoWork(inputStream, outputStream, cancellation); outputStream.StopCalculateHash(); inputStream.StopCalculateHash(); if (!cancellation.IsCancellationRequested) { string outputBaseName = Path.Combine(Path.GetDirectoryName(outputFilename), Path.GetFileNameWithoutExtension(outputFilename)); SaveHashes(outputBaseName, outputStream, inputStream); outputStream.Close(); if (Interaction.Instance.Compress && Interaction.Instance.MultiPart && outputStream.IsMultipart) { // Write sfv file WriteSfv(outputBaseName, outputStream.GetSfvContent()); } #if DEBUG CompareHashes(IsDecrypting, outputBaseName, outputStream.Hash.AsString()); #endif } } } return(retval); }
private void SaveHashes(string outputBaseName, Ripp3rStream outputStream, Ripp3rStream inputStream) { string outputHash = outputStream.Hash.AsString(); string inputHash = inputStream.Hash.AsString(); Interaction.Instance.ReportMessage("Input md5: " + inputHash); Interaction.Instance.ReportMessage("Output md5: " + outputHash); if (outputStream.StreamType == StreamType.Zip) { byte[] hashAsString = Encoding.ASCII.GetBytes(inputHash); outputStream.AddFile(string.Concat(Path.GetFileName(inputFilename), ".md5"), hashAsString); } outputHash.ToFile(string.Concat(outputBaseName, IsDecrypting ? ".dec.md5" : ".enc.md5")); inputHash.ToFile(string.Concat(outputBaseName, IsDecrypting ? ".iso.md5" : ".dec.md5")); }
/************************************************************* *************************************************************/ public bool AnalyseISO(string fileName) { bool IsPlain = true; try { string dir = Path.GetDirectoryName(fileName); baseName = string.IsNullOrEmpty(dir) ? Path.GetFileNameWithoutExtension(fileName) : Path.Combine(dir, Path.GetFileNameWithoutExtension(fileName)); if (baseName.EndsWith(".zip")) // In case of multipart file { baseName = string.IsNullOrEmpty(dir) ? Path.GetFileNameWithoutExtension(baseName) : Path.Combine(dir, Path.GetFileNameWithoutExtension(baseName)); } inputFilename = fileName; using (Ripp3rStream inputStream = new Ripp3rStream(fileName, false)) { byte[] buffer = new byte[0x1000]; inputStream.Read(buffer, 0, 0x1000); NumPlainRegions = BitConverter.ToUInt32(buffer, 0).Swap(); Regions = new Region[(NumPlainRegions * 2) - 1]; if (buffer[0xF70 + 0xA] != '3' || buffer[0xF70 + 0xB] != 'K') { Interaction.Instance.ReportMessage("Invalid ISO file. This file does not contain PIC/D1/D2 data"); return(false); } IsDecrypting = buffer[0xF70] != 0x44; // Begins with E or D IsBuildedISO = buffer[0xF70 + 0xD] == 0x42; // End in BLD IsValidHash = IsBuildedISO && buffer[0xF70 + 0xF] != 0x44; // Ends in BLF /* Read the game Key */ byte[] d1 = new byte[0x10]; Array.Copy(buffer, 0xF80, d1, 0, 0x10); byte[] d2 = new byte[0x10]; Array.Copy(buffer, 0xF90, d2, 0, 0x10); int pos = 8; UInt32 Current = BitConverter.ToUInt32(buffer, pos).Swap(); pos += 4; for (UInt32 i = 0; i < (2 * NumPlainRegions) - 1; i++) { UInt32 Next = BitConverter.ToUInt32(buffer, pos).Swap(); pos += 4; if (IsPlain) { Regions[i] = new PlainRegion(i, IsDecrypting, IsBuildedISO, IsValidHash, Current, Next); } else { Regions[i] = IsDecrypting ? (Region) new CryptedRegion(i, d1, d2, Current, Next, inputStream.StreamType == StreamType.Zip) : new DecryptedRegion(i, d1, d2, Current, Next, inputStream.StreamType == StreamType.Zip); } IsPlain = !IsPlain; Current = Next; } /* Record this for later */ amountOfSectors = Current; // Game ID is at offset 0x810, length = 10 GameID = Encoding.ASCII.GetString(buffer, 0x810, 10); } } catch (Exception e) { Console.WriteLine(e); return(false); } return(true); }