Exemple #1
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);
        }
Exemple #2
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));
        }
Exemple #3
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'));
        }
Exemple #4
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);
        }
Exemple #5
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);
 }
Exemple #6
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();
        }
Exemple #7
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();
        }
Exemple #8
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);
 }
Exemple #9
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);
        }
        public static int KeyEqualOP(Key key, EndianBinReader data)
        {
            EndianBinReader ptr = data;

            uint length     = Util.ExtractValueAndAdvance(ptr);
            uint min_length = Math.Min(key.length, length);

            EndianBinReader p1 = (key.data);
            EndianBinReader p2 = (ptr);

            for (uint i = 0; i < min_length; ++i)
            {
                byte _p1 = p1.ReadByte();
                byte _p2 = p2.ReadByte();

                if (_p1 < _p2)
                {
                    return(-1);
                }
                else if (_p1 > _p2)
                {
                    return(1);
                }
            }

            if (key.length < length)
            {
                return(-1);
            }
            else if (key.length > length)
            {
                return(1);
            }
            else
            {
                return(0);
            }
        }
Exemple #11
0
        private void LoadFileIDBTree(EndianBinReader reader, ref FileIDBTree[] objects, uint offset)
        {
            uint childOffset = 0;
            uint nodeCount   = 0;
            uint ptrNodeData = 0;

            reader.BaseStream.Seek(offset, System.IO.SeekOrigin.Begin);
            byte childCount = reader.ReadByte();

            childOffset = reader.Read3BytesUInt32() + offset;
            nodeCount   = reader.ReadUInt16();
            ptrNodeData = (uint)reader.BaseStream.Position;

            if (objects == null)
            {
                objects = new FileIDBTree[0];
            }
            uint indexer = (uint)objects.Length;

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

                ptrNodeData += nextNodeDataOffset;
            }
        }
 public StringBTree(EndianBinReader reader, uint offset)
 {
     reader.BaseStream.Seek(offset, SeekOrigin.Begin);
     Length = reader.ReadByte();
     Text   = Encoding.ASCII.GetString(reader.ReadBytes((int)Length));
 }