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); } }