Beispiel #1
0
        private static GtexData ReadGtexFromVtex(Stream headers)
        {
            VtexHeader textureHeader = headers.ReadContent <VtexHeader>();

            headers.Seek(textureHeader.GtexOffset - VtexHeader.Size, SeekOrigin.Current);
            return(headers.ReadContent <GtexData>());
        }
Beispiel #2
0
        public unsafe void ReadFromStream(Stream stream)
        {
            byte[] name = stream.EnsureRead(NameSize);
            fixed (byte* namePtr = &name[0])
                Name = new string((sbyte*)namePtr, 0, NameSize, YkdFile.NamesEncoding).TrimEnd('\0');

            Offsets = stream.ReadContent<YkdOffsets>();
            Frames = new YkdFrames[Offsets.Count];
            for (int i = 0; i < Frames.Length; i++)
                Frames[i] = stream.ReadContent<YkdFrames>();
        }
Beispiel #3
0
 public void ReadFromStream(Stream stream)
 {
     Header     = stream.ReadContent <YkdHeader>();
     Background = stream.ReadContent <YkdBlock>();
     Offsets    = stream.ReadContent <YkdOffsets>();
     Blocks     = new YkdBlock[Offsets.Count];
     for (int i = 0; i < Blocks.Length; i++)
     {
         stream.SetPosition(Offsets[i]);
         Blocks[i] = stream.ReadContent <YkdBlock>();
     }
     Resources = stream.ReadContent <YkdResources>();
 }
Beispiel #4
0
        public unsafe void ReadFromStream(Stream stream)
        {
            byte[] name = stream.EnsureRead(NameSize);

            fixed(byte *namePtr = &name[0])
            Name = new string((sbyte *)namePtr, 0, NameSize, YkdFile.NamesEncoding).TrimEnd('\0');

            Offsets = stream.ReadContent <YkdOffsets>();
            Frames  = new YkdFrames[Offsets.Count];
            for (int i = 0; i < Frames.Length; i++)
            {
                Frames[i] = stream.ReadContent <YkdFrames>();
            }
        }
Beispiel #5
0
            public void Deserialize()
            {
                if (_header.Entries == null)
                {
                    return;
                }

                int entryCount = Math.Max(0, _header.Entries.Length - SpecialEntriesCount);

                WdbMovieEntry[] entries = new WdbMovieEntry[entryCount];

                for (int i = 0; i < entryCount; i++)
                {
                    WpdEntry entry = _header.Entries[i + SpecialEntriesCount];
                    _input.SetPosition(entry.Offset);

                    if (entry.Length != WdbMovieEntry.StructSize)
                    {
                        throw new InvalidDataException($"[WdbMovieHeader.Deserialize] Entry: {entry.Name}, Length: {entry.Length}, Expected length: {WdbMovieEntry.StructSize}");
                    }

                    WdbMovieEntry movieEntry = _input.ReadContent <WdbMovieEntry>();
                    movieEntry.Entry       = entry;
                    movieEntry.PackageName = _header.GetString(movieEntry.PackageNameOffset);
                    entries[i]             = movieEntry;
                }

                _header.Movies = entries;
            }
Beispiel #6
0
        public static DxTexture ReadFromWpd(WpdArchiveListing listing, WpdEntry entry)
        {
            using (Stream headers = listing.Accessor.ExtractHeaders())
                using (Stream content = listing.Accessor.ExtractContent())
                {
                    headers.SetPosition(entry.Offset);

                    GtexData      gtex;
                    SectionHeader sectionHeader = headers.ReadContent <SectionHeader>();
                    switch (sectionHeader.Type)
                    {
                    case SectionType.Txb:
                        gtex = ReadGtexFromTxb(headers);
                        break;

                    case SectionType.Vtex:
                        gtex = ReadGtexFromVtex(headers);
                        break;

                    default:
                        throw new NotImplementedException();
                    }

                    return(LoadFromStream(gtex, content));
                }
        }
