Esempio n. 1
0
        public static string Parse(EndianBinReader node, uint ptr)
        {
            uint   length = Util.ExtractValueAndAdvance(node, ref ptr);
            string data   = Encoding.ASCII.GetString(node.ReadBytes((int)length));

            return(data);
        }
Esempio n. 2
0
        public override void Read(EndianBinReader reader)
        {
            var pageNameOffset = reader.ReadUInt32();
            var pairUnitCount  = reader.ReadUInt32();
            var pairUnitOffset = reader.ReadUInt32();

            reader.BaseStream.Position = pageNameOffset;
            Name = reader.ReadNullTerminatedString();

            reader.BaseStream.Position += reader.BaseStream.Position % 0x10; // Padding with 0x5E

            for (int i = 0; i < pairUnitCount; i++)
            {
                reader.BaseStream.Position = pairUnitOffset + (i * EntrySize);
                int  id          = reader.ReadInt32();
                uint labelOffset = reader.ReadUInt32();
                uint valueOffset = reader.ReadUInt32();

                reader.BaseStream.Position = labelOffset;
                string label = reader.ReadNullTerminatedString();

                reader.BaseStream.Position = valueOffset;
                string value = reader.ReadNullTerminatedString();

                var pair = new RTextPairUnit(id, label, value);
                PairUnits.Add(label, pair);
            }
        }
Esempio n. 3
0
        public EntryTable(EndianBinReader reader, ILogWriter logWriter = null)
        {
            _reader    = reader;
            _logWriter = logWriter;

            Read();
        }
Esempio n. 4
0
        }                                 // Just junk data?

        public RT04CategoryMeta(EndianBinReader reader)
        {
            TitleOffset = reader.ReadUInt32();
            EntryCount  = reader.ReadUInt32();
            EntryOffset = reader.ReadUInt32();
            Padding     = reader.ReadUInt32();
        }
Esempio n. 5
0
        public static string ExtractStringAtOffset(EndianBinReader reader, uint offset)
        {
            reader.BaseStream.Seek(offset, SeekOrigin.Begin);
            byte Length = reader.ReadByte();

            return(Encoding.ASCII.GetString(reader.ReadBytes(Length), 0, Length));
        }
Esempio n. 6
0
        /// <summary>
        ///     Determine if the VOL file is of type TOC 2.2, TOC 3.1 or GTPSP (others aren't supported).
        /// </summary>
        /// <param name="stream">Stream containing the VOL file.</param>
        /// <returns>FileType</returns>
        private FileType GetVOLType(Stream stream)
        {
            var fileType = FileType.UNKNOWN;

            using (var reader = new EndianBinReader(stream, EndianType.BIG_ENDIAN)) {
                if (reader.BaseStream.Length - reader.BaseStream.Position < 0x08)
                {
                    throw new ArgumentException("Invalid VOL file.");
                }

                var magic = reader.ReadUInt64();
                if (magic == TOC22_MAGIC)
                {
                    fileType = FileType.TOC22_VOL;
                    if (TOC31Offset(reader) > -1)
                    {
                        fileType = FileType.TOC31_VOL;
                    }
                }
                else if (magic == TOCPSP_MAGIC)
                {
                    fileType = FileType.GTPSP_VOL;
                }
            }

            return(fileType);
        }
Esempio n. 7
0
        public override void Read(EndianBinReader reader)
        {
            var pageNameOffset = _gt7 ? reader.ReadInt64() : reader.ReadUInt32();
            var pairUnitCount  = reader.ReadUInt32();

            reader.ReadUInt32(); // Unk
            var pairUnitOffset = _gt7 ? reader.ReadInt64() : reader.ReadUInt32();

            reader.BaseStream.Position = (int)pageNameOffset;
            Name = reader.ReadNullTerminatedString();

            for (int i = 0; i < pairUnitCount; i++)
            {
                reader.BaseStream.Position = pairUnitOffset + (i * (_gt7 ? EntrySizeGT7 : EntrySize));
                int id = reader.ReadInt32();

                ushort labelLen = reader.ReadUInt16();
                ushort valueLen = reader.ReadUInt16();

                long labelOffset = _gt7 ? reader.ReadInt64() : reader.ReadUInt32();
                long valueOffset = _gt7 ? reader.ReadInt64() : reader.ReadUInt32();

                reader.BaseStream.Position = labelOffset;
                string label = ReadString(reader, labelLen);

                reader.BaseStream.Position = valueOffset;
                string value = ReadString(reader, valueLen);

                var pair = new RTextPairUnit(id, label, value);
                PairUnits.Add(label, pair);
            }
        }
