Пример #1
0
        public StfsFile(Stream stream) : this()
        {
            EndianReader reader = new EndianReader(stream, Endianness.BigEndian);

            Header = PackageHeader.Create(reader);

            if (Header == null)
            {
                throw new FormatException();
            }

            reader.ReadBytes(ContentID);
            EntryID         = reader.ReadUInt32();
            ContentType     = (ContentTypes)reader.ReadUInt32();
            MetadataVersion = reader.ReadUInt32();
            ContentSize     = reader.ReadUInt64();
            MediaID         = reader.ReadUInt32();
            Version         = reader.ReadUInt32();
            BaseVersion     = reader.ReadUInt32();
            TitleID         = reader.ReadUInt32();
            Platform        = reader.ReadByte();
            ExecutableType  = reader.ReadByte();
            DiscNumber      = reader.ReadByte();
            DiscInSet       = reader.ReadByte();
            SaveGameID      = reader.ReadUInt32();
            reader.ReadBytes(ConsoleID);
            ProfileID    = reader.ReadUInt64();
            Descriptor   = PackageDescriptor.Create(reader);
            DataFiles    = reader.ReadUInt32();
            DataFileSize = reader.ReadUInt64();
            Reserved     = reader.ReadUInt64();
            reader.ReadBytes(Padding);
            reader.ReadBytes(DeviceID);
            for (int i = 0; i < DisplayName.Length; i++)
            {
                DisplayName[i] = ReadString(reader);
            }
            for (int i = 0; i < DisplayDescription.Length; i++)
            {
                DisplayDescription[i] = ReadString(reader);
            }
            Publisher          = ReadString(reader);
            TitleName          = ReadString(reader);
            TransferFlags      = reader.ReadByte();
            ThumbnailSize      = reader.ReadUInt32();
            TitleThumbnailSize = reader.ReadUInt32();

            Thumbnail      = new Bitmap(new Substream(stream, 0x171A, ThumbnailSize));
            TitleThumbnail = new Bitmap(new Substream(stream, 0x571A, TitleThumbnailSize));

            // None of this seems right, I'm hardcoding 0x0C
            // BaseBlock = ((EntryID + 0xFFF) & 0xF000) / BlockSize;
            // BaseBlock = (uint)(Util.RoundUp(EntryID, BlockSize) / BlockSize) + 1;

            Stream = new BlockStream(this, stream);
            Stream.SeekBlock(Descriptor.FileTableBlock);
            EndianReader blockreader = new EndianReader(Stream, Endianness.BigEndian);

            while (true)
            {
                FileDescriptor file = FileDescriptor.Create(blockreader, Stream);
                if (file.IsNull())
                {
                    break;
                }
                Files.Add(file);
            }
        }