Beispiel #7
0
        public ArchiveListing Read()
        {
            ArchiveListingHeaderV2 header;

            using (Stream input = Decrypt(out header))
            {
                _progressTotalChanged.NullSafeInvoke(header.EntriesCount);

                short blockNumber = -1;
                bool? flag        = null;

                ArchiveListingEntryInfoV2[] entries = new ArchiveListingEntryInfoV2[header.EntriesCount];
                for (int i = 0; i < entries.Length; i++)
                {
                    entries[i] = input.ReadContent <ArchiveListingEntryInfoV2>();
                    if (entries[i].Flag != flag)
                    {
                        flag = entries[i].Flag;
                        blockNumber++;
                    }
                    entries[i].BlockNumber = blockNumber;
                }

                ArchiveListingCompressedData data = new ArchiveListingCompressedData(header);
                data.ReadFromStream(input);

                ArchiveListing result = new ArchiveListing(_accessor, header);
                ParseEntries(entries, data, result);
                return(result);
            }
        }
Beispiel #8
0
        public void ReadFromStream(Stream stream)
        {
            BinaryReader br = new BinaryReader(stream);

            Unknown1 = br.ReadInt32();
            Unknown2 = br.ReadInt32();
            int count = br.ReadInt32();

            Unknown3 = br.ReadInt32();

            int[] offsets = new int[count];
            for (int i = 0; i < count; i++)
            {
                offsets[i] = br.ReadInt32();
            }

            int alignment = ((4 - (count % 4)) % 4);

            for (int i = 0; i < alignment; i++)
            {
                br.Check(r => r.ReadInt32(), 0);
            }

            Frames = new YkdFrame[count];
            for (int i = 0; i < count; i++)
            {
                stream.SetPosition(offsets[i]);
                Frames[i] = stream.ReadContent <YkdFrame>();
            }
        }
Beispiel #9
0
        public void ReadFromStream(Stream stream)
        {
            BinaryReader br = new BinaryReader(stream);

            IsFirstBlock = stream.Position == YkdHeader.Size;

            Type            = br.ReadUInt32();
            Index           = br.ReadUInt32();
            AssociatedIndex = br.ReadUInt32();
            Unknown         = br.ReadUInt32();

            for (int i = 0; i < TransformationMatrix.Length; i++)
            {
                TransformationMatrix[i] = br.ReadBigInt32();
            }

            Offsets = stream.ReadContent <YkdOffsets>();
            Entries = new YkdBlockEntry[Offsets.Count];
            for (int i = 0; i < Offsets.Count; i++)
            {
                stream.SetPosition(Offsets[i]);
                Entries[i] = stream.ReadContent <YkdBlockEntry>();
            }

            if (!IsFirstBlock)
            {
                switch (Type)
                {
                case 0:
                    ZeroTail = stream.ReadContent <YkdBlockOptionalTail>();
                    break;

                case 4:
                    Tails4 = stream.ReadContent <YkdBlockOptionalTails>();
                    break;

                case 5:
                case 6:
                    Tail56 = new int[12];
                    for (int i = 0; i < Tail56.Length; i++)
                    {
                        Tail56[i] = br.ReadInt32();
                    }
                    break;
                }
            }
        }
Beispiel #10
0
        public void ReadFromStream(Stream stream)
        {
            BinaryReader br = new BinaryReader(stream);

            SamplesPerBlock   = br.ReadInt16();
            CoefficientsCount = br.ReadInt16();
            Coefficients      = stream.ReadContent <AdPcmCoefficientSet>(CoefficientsCount);
        }
        public void ReadFromStream(Stream stream)
        {
            BinaryReader br = new BinaryReader(stream);

            Count    = br.ReadInt32();
            Unknown1 = br.ReadInt32();
            Unknown2 = br.ReadInt32();
            Unknown3 = br.ReadInt32();
            Tails    = stream.ReadContent <YkdBlockOptionalTail>(Count);
        }
 public SeDbArchiveListing Read()
 {
     using (Stream input = _accessor.ExtractHeaders())
     {
         SeDbResHeader      header = input.ReadContent <SeDbResHeader>();
         SeDbArchiveListing result = new SeDbArchiveListing(_accessor, header.Count);
         result.AddRange(header.Entries);
         return(result);
     }
 }