Esempio n. 8
0
        public static string ExtractStringAtOffset(ref EndianBinReader reader, uint offset)
        {
            reader.BaseStream.Position += offset;
            byte Length = reader.ReadByte();

            return(Encoding.ASCII.GetString(reader.ReadBytes((int)Length)).TrimEnd('\0'));
        }
Esempio n. 9
0
        private FileInfoBTree[] LoadFileInfoBTree(EndianBinReader reader, uint offset)
        {
            reader.BaseStream.Seek(offset, System.IO.SeekOrigin.Begin);
            byte childCount  = reader.ReadByte();
            uint childOffset = reader.Read3BytesUInt32();
            uint nodeCount   = reader.ReadUInt16();
            uint dataOffset  = offset + 4 + 2;
            var  objects     = new FileInfoBTree[0];
            uint indexer     = 0;

            for (int i = 0; i < nodeCount; i++)
            {
                uint keyCount           = (ushort)(Util.ExtractTwelveBits(reader, dataOffset, 0) & 0x7FF);
                uint nextNodeDataOffset =
                    (ushort)(Util.ExtractTwelveBits(reader, dataOffset, (ushort)(keyCount + 1)));
                Array.Resize(ref objects, (int)(objects.Length + keyCount));
                for (int j = 0; j < keyCount; j++)
                {
                    uint nodeOffset = Util.ExtractTwelveBits(reader, dataOffset, (uint)j + 1);
                    var  tmpOffset  = (dataOffset + nodeOffset);
                    objects[indexer] = new FileInfoBTree(reader, ref tmpOffset);
                    indexer++;
                }

                dataOffset += nextNodeDataOffset;
            }

            return(objects);
        }
Esempio n. 10
0
        public override void Read(byte[] data)
        {
            using (var ms = new MemoryStream(data))
                using (var reader = new EndianBinReader(ms, EndianType.LITTLE_ENDIAN))
                {
                    reader.BaseStream.Position = 0;
                    if (reader.ReadString(4) != Magic)
                    {
                        throw new Exception($"Invalid magic, doesn't match {Magic}.");
                    }

                    int entryCount = reader.ReadInt32();

                    // Relocation ptr is at 0x10

                    // Data starts at 0x20

                    for (int i = 0; i < entryCount; i++)
                    {
                        ms.Position = HeaderSize + (i * (_gt7 ? 0x18 : 0x10));
                        var page = new RT05Page(_logWriter, gt7: _gt7);
                        page.Read(reader);
                        _pages.Add(page.Name, page);
                    }
                }
        }
Esempio n. 11
0
 public void Load(byte[] data, uint dataSize, uint segmentSize)
 {
     using (var ms = new MemoryStream(data))
         using (var reader = new EndianBinReader(ms))
         {
             Load(reader, dataSize, segmentSize);
         }
 }
Esempio n. 12
0
        public static int KeyLessThanOP(Key key, EndianBinReader data)
        {
            EndianBinReader ptr    = data;
            uint            index  = Util.ExtractValueAndAdvance(ptr);
            int             result = KeyEqualOP(key, ptr);

            return(result != 0 ? result : 1);
        }
Esempio n. 13
0
 public _50TRCategoryMeta(EndianBinReader reader)
 {
     TitleOffset = reader.ReadUInt32();
     Padding1    = reader.ReadUInt32();
     EntryCount  = reader.ReadUInt32();
     Padding2    = reader.ReadUInt32();
     EntryOffset = reader.ReadUInt32();
 }
Esempio n. 14
0
 public FileIDBTree(EndianBinReader reader, ref uint offset)
 {
     reader.BaseStream.Seek(offset, SeekOrigin.Begin);
     Flag = reader.ReadByte();
     offset++;
     NameIndex      = Util.ExtractValueAndAdvance(reader, ref offset);
     ExtensionIndex = (Flag & kFILE_FLAG) != 0 ? Util.ExtractValueAndAdvance(reader, ref offset) : 0;
     EntryIndex     = Util.ExtractValueAndAdvance(reader, ref offset);
 }
