private void readXbe(DoWorkEventArgs e) { IsoDetailsResults results = null; byte[] xbe = null; base.ReportProgress(0, new IsoDetailsResults(IsoDetailsResultsType.Progress, "Locating default.xbe...")); try { xbe = this.iso.GetFile("default.xbe"); } catch (Exception exception) { base.ReportProgress(0, new IsoDetailsResults(IsoDetailsResultsType.Error, "Unable to extract default.xbe. Reason:\n\n" + exception.Message)); return; } base.ReportProgress(0, new IsoDetailsResults(IsoDetailsResultsType.Progress, "Found! Reading default.xbe...")); using (XbeInfo info = new XbeInfo(xbe)) { if (!info.IsValid) { base.ReportProgress(0, new IsoDetailsResults(IsoDetailsResultsType.Error, "Default.xbe was not valid.")); return; } results = new IsoDetailsResults(info.Certifcate.TitleName, info.Certifcate.TitleID, (info.Certifcate.DiskNumber > 0) ? info.Certifcate.DiskNumber.ToString() : "1") { DiscCount = "1" }; base.ReportProgress(0, new IsoDetailsResults(IsoDetailsResultsType.Progress, "Extracting thumbnail...")); foreach (XbeSection section in info.Sections) { if (section.Name == "$$XSIMAGE") { try { XPR xpr = new XPR(section.Data); DDS dds = xpr.ConvertToDDS(0x40, 0x40); Bitmap bitmap = new Bitmap(0x40, 0x40); switch (xpr.Format) { case XPRFormat.ARGB: bitmap = (Bitmap)dds.GetImage(DDSType.ARGB); break; case XPRFormat.DXT1: bitmap = (Bitmap)dds.GetImage(DDSType.DXT1); break; } MemoryStream stream = new MemoryStream(); bitmap.Save(stream, ImageFormat.Png); results.Thumbnail = (Image)bitmap.Clone(); results.RawThumbnail = (byte[])stream.ToArray().Clone(); bitmap.Dispose(); stream.Dispose(); if (xpr.Format == XPRFormat.ARGB) { base.ReportProgress(0, new IsoDetailsResults(IsoDetailsResultsType.Error, "XBE thumbnail type is not supported or is corrupt.")); } } catch (Exception exception2) { base.ReportProgress(0, new IsoDetailsResults(IsoDetailsResultsType.Error, "Failed to convert thumbnail DDS to PNG.\n\n" + exception2.Message)); } } } if (results.Thumbnail == null) { foreach (XbeSection section2 in info.Sections) { if (section2.Name == "$$XTIMAGE") { try { XPR xpr2 = new XPR(section2.Data); DDS dds2 = xpr2.ConvertToDDS(0x80, 0x80); Bitmap bitmap2 = new Bitmap(0x80, 0x80); switch (xpr2.Format) { case XPRFormat.ARGB: bitmap2 = (Bitmap)dds2.GetImage(DDSType.ARGB); break; case XPRFormat.DXT1: bitmap2 = (Bitmap)dds2.GetImage(DDSType.DXT1); break; } Image image = new Bitmap(0x40, 0x40); Graphics graphics = Graphics.FromImage(image); graphics.DrawImage(bitmap2, 0, 0, 0x40, 0x40); MemoryStream stream2 = new MemoryStream(); image.Save(stream2, ImageFormat.Png); results.Thumbnail = (Image)image.Clone(); results.RawThumbnail = (byte[])stream2.ToArray().Clone(); stream2.Dispose(); bitmap2.Dispose(); graphics.Dispose(); if (xpr2.Format == XPRFormat.ARGB) { base.ReportProgress(0, new IsoDetailsResults(IsoDetailsResultsType.Error, "XBE Thumbnail type is not supported or is corrupt.")); } } catch (Exception exception3) { base.ReportProgress(0, new IsoDetailsResults(IsoDetailsResultsType.Error, "Failed to convert thumbnail DDS to PNG.\n\n" + exception3.Message)); } } } } } e.Result = results; }