Beispiel #13
0
        public WaveStream[] Read()
        {
            SectionHeader sectionHeader = _input.ReadContent <SectionHeader>();
            SscfHeader    sscfHeader    = _input.ReadContent <SscfHeader>();

            BinaryReader br = new BinaryReader(_input);

            _input.SetPosition(sscfHeader.WavesOffset);
            int[] offsets = new int[sscfHeader.NumWaves];
            for (int i = 0; i < offsets.Length; i++)
            {
                offsets[i] = br.ReadInt32();
            }

            WaveStream[] result = new WaveStream[sscfHeader.NumWaves];
            for (int i = 0; i < offsets.Length; i++)
            {
                _input.SetPosition(offsets[i]);
                SscfWaveHeader waveHeader = _input.ReadContent <SscfWaveHeader>();
                if (waveHeader.Format == SscfWaveFormat.Vorbis)
                {
                    _input.SetPosition(waveHeader.DataOffset);
                    byte[]       vorbisData = _input.EnsureRead(waveHeader.DataLength);
                    MemoryStream vorbisMs   = new MemoryStream(vorbisData, 0, vorbisData.Length, false);
                    result[i] = new VorbisWaveReader(vorbisMs);
                    continue;
                }

                WaveFormat format = ReadWaveFormat(waveHeader);
                if (format == null)
                {
                    continue;
                }


                _input.SetPosition(waveHeader.DataOffset);
                byte[]       data = _input.EnsureRead(waveHeader.DataLength);
                MemoryStream ms   = new MemoryStream(data, 0, data.Length, false);
                result[i] = new RawSourceWaveStream(ms, format);
            }
            return(result);
        }
Beispiel #14
0
        public void ReadFromStream(Stream stream)
        {
            BinaryReader br = new BinaryReader(stream);

            IsFirstBlock = stream.Position == YkdHeader.Size;

            Type = br.ReadUInt32();
            Index = br.ReadUInt32();
            AssociatedIndex = br.ReadUInt32();
            Unknown = br.ReadUInt32();

            for (int i = 0; i < TransformationMatrix.Length; i++)
                TransformationMatrix[i] = br.ReadBigInt32();

            Offsets = stream.ReadContent<YkdOffsets>();
            Entries = new YkdBlockEntry[Offsets.Count];
            for (int i = 0; i < Offsets.Count; i++)
            {
                stream.SetPosition(Offsets[i]);
                Entries[i] = stream.ReadContent<YkdBlockEntry>();
            }

            if (!IsFirstBlock)
            {
                switch (Type)
                {
                    case 0:
                        ZeroTail = stream.ReadContent<YkdBlockOptionalTail>();
                        break;
                    case 4:
                        Tails4 = stream.ReadContent<YkdBlockOptionalTails>();
                        break;
                    case 5:
                    case 6:
                        Tail56 = new int[12];
                        for (int i = 0; i < Tail56.Length; i++)
                            Tail56[i] = br.ReadInt32();
                        break;
                }
            }
        }
Beispiel #15
0
 public WdbMovieArchiveListing Read()
 {
     using (Stream input = _accessor.ExtractHeaders())
     {
         WdbMovieHeader         header = input.ReadContent <WdbMovieHeader>();
         WdbMovieArchiveListing result = new WdbMovieArchiveListing(_accessor, header.Count);
         if (header.Movies != null)
         {
             result.AddRange(header.Movies);
         }
         return(result);
     }
 }
