public override bool DetectROM(string inputPath, out string titleID, out uint regionID) { regionID = 0; using (FileStream isoStream = File.Open(inputPath, FileMode.Open)) { if (!CDReader.Detect(isoStream)) { titleID = null; return(false); } else { CDReader cd = new CDReader(isoStream, true); titleID = null; bool confirm = false; if (cd.FileExists(@"UMD_DATA.BIN")) { using (StreamReader sr = new StreamReader(cd.OpenFile(@"UMD_DATA.BIN", FileMode.Open))) { titleID = sr.ReadLine().Substring(0, 10); } confirm = true; } cd.Dispose(); return(confirm); } } }
public static VirtualFileSystemEntry ToVirtualFileSystemEntry(this CDReader isoFileSystem, string path) { if (isoFileSystem.FileExists(path)) { var fileName = Path.GetFileName(path); if (fileName.EndsWith(";1")) { fileName = fileName.Substring(0, fileName.Length - 2); } return(new VirtualFile(null, isoFileSystem.OpenFile(path, FileMode.Open), fileName)); } else { var directory = new VirtualDirectory(null, Path.GetFileName(path)); foreach (var file in isoFileSystem.GetFiles(path)) { var entry = ToVirtualFileSystemEntry(isoFileSystem, file); entry.MoveTo(directory); } foreach (var subDirectory in isoFileSystem.GetDirectories(path)) { var entry = ToVirtualFileSystemEntry(isoFileSystem, subDirectory); entry.MoveTo(directory); } return(directory); } }
public override CompressedFile FindFile(string fullPath) { if (!_cd.FileExists(fullPath)) { return(null); } var content = new CompressedFile { ArcPath = Path, FullName = fullPath }; content.Name = content.FullName.Split('\\').LastOrDefault(); return(content); }
private XenServerPatchAlert GetAlertFromIsoFile(string fileName, out bool hasUpdateXml, out bool isUpgradeIso) { hasUpdateXml = false; isUpgradeIso = false; if (!fileName.EndsWith(InvisibleMessages.ISO_UPDATE)) { return(null); } var xmlDoc = new XmlDocument(); try { using (var isoStream = File.OpenRead(fileName)) { var cd = new CDReader(isoStream, true); if (cd.Exists("Update.xml")) { using (var fileStream = cd.OpenFile("Update.xml", FileMode.Open)) { xmlDoc.Load(fileStream); hasUpdateXml = true; } } if (cd.Exists(@"repodata\repomd.xml") && cd.FileExists(".treeinfo")) { using (var fileStream = cd.OpenFile(".treeinfo", FileMode.Open)) { var iniDoc = new IniDocument(fileStream); var entry = iniDoc.FindEntry("platform", "name"); if (entry != null && entry.Value == "XCP") { isUpgradeIso = true; return(null); } } } } } catch (Exception exception) { log.Error("Exception while reading the update data from the iso file:", exception); } var elements = xmlDoc.GetElementsByTagName("update"); var update = elements.Count > 0 ? elements[0] : null; if (update == null || update.Attributes == null) { return(null); } var uuid = update.Attributes["uuid"]; return(uuid != null?Updates.FindPatchAlertByUuid(uuid.Value) : null); }
public static string DetectPs2Sku(FileInfo isofile) { Stream isoStream; if (isBinFile(isofile)) { isoStream = new RawCdRomStream(isofile); } else { isoStream = isofile.OpenRead(); } if (!CDReader.Detect(isoStream)) { return(null); } CDReader cdReader = new CDReader(isoStream, false, true); if (!cdReader.FileExists("SYSTEM.CNF")) { cdReader.Dispose(); isoStream.Dispose(); return(null); } SparseStream systemCnfStream = cdReader.OpenFile("SYSTEM.CNF", FileMode.Open, FileAccess.Read); StreamReader systemCnfReader = new StreamReader(systemCnfStream, Encoding.ASCII); string boot2 = null; while (!systemCnfReader.EndOfStream) { boot2 = systemCnfReader.ReadLine(); if (boot2.ToUpperInvariant().StartsWith("BOOT")) { break; } } systemCnfReader.Dispose(); systemCnfStream.Dispose(); while (boot2.Contains("\\")) { boot2 = boot2.Substring(1); } if (boot2.EndsWith(";1")) { boot2 = boot2.Substring(0, boot2.Length - 2); } cdReader.Dispose(); isoStream.Dispose(); return(boot2); }
public PSPGame(String iso) { Readable = true; try { FileStream FileISO = File.Open(iso, FileMode.Open, FileAccess.Read); CDReader ReaderISO = new CDReader(FileISO, true); FileName = iso; FileSize = FileISO.Length; if (!ReaderISO.FileExists("PSP_GAME\\PARAM.SFO")) { throw new NotImplementedException(); } FileISO.Close(); } catch (Exception ex) { Readable = false; Console.WriteLine("-----------------------------------------------------"); Console.WriteLine("PSPGame(" + iso + ")"); Console.WriteLine(ex.Message); Console.WriteLine("-----------------------------------------------------"); } }
static bool ProcessRecoveryISO(Stream isoStream, string outputPath, bool extractFiles = true, bool consoleOutput = true) { if (ProcessRecoveryGDF(isoStream, outputPath, extractFiles, consoleOutput)) { return(true); } DiscUtils.Vfs.VfsFileSystemFacade vfs = new CDReader(isoStream, true, false); if (!vfs.FileExists("recctrl.bin")) { vfs = new UdfReader(isoStream); } if (!vfs.FileExists("recctrl.bin")) { Console.WriteLine("Failed to find recctrl.bin inside image!"); return(false); } using (var reader = new BinaryReader(vfs.OpenFile("recctrl.bin", FileMode.Open))) { Stream dataStream = null; if (extractFiles) { dataStream = vfs.OpenFile("recdata.bin", FileMode.Open); } bool res = ProcessRecovery(reader, dataStream, outputPath, consoleOutput); if (dataStream != null) { dataStream.Close(); } return(res); } }
// Extracts the package.rdp from a GEB iso public static bool Extract(string isoPath, bool debug) { try { // Debug mode only variables long bytesReadTotal = 0; string percentageString = "# Extracting package.rdp - 0%"; // Initializing virtual ISO disc if (debug) { Console.WriteLine("# Reading ISO File System..."); } CDReader isoFile = new CDReader(new FileStream(isoPath, FileMode.Open), false); if (debug) { Console.WriteLine("# Checking ISO Files..."); } // Check if file exists if (isoFile.FileExists("\\PSP_GAME\\USRDIR\\package.rdp")) { if (debug) { Console.WriteLine("# Initializing Streams and Buffers"); } // Initializing Streams and buffers Stream packageStream = isoFile.OpenFile("\\PSP_GAME\\USRDIR\\package.rdp", FileMode.Open); FileStream outStream = new FileStream("package.rdp", FileMode.Create, FileAccess.Write); int bufferLenght = 2048; byte[] buffer = new byte[bufferLenght]; if (debug) { Console.Write(percentageString); } // Extract the package.rdp int bytesRead = packageStream.Read(buffer, 0, bufferLenght); bytesReadTotal += bytesRead; while (bytesRead > 0) { outStream.Write(buffer, 0, bytesRead); outStream.Flush(); bytesRead = packageStream.Read(buffer, 0, bufferLenght); bytesReadTotal += bytesRead; if (debug) { int currentPercentage = (int)((bytesReadTotal * 100) / packageStream.Length); if (percentageString != "# Extracting package.rdp - " + currentPercentage + "%") { percentageString = "# Extracting package.rdp - " + currentPercentage + "%"; Console.Write("\r" + percentageString); } } } Console.WriteLine("\n# Closing Streams"); // Close Streams outStream.Close(); packageStream.Close(); } // Iso not valid else { if (debug) { Console.WriteLine("# Can't find the file \"\\PSP_GAME\\USRDIR\\package.rdp\" into the Iso File System"); Console.WriteLine("# Disposing Iso File System"); } // Close Virtual Iso isoFile.Dispose(); return(false); } if (debug) { Console.WriteLine("# Disposing Iso File System"); } // Close Virtual Iso isoFile.Dispose(); return(true); } catch (Exception ex) { throw ex; } }
/// <summary> /// /// </summary> /// <param name="isoPath"></param> /// <param name="debug"></param> /// <returns>-2 package.rdp dimension, -1 Iso not valid, 1 inserted</returns> public static int Insert(string isoPath, bool debug) { try { // Debug mode only variables long bytesReadTotal = 0; string percentageString = "# Inserting package.rdp - 0%"; // Initializing virtual ISO disc if (debug) { Console.WriteLine("# Reading ISO File System..."); } FileStream isoStream = new FileStream(isoPath, FileMode.Open, FileAccess.ReadWrite); CDReader isoFile = new CDReader(isoStream, false); if (debug) { Console.WriteLine("# Checking ISO Files..."); } // Check if file exists if (isoFile.FileExists("\\PSP_GAME\\USRDIR\\package.rdp")) { if (debug) { Console.WriteLine("# Initializing Streams and Buffers"); } // Initializing Streams and buffers Stream packageStream = isoFile.OpenFile("\\PSP_GAME\\USRDIR\\package.rdp", FileMode.Open, FileAccess.Read); FileStream inStream = new FileStream("package.rdp", FileMode.Open, FileAccess.Read); int bufferLenght = 2048; byte[] buffer = new byte[bufferLenght]; if (debug) { Console.WriteLine("# Checking package.rdp files dimensions"); } // Checking package.rdp dimensions if (inStream.Length != packageStream.Length) { if (debug) { Console.WriteLine("# The package.rdp has a different dimension from the original one."); Console.WriteLine("# Disposing Iso File System"); } // Close Virtual Iso isoFile.Dispose(); return(-2); } // Closing useless streams packageStream.Close(); packageStream.Dispose(); isoFile.Dispose(); isoFile = null; GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect(); GC.WaitForPendingFinalizers(); if (debug) { Console.WriteLine("# Initializing injecter..."); } byte[] rdpUnique = new byte[0x60]; inStream.Seek(0, SeekOrigin.Begin); inStream.Read(rdpUnique, 0, 0x60); inStream.Seek(0, SeekOrigin.Begin); long rdpOffset = localizeRDP(rdpUnique, isoStream); isoStream.Seek(rdpOffset, SeekOrigin.Begin); if (debug) { Console.Write(percentageString); } // Inserting the package.rdp int bytesRead = inStream.Read(buffer, 0, bufferLenght); bytesReadTotal += bytesRead; while (bytesRead > 0) { isoStream.Write(buffer, 0, bytesRead); isoStream.Flush(); bytesRead = inStream.Read(buffer, 0, bufferLenght); bytesReadTotal += bytesRead; if (debug) { int currentPercentage = (int)((bytesReadTotal * 100) / packageStream.Length); if (percentageString != "# Inserting package.rdp - " + currentPercentage + "%") { percentageString = "# Inserting package.rdp - " + currentPercentage + "%"; Console.Write("\r" + percentageString); } } } Console.WriteLine("\n# Closing Streams"); // Close Streams inStream.Close(); isoStream.Close(); } // Iso not valid else { if (debug) { Console.WriteLine("# Can't find the file \"\\PSP_GAME\\USRDIR\\package.rdp\" into the Iso File System"); Console.WriteLine("# Disposing Iso File System"); } // Close Virtual Iso isoFile.Dispose(); return(-1); } return(1); } catch (Exception ex) { throw ex; } }