Esempio n. 15
0
        public bool Load(EndianBinReader reader, bool readHeader = false)
        {
            if (readHeader)
            {
                if (reader.ReadUInt32() != kMAGIC)
                {
                    return(false);
                }

                _nameTableOffset      = reader.ReadUInt32();
                _extensionTableOffset = reader.ReadUInt32();
                _fileInfoTableOffset  = reader.ReadUInt32();
                _numFileIdTrees       = reader.ReadUInt32();
            }

            _fileIdOffsets = new uint[_numFileIdTrees];
            for (int i = 0; i < _numFileIdTrees; i++)
            {
                _fileIdOffsets[i] = reader.ReadUInt32();
            }

            // Read Names
            Names = LoadStringBTree(reader, _nameTableOffset);
            // Read Extensions
            Extensions = LoadStringBTree(reader, _extensionTableOffset);
            // Read FileInfo
            FileInfos = LoadFileInfoBTree(reader, _fileInfoTableOffset);

            // Read FileID:s
            int index = 0;

            FileIDs = new FileIDBTree[_fileIdOffsets.Length][];

            foreach (uint offset in _fileIdOffsets)
            {
                FileIDBTree[] temp = new FileIDBTree[0];
                LoadFileIDBTree(reader, ref temp, offset);

                FileIDs[index] = temp;
                index++;
            }

            // Get the file count
            for (int i = 0; i < FileIDs.Length; i++)
            {
                for (int j = 0; j < FileIDs[i].Length; j++)
                {
                    if (FileIDs[i][j].Flag == FileIDBTree.kFILE_FLAG ||
                        FileIDs[i][j].Flag == FileIDBTree.kFILE_WITHOUT_EXTENSION_FLAG)
                    {
                        FileCount++;
                    }
                }
            }

            return(true);
        }
Esempio n. 16
0
        private string ReadString(EndianBinReader reader, ushort length)
        {
            var buffer = reader.ReadBytes(length - 1);

            /* Haven't seen any evidence in the gt6 eboot upon getting a string that this corresponds to a rtext being encrypted
             * if (_header.Obfuscated == 1 && buffer.Length > 0)
             *  buffer = Decrypt(buffer, Constants.KEY.AlignString(0x20)); */
            buffer = Decrypt(buffer, Constants.KEY.AlignString(0x20));
            return(Encoding.UTF8.GetString(buffer));
        }
Esempio n. 17
0
        public RT04Header(EndianBinReader reader)
        {
            reader.BaseStream.Position = 0;
            if ((Magic = reader.ReadUInt32(EndianType.BIG_ENDIAN)) != Constants.RT04_MAGIC)
            {
                throw new Exception("Invalid magic, doesn't match RT04.");
            }

            Padding    = reader.ReadUInt64();
            EntryCount = reader.ReadUInt32();
        }
Esempio n. 18
0
        public static ushort ExtractTwelveBits(EndianBinReader reader, uint ptr_data, uint offset)
        {
            reader.BaseStream.Seek((int)(ptr_data + (offset * 16 - offset * 4) / 8), SeekOrigin.Begin);
            ushort result = reader.ReadUInt16();

            if ((offset & 0x1) == 0)
            {
                result /= 16;
            }
            return((ushort)(result & 0xFFF));
        }
Esempio n. 19
0
        public static ushort ExtractTwelveBits(EndianBinReader reader, uint offset)
        {
            reader.BaseStream.Position += ((offset * 16 - offset * 4) / 8);
            ushort result = reader.ReadUInt16();

            if ((offset & 0x1) == 0)
            {
                result /= 16;
            }
            return((ushort)(result & 0xFFF));
        }
Esempio n. 20
0
        public _50TRHeader(EndianBinReader reader)
        {
            reader.BaseStream.Position = 0;
            if ((Magic = reader.ReadUInt32(EndianType.BIG_ENDIAN)) != Constants._50TR_MAGIC)
            {
                throw new Exception("Invalid magic, doesn't match 50TR.");
            }

            EntryCount = reader.ReadUInt32();
            Obfuscated = reader.ReadByte();
        }
Esempio n. 21
0
        public RT05Header(EndianBinReader reader)
        {
            reader.BaseStream.Position = 0;
            if ((Magic = reader.ReadUInt32()) != Constants.RT05_MAGIC)
            {
                throw new Exception("Invalid magic, doesn't match RT05.");
            }

            EntryCount = reader.ReadUInt32();
            Obfuscated = reader.ReadByte();
        }
Esempio n. 22
0
        public Header(EndianBinReader reader)
        {
            reader.BaseStream.Position = 0;
            if ((Magic = reader.ReadUInt32()) != Constants.NDB0_MAGIC)
            {
                throw new Exception("Invalid magic, doesn't match NDB0.");
            }

            Padding            = reader.ReadUInt32();
            SpeedUpTableOffset = reader.ReadUInt32();
            EntryCount         = reader.ReadUInt32();
        }
Esempio n. 23
0
 public FileInfoBTree(EndianBinReader reader, ref uint offset)
 {
     reader.BaseStream.Seek(offset, SeekOrigin.Begin);
     CompressedFlag = reader.ReadByte();
     offset++;
     EntryIndex       = Util.ExtractValueAndAdvance(reader, ref offset);
     CompressedSize   = Util.ExtractValueAndAdvance(reader, ref offset);
     UncompressedSize = (CompressedFlag & kFLAG) != 0
         ? Util.ExtractValueAndAdvance(reader, ref offset)
         : CompressedSize;
     SegmentIndex = Util.ExtractValueAndAdvance(reader, ref offset);
 }
