예제 #1
0
        public IEnumerable<IScsMessage> CreateMessages(byte[] receivedBytes)
        {
            var messages = new List<IScsMessage>();

            // zlib compression (0x80000005) (Client sends start packet, but does not use compression?)
            if (receivedBytes[0] == 0x80 && receivedBytes[1] == 0x00 &&
                receivedBytes[2] == 0x00 && receivedBytes[3] == 0x05)
            {
                //Console.WriteLine("Skipping zlib packet");
                return messages;
            }

            if (_backBuffer != null)
            {
                _stream = new PacketStream();
                _stream.Write(_backBuffer, 0, _backBuffer.Length);
                _stream.Write(receivedBytes, 0, receivedBytes.Length);
                _backBuffer = null;
            }
            else
                _stream = new ConanStream(receivedBytes);

            while (ReadMessage(messages)) ;
            return messages;
        }
예제 #2
0
        public IEnumerable <IScsMessage> CreateMessages(byte[] receivedBytes)
        {
            var messages = new List <IScsMessage>();

            // zlib compression (0x80000005) (Client sends start packet, but does not use compression?)
            if (receivedBytes[0] == 0x80 && receivedBytes[1] == 0x00 &&
                receivedBytes[2] == 0x00 && receivedBytes[3] == 0x05)
            {
                //Console.WriteLine("Skipping zlib packet");
                return(messages);
            }

            if (_backBuffer != null)
            {
                _stream = new PacketStream();
                _stream.Write(_backBuffer, 0, _backBuffer.Length);
                _stream.Write(receivedBytes, 0, receivedBytes.Length);
                _backBuffer = null;
            }
            else
            {
                _stream = new ConanStream(receivedBytes);
            }

            while (ReadMessage(messages))
            {
                ;
            }
            return(messages);
        }
예제 #3
0
        public static void TrimStream(ref ConanStream stream)
        {
            if (stream.Position == stream.Length)
            {
                stream = new PacketStream();
                return;
            }

            var remaining = new byte[stream.Length - stream.Position];
            stream.Read(remaining, 0, remaining.Length);
            stream = new ConanStream(remaining);
        }
        public IEnumerable<IScsMessage> CreateMessages(byte[] receivedBytes)
        {
            var messages = new List<IScsMessage>();

            if (_backBuffer != null)
            {
                _stream = new PacketStream();
                _stream.Write(_backBuffer, 0, _backBuffer.Length);
                _stream.Write(receivedBytes, 0, receivedBytes.Length);
                _backBuffer = null;
            }
            else
                _stream = new ConanStream(receivedBytes);

            while (ReadMessage(messages)) ;
            return messages;
        }
예제 #5
0
        public ConanPacket(ConanStream stream)
        {
            _originalStream = stream;
            stream.Position = 0;

            Length = stream.ReadUInt32();

            if (Length == 0 || stream.Length < Length)
            {
                //throw new Exception("stream.Length < length");
                Length = UInt32.MaxValue;
                return;
            }

            Crc32      = stream.ReadUInt32();
            Headersize = stream.ReadUInt32();
            if (Headersize > 0xffff) // this should do..
            {
                //throw new Exception("Headersize > 0xffff");
                Length = UInt32.MaxValue;
                return;
            }

            Sender    = stream.ReadByte();
            SenderInt = stream.ReadArrayPrependLengthByte();

            Receiver    = stream.ReadByte();
            ReceiverInt = stream.ReadArrayPrependLengthByte();

            Opcode = stream.ReadUInt16();

            var checkHeaderLength = Headersize - (UInt32)(sizeof(UInt32) + SenderInt.Length + ReceiverInt.Length);

            if (checkHeaderLength > 0)
            {
                HeaderData = new ConanStream(stream.ReadArray(checkHeaderLength - sizeof(byte) * 2));
            }

            var dataLength = Length - (Headersize + sizeof(UInt32) * 2);

            if (dataLength > 0)
            {
                Data = new ConanStream(stream.ReadArray(dataLength));
            }
        }
예제 #6
0
        public AgentServerPacket(ConanStream stream)
        {
            _originalStream = stream;
            stream.Position = 0;

            Opcode = stream.ReadUInt16();
            Length = stream.ReadUInt16();

            if (Length == 0 || stream.Length < Length)
            {
                //throw new Exception("stream.Length < length");
                Length = UInt16.MaxValue;
                return;
            }

            Data = new ConanStream(stream.ReadArray(Length - sizeof (UInt16)*2u));

            Console.WriteLine();
        }
