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); }
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); } }
public EntryTable(EndianBinReader reader, ILogWriter logWriter = null) { _reader = reader; _logWriter = logWriter; Read(); }
} // Just junk data? public RT04CategoryMeta(EndianBinReader reader) { TitleOffset = reader.ReadUInt32(); EntryCount = reader.ReadUInt32(); EntryOffset = reader.ReadUInt32(); Padding = reader.ReadUInt32(); }
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)); }
/// <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); }
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); } }
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')); }
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); }
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); } } }
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); } }
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); }
public _50TRCategoryMeta(EndianBinReader reader) { TitleOffset = reader.ReadUInt32(); Padding1 = reader.ReadUInt32(); EntryCount = reader.ReadUInt32(); Padding2 = reader.ReadUInt32(); EntryOffset = reader.ReadUInt32(); }
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); }
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); }
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)); }
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(); }
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)); }
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)); }
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(); }
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(); }
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(); }
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); }
/// <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); }
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); }
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); }
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; }
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); }
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); }
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); } }