Esempio n. 24
0
        /// <summary>
        ///     Search for the TOC 3.1 in the VOL file and return its offset if found
        /// </summary>
        private long TOC31Offset(EndianBinReader reader)
        {
            for (int i = 0; i < Math.Min((reader.BaseStream.Length / 0x800), 10000); i++)
            {
                reader.BaseStream.Seek(i * 0x800, SeekOrigin.Begin);
                ulong magic = reader.ReadUInt64();
                if (magic == TOC31_MAGIC_ENCRYPTED || magic - TOC31_MAGIC == 0)
                {
                    return(i * 0x800);
                }
            }

            return(-1);
        }
Esempio n. 25
0
        public void Load(EndianBinReader reader, uint dataSize, uint segmentSize)
        {
            if (reader.ReadUInt32() != kMAGIC)
            {
                return;
            }

            SegmentSize = segmentSize;

            _nameTableOffset      = reader.ReadUInt32();
            _extensionTableOffset = reader.ReadUInt32();
            _fileInfoTableOffset  = reader.ReadUInt32();
            _numFileIdTrees       = reader.ReadUInt32();

            Load(reader);
        }
Esempio n. 26
0
        public static uint ExtractValueAndAdvance(EndianBinReader reader)
        {
            uint value = reader.ReadByte();

            if ((value & 0x80) != 0)
            {
                uint mask = 0x80;
                do
                {
                    value = ((value - mask) << 8) + reader.ReadByte();
                    mask  = mask << 7;
                } while ((value & mask) != 0);
            }

            return(value);
        }
Esempio n. 27
0
        public EntryMetaData(EndianBinReader reader)
        {
            CarID              = reader.ReadUInt32();
            OrderID            = reader.ReadUInt32();
            DataOffset         = reader.ReadUInt32();
            LookupTableOffsets = reader.ReadBytes(4);
            Lookup1            = LookupTableOffsets[0];
            Lookup2            = LookupTableOffsets[1];
            Lookup3            = LookupTableOffsets[2];
            Lookup4            = LookupTableOffsets[3];

            var saveOffset = reader.BaseStream.Position;

            reader.BaseStream.Position = DataOffset;
            Data = reader.ReadNullTerminatedString();
            reader.BaseStream.Position = saveOffset;
        }
Esempio n. 28
0
        public static uint ExtractValueAndAdvance(EndianBinReader reader, ref uint ptr)
        {
            uint p = 0;

            reader.BaseStream.Seek((ptr + p++), SeekOrigin.Begin);
            uint value = reader.ReadByte();

            if ((value & 0x80) != 0)
            {
                uint mask = 0x80;
                do
                {
                    reader.BaseStream.Seek((ptr + p++), SeekOrigin.Begin);
                    value = ((value - mask) << 8) + reader.ReadByte();
                    mask  = mask << 7;
                } while ((value & mask) != 0);
            }

            ptr += p;
            return(value);
        }
Esempio n. 29
0
        public bool Read(EndianBinReader reader, uint size, uint realSize)
        {
            Size     = size;
            RealSize = realSize;

            if ((Magic = reader.ReadUInt32()) != 0xC5EEF7FFu)
            {
                return(false);
            }

            DataSize = reader.ReadUInt32();
            DataSize = (uint)-DataSize;

            Size -= Consts.kVOLUME_SEGMENT_HEADER_SIZE;

            Data = reader.ReadBytes((int)Size);
            Data = DeflateStream.UncompressBuffer(Data);
            System.Diagnostics.Debug.Assert(Data.Length == RealSize);

            return(true);
        }
Esempio n. 30
0
        public void Read(byte[] data)
        {
            using (var ms = new MemoryStream(data))
                using (var reader = new EndianBinReader(ms))
                {
                    switch (reader.ReadUInt32())
                    {
                    case Constants.RT03_MAGIC:
                        RText = new RT03(_logWriter);
                        break;

                    case Constants.RT04_MAGIC:
                        RText = new RT04(_logWriter);
                        break;

                    case Constants.RT05_MAGIC:
                        RText = new RT05(_logWriter);
                        break;

                    case Constants._50TR_MAGIC:
                        try
                        {
                            RText = new _50TR(_logWriter);
                            RText.Read(data);
                            return;
                        }
                        catch { }

                        // Failed, try GT7
                        RText = new _50TR(_logWriter, gt7: true);
                        break;

                    default:
                        throw new ArgumentOutOfRangeException("Unknown header magic.");
                    }

                    RText.Read(data);
                }
        }