예제 #7
0
        public ConanPacket(ConanStream stream)
        {
            _originalStream = stream;
            stream.Position = 0;

            Length = stream.ReadUInt32();

            if (Length == 0 || stream.Length < Length)
            {
                //throw new Exception("stream.Length < length");
                Length = UInt32.MaxValue;
                return;
            }

            Crc32 = stream.ReadUInt32();
            Headersize = stream.ReadUInt32();
            if (Headersize > 0xffff) // this should do..
            {
                //throw new Exception("Headersize > 0xffff");
                Length = UInt32.MaxValue;
                return;
            }

            Sender = stream.ReadByte();
            SenderInt = stream.ReadArrayPrependLengthByte();

            Receiver = stream.ReadByte();
            ReceiverInt = stream.ReadArrayPrependLengthByte();

            Opcode = stream.ReadUInt16();

            var checkHeaderLength = Headersize - (UInt32) (sizeof (UInt32) + SenderInt.Length + ReceiverInt.Length);
            if (checkHeaderLength > 0)
                HeaderData = new ConanStream(stream.ReadArray(checkHeaderLength - sizeof (byte)*2));

            var dataLength = Length - (Headersize + sizeof (UInt32)*2);
            if (dataLength > 0)
                Data = new ConanStream(stream.ReadArray(dataLength));
        }
예제 #8
0
        public static unsafe UInt32 CalculateForPacketBuffer(ConanStream packetBuffer)
        {
            fixed (byte* fix = packetBuffer.GetBuffer())
            {
                var buffer = (UInt32*) fix + 2; // skip length and hash
                var len = packetBuffer.Length - sizeof (UInt32)*2;
                var crc32 = 0xffffffff;
                UInt32 offset = 0;

                if (len >= 32)
                {
                    for (UInt32 i = 0; i < len >> 5; i++)
                    {
                        crc32 ^= buffer[offset];
                        len -= 4;

                        for (UInt32 ii = 0; ii < 7; ii++)
                        {
                            offset++;
                            crc32 = CrcTab2[crc32 >> 16 & 0xFF] ^ CrcTab3[crc32 >> 8 & 0xFF] ^ CrcTab1[crc32 >> 24] ^
                                    CrcTab4[crc32 & 0xFF] ^ buffer[offset];
                            len -= 4;
                        }

                        crc32 = CrcTab2[crc32 >> 16 & 0xFF] ^ CrcTab3[crc32 >> 8 & 0xFF] ^ CrcTab1[crc32 >> 24] ^
                                CrcTab4[crc32 & 0xFF];
                        offset++;
                    }
                }

                if (len >= offset)
                {
                    for (UInt32 i = 0; i < (len >> 2); i++)
                    {
                        crc32 ^= buffer[offset];
                        len -= 4;

                        crc32 = CrcTab2[crc32 >> 16 & 0xFF] ^ CrcTab3[crc32 >> 8 & 0xFF] ^ CrcTab1[crc32 >> 24] ^
                                CrcTab4[crc32 & 0xFF];
                        offset++;
                    }
                }

                if (len > 0)
                {
                    offset *= 4;

                    for (UInt32 i = 0; i < len; i++)
                    {
                        var tmp = *(byte*) ((UInt64) buffer + offset);
                        crc32 = (crc32 >> 8) ^ CrcTab1[(tmp ^ crc32) & 0xFF];
                        offset++;
                    }
                }

                return crc32 ^ 0xFFFFFFFF;
            }
        }
예제 #9
0
 public ConanStream WriteArrayPrependLengthUInt32(ConanStream stream)
     => WriteArrayPrependLengthUInt32(stream.ToArray());
예제 #10
0
 public ConanStream WriteArrayPrependLengthUInt16(ConanStream stream, bool removeLen = false)
     => WriteArrayPrependLengthUInt16(stream.ToArray(), removeLen);
예제 #11
0
 public ConanStream WriteArrayPrependLengthByte(ConanStream stream)
     => WriteArrayPrependLengthByte(stream.ToArray());
예제 #12
0
 public ConanStream WriteArrayPrependLengthUInt32(ConanStream stream)
 => WriteArrayPrependLengthUInt32(stream.ToArray());
예제 #13
0
 public ConanStream WriteArrayPrependLengthUInt16(ConanStream stream, bool removeLen = false)
 => WriteArrayPrependLengthUInt16(stream.ToArray(), removeLen);
예제 #14
0
 public ConanStream WriteArrayPrependLengthByte(ConanStream stream)
 => WriteArrayPrependLengthByte(stream.ToArray());