Beispiel #16
0
        public void ReadFromStream(Stream stream)
        {
            Offsets = stream.ReadContent<YkdOffsets>();

            Resources = new YkdResource[Offsets.Count];
            for (int i = 0; i < Resources.Length; i++)
            {
                YkdResource resource = Resources[i] = new YkdResource();

                stream.SetPosition(Offsets[i]);
                resource.ReadFromStream(stream);
            }

            if (!stream.IsEndOfStream())
                throw new InvalidDataException();
        }
Beispiel #17
0
        public void ReadFromStream(Stream input)
        {
            BinaryReader br = new BinaryReader(input);

            Magic = br.ReadInt64();
            Unknown1 = br.ReadInt32();
            Unknown2 = br.ReadInt32();

            br.Read(UnknownBuff, 0, UnknownBuff.Length);

            Count = br.ReadInt32();
            Unknown3 = br.ReadInt32();
            Unknown4 = br.ReadInt32();
            Unknown5 = br.ReadInt32();

            Entries = input.ReadContent<SeDbResEntry>(Count);
        }
Beispiel #18
0
        public void ReadFromStream(Stream input)
        {
            BinaryReader br = new BinaryReader(input);

            Magic    = br.ReadInt64();
            Unknown1 = br.ReadInt32();
            Unknown2 = br.ReadInt32();

            br.Read(UnknownBuff, 0, UnknownBuff.Length);

            Count    = br.ReadInt32();
            Unknown3 = br.ReadInt32();
            Unknown4 = br.ReadInt32();
            Unknown5 = br.ReadInt32();

            Entries = input.ReadContent <SeDbResEntry>(Count);
        }
Beispiel #19
0
        public void ReadFromStream(Stream stream)
        {
            Offsets = stream.ReadContent <YkdOffsets>();

            Resources = new YkdResource[Offsets.Count];
            for (int i = 0; i < Resources.Length; i++)
            {
                YkdResource resource = Resources[i] = new YkdResource();

                stream.SetPosition(Offsets[i]);
                resource.ReadFromStream(stream);
            }

            if (!stream.IsEndOfStream())
            {
                throw new InvalidDataException();
            }
        }
Beispiel #20
0
        private static GtexData ReadGtexFromTxb(Stream headers)
        {
            TextureHeader textureHeader = headers.ReadContent <TextureHeader>();

            return(headers.ReadContent <GtexData>());
        }
Beispiel #21
0
 public override void ReadFromStream(Stream input)
 {
     base.ReadFromStream(input);
     TextureHeader = input.ReadContent <TextureHeader>();
     Gtex          = input.ReadContent <GtexData>();
 }
Beispiel #22
0
 public virtual void ReadFromStream(Stream stream)
 {
     SectionHeader = stream.ReadContent <SectionHeader>();
 }
        public UmdFile Parse(Stream stream)
        {
            var buf  = new byte[33 * 1024];
            var file = new UmdFile();

            //前四个字节区分文件类型
            stream.ReadLength(buf, 4);
            //然后是5个固定的字节
            stream.ReadLength(buf, 5);
            //下面一个字节指定文件类型
            var filetype = stream.ReadByte();

            if (filetype != 1)
            {
                throw new Exception("只能读取文件类型的umd文件");
            }
            //接下来2个随机数
            stream.ReadLength(buf, 2);
            //接下来读取文件属性02->ob
            FileSection p = null;

            do
            {
                p = stream.ReadFileProperty(buf, file);
            } while (p != null);
            //章节偏移量
            file.ChapterOffset = stream.ReadChapterOffset(buf);
            //章节标题
            file.ChapterTitle = stream.ReadChapterTitle(buf, file.ChapterOffset.ChapterOffset.Count);
            //正文
            file.Content = stream.ReadContent(buf);
            //封面
            file.Cover = stream.ReadCover(buf);
            //页面偏移
            PageOffsetItem pageoffsetItem = null;

            do
            {
                pageoffsetItem = stream.ReadPageOffsetItem(buf);

                if (file.PageOffset == null)
                {
                    file.PageOffset = new PageOffsetSection {
                        PageOffsetCollection = new List <PageOffsetItem>()
                    };
                }
                if (pageoffsetItem != null)
                {
                    file.PageOffset.PageOffsetCollection.Add(pageoffsetItem);
                }
            } while (pageoffsetItem != null);
            //文件结束 9个字节
            stream.ReadByte();
            var end = stream.ReadByte();

            if (end != 0x0c)
            {
                stream.ReadLength(buf, (int)(stream.Length - stream.Position));
                Console.WriteLine("文件大小对不上");
            }

            if (file.Content.Content == null)
            {
                file.Content.Content = new string[file.ChapterOffset.ChapterOffset.Count];
            }

            return(file);
        }
Beispiel #24
0
        private Stream Decrypt(out ArchiveListingHeaderV2 header)
        {
            Stream result = _accessor.ExtractListing();

            try
            {
                header = result.ReadContent <ArchiveListingHeaderV2>();
                if (header.IsValid(result.Length))
                {
                    header.IsEncrypted = false;
                    return(result);
                }

                /*using (*/
                TempFileProvider tmpProvider = new TempFileProvider(_accessor.ListingEntry.Name /*"filelist"*/, ".win32.bin");/*)*/
                {
                    using (Stream output = tmpProvider.Create())
                    {
                        output.WriteContent(header);
                        result.CopyTo(output);
                        result.SafeDispose();
                    }

                    Process decrypter = new Process
                    {
                        StartInfo = new ProcessStartInfo()
                        {
                            FileName               = @"Resources\Executable\ffxiiicrypt.exe",
                            Arguments              = "-d \"" + tmpProvider.FilePath + "\" 2",
                            CreateNoWindow         = true,
                            UseShellExecute        = false,
                            RedirectStandardOutput = true,
                            RedirectStandardError  = true
                        }
                    };
                    decrypter.Start();
                    Task <string> erroMessage   = decrypter.StandardError.ReadToEndAsync();
                    Task <string> outputMessage = decrypter.StandardOutput.ReadToEndAsync();
                    decrypter.WaitForExit();
                    if (decrypter.ExitCode != 0)
                    {
                        StringBuilder sb = new StringBuilder("Decryption error! Code: ");
                        sb.AppendLine(decrypter.ExitCode.ToString());
                        sb.AppendLine("Error: ");
                        sb.AppendLine(erroMessage.Result);
                        sb.AppendLine("Output: ");
                        sb.AppendLine(outputMessage.Result);

                        throw new InvalidDataException(sb.ToString());
                    }

                    result             = tmpProvider.OpenRead();
                    header             = result.ReadContent <ArchiveListingHeaderV2>();
                    header.IsEncrypted = true;
                    if (!header.IsValid(result.Length))
                    {
                        throw new InvalidDataException();
                    }
                }

                return(result);
            }
            catch
            {
                result.SafeDispose();
                throw;
            }
        }
Beispiel #25
0
 private static GtexData ReadGtexFromTxb(Stream headers)
 {
     TextureHeader textureHeader = headers.ReadContent<TextureHeader>();
     return headers.ReadContent<GtexData>();
 }
Beispiel #26
0
 private static GtexData ReadGtexFromVtex(Stream headers)
 {
     VtexHeader textureHeader = headers.ReadContent<VtexHeader>();
     headers.Seek(textureHeader.GtexOffset - VtexHeader.Size, SeekOrigin.Current);
     return headers.ReadContent<GtexData>();
 }
Beispiel #27
0
 public void ReadFromStream(Stream input)
 {
     Header     = input.ReadContent <GtexHeader>();
     MipMapData = input.ReadContent <GtexMipMapLocation>(Header.LayerCount);
 }