Exemplo n.º 1
0
 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));
 }
Exemplo n.º 2
0
        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);
            }
        }
Exemplo n.º 3
0
        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;
            }
        }