public byte[] GetFile(XisoFileEntry entry) { _binaryReader.BaseStream.Seek(entry.Offset, SeekOrigin.Begin); if (!entry.Size.HasValue) { throw new InvalidDataException("File size cannot be null"); } return(_binaryReader.ReadBytes((int)entry.Size.Value)); }
private void Parse(uint tocOffset, int offset, string dirPrefix = null) { if (string.IsNullOrWhiteSpace(dirPrefix)) { dirPrefix = Slash; } var data = Read(tocOffset, 256, offset); var tableData = ModelFactory.GetModel <XisoTableData>(data); if (tableData.Sector == uint.MaxValue) { return; } if (tableData.Left != 0) { Parse(tocOffset, tableData.Left * 4, dirPrefix); } var file = new XisoFileEntry { TableData = tableData, Name = tableData.Name, Flags = tableData.Flags, Path = dirPrefix + tableData.Name }; RootDir.Insert(file.Path, file); if (tableData.IsDirectory) { file.Path += Slash; Parse(tableData.Sector, 0, file.Path); } else { file.Size = tableData.Size; file.Offset = Type.SectorToOffset(tableData.Sector); ParseSpecial(file); } if (tableData.Right != 0) { Parse(tocOffset, tableData.Right * 4, dirPrefix); } }
private void ParseSpecial(XisoFileEntry file) { switch (file.Name) { case DEFAULTXEX: ContentType = ContentType.GameOnDemand; var xex = GetFile(file); var xexContent = ModelFactory.GetModel <XexFile>(xex); if (xexContent.IsValid) { xexContent.DecryptBaseFile(); var executionId = xexContent.Get <XexExecutionId>(); var xdbf = xexContent.GetResource(executionId.TitleId); var gpd = ModelFactory.GetModel <GpdFile>(xdbf); var entry = gpd.Entries.SingleOrDefault(e => e.Id == 1 && e.Type == EntryType.Setting); var content = gpd.GetEntryContent(entry); Details.Name = Encoding.UTF8.GetString(content, 0x12, content[0x11]); const ulong tid = (ulong)SettingId.TitleInformation; entry = gpd.Entries.SingleOrDefault(e => e.Id == tid && e.Type == EntryType.Image); if (entry != null) { content = gpd.GetEntryContent(entry); var image = ModelFactory.GetModel <ImageEntry>(content); Details.Thumbnail = image.ImageData; } Details.TitleId = executionId.TitleId; Details.MediaId = executionId.MediaId; Details.Version = executionId.Version; Details.BaseVersion = executionId.BaseVersion; Details.DiscNumber = executionId.DiscNumber; Details.DiscCount = executionId.DiscCount; Details.ExecutionType = executionId.ExecutableType; Details.Platform = executionId.Platform; } break; case DEFAULTXBE: ContentType = ContentType.XboxOriginalGame; var xbe = GetFile(file); var xbeContent = ModelFactory.GetModel <XbeFile>(xbe); if (xbeContent.IsValid) { xbeContent.Initialize(); Details.TitleId = xbeContent.Certificate.TitleId; Details.Name = xbeContent.Certificate.TitleName; Details.Version = xbeContent.Certificate.Version; Details.DiscNumber = (byte)xbeContent.Certificate.DiscNumber; if (Details.DiscNumber == 0) { Details.DiscNumber = 1; } Details.DiscCount = Details.DiscNumber; var section = xbeContent.Sections.FirstOrDefault(s => s.Name == "$$XSIMAGE") ?? xbeContent.Sections.FirstOrDefault(s => s.Name == "$$XTIMAGE"); if (section != null) { var xpr = ModelFactory.GetModel <XprPackage>(section.Data); if (xpr.IsValid) { var img = xpr.DecompressImage(); var ms = new MemoryStream(); img.Save(ms, ImageFormat.Png); Details.Thumbnail = ms.ToArray(); } } } break; } }