예제 #1
0
파일: Colours.cs 프로젝트: allocenx/Ostara
        public void FormatRow(OLVListItem r, PacketInfo.Daemon src, PacketInfo.Daemon dst)
        {
            var p = Pairs[new Key(src, dst)];

            r.ForeColor = p.Item1;
            r.BackColor = p.Item2;
        }
예제 #2
0
파일: FormMain.cs 프로젝트: allocenx/Ostara
 public PacketClass(TcpDatagram tcp, bool inc, PacketInfo.Daemon daemon, ushort port)
 {
     Tcp        = tcp;
     IsIncoming = inc;
     Daemon     = daemon;
     Port       = port;
 }
예제 #3
0
파일: FormMain.cs 프로젝트: allocenx/Ostara
        void AddPacket(TcpDatagram tcp, bool inc, PacketInfo.Daemon daemon, ushort port)
        {
            foreach (var p in packets)
            {
                if (p.Tcp.SequenceNumber == tcp.SequenceNumber)
                {
#if DEBUG
                    Console.WriteLine("Dropping duplicate packet...");
#endif
                    return;
                }
            }

            packets.Enqueue(new PacketClass(tcp, inc, daemon, port));

            if (packets.Count > 10)
            {
                var p    = packets.Dequeue();
                var data = p.Tcp.Payload.ToMemoryStream();
                ProcessPacket(data.ToArray(), p.IsIncoming, p.Daemon, p.Port);
            }
        }
예제 #4
0
파일: FormMain.cs 프로젝트: Epidal/Ostara
			public PacketClass(TcpDatagram tcp, bool inc, PacketInfo.Daemon daemon, ushort port) {
				Tcp = tcp;
				IsIncoming = inc;
				Daemon = daemon;
				Port = port;
			}
예제 #5
0
파일: FormMain.cs 프로젝트: allocenx/Ostara
        void ProcessPacket(byte[] data, bool inc, PacketInfo.Daemon daemon, ushort port)
        {
            int s;

            byte[] tmp;

            if (inc)
            {
                switch (daemon)
                {
                case PacketInfo.Daemon.Login:
                    if (partil == null)
                    {
                        break;
                    }

                    s   = partil.Length + data.Length;
                    tmp = new byte[s];
                    Array.ConstrainedCopy(partil, 0, tmp, 0, partil.Length);
                    Array.ConstrainedCopy(data, 0, tmp, partil.Length, data.Length);
                    data   = tmp;
                    partil = null;
                    break;

                case PacketInfo.Daemon.World:
                    if (partiw == null)
                    {
                        break;
                    }

                    s   = partiw.Length + data.Length;
                    tmp = new byte[s];
                    Array.ConstrainedCopy(partiw, 0, tmp, 0, partiw.Length);
                    Array.ConstrainedCopy(data, 0, tmp, partiw.Length, data.Length);
                    data   = tmp;
                    partiw = null;
                    break;

                case PacketInfo.Daemon.Chat:
                    if (partic == null)
                    {
                        break;
                    }

                    s   = partic.Length + data.Length;
                    tmp = new byte[s];
                    Array.ConstrainedCopy(partic, 0, tmp, 0, partic.Length);
                    Array.ConstrainedCopy(data, 0, tmp, partic.Length, data.Length);
                    data   = tmp;
                    partic = null;
                    break;

                case PacketInfo.Daemon.Auction:
                    if (partia == null)
                    {
                        break;
                    }

                    s   = partia.Length + data.Length;
                    tmp = new byte[s];
                    Array.ConstrainedCopy(partia, 0, tmp, 0, partia.Length);
                    Array.ConstrainedCopy(data, 0, tmp, partia.Length, data.Length);
                    data   = tmp;
                    partia = null;
                    break;
                }
            }
            else
            {
                switch (daemon)
                {
                case PacketInfo.Daemon.Login:
                    if (partol == null)
                    {
                        break;
                    }

                    s   = partol.Length + data.Length;
                    tmp = new byte[s];
                    Array.ConstrainedCopy(partol, 0, tmp, 0, partol.Length);
                    Array.ConstrainedCopy(data, 0, tmp, partol.Length, data.Length);
                    data   = tmp;
                    partol = null;
                    break;

                case PacketInfo.Daemon.World:
                    if (partow == null)
                    {
                        break;
                    }

                    s   = partow.Length + data.Length;
                    tmp = new byte[s];
                    Array.ConstrainedCopy(partow, 0, tmp, 0, partow.Length);
                    Array.ConstrainedCopy(data, 0, tmp, partow.Length, data.Length);
                    data   = tmp;
                    partow = null;
                    break;

                case PacketInfo.Daemon.Chat:
                    if (partoc == null)
                    {
                        break;
                    }

                    s   = partoc.Length + data.Length;
                    tmp = new byte[s];
                    Array.ConstrainedCopy(partoc, 0, tmp, 0, partoc.Length);
                    Array.ConstrainedCopy(data, 0, tmp, partoc.Length, data.Length);
                    data   = tmp;
                    partoc = null;
                    break;

                case PacketInfo.Daemon.Auction:
                    if (partoa == null)
                    {
                        break;
                    }

                    s   = partoa.Length + data.Length;
                    tmp = new byte[s];
                    Array.ConstrainedCopy(partoa, 0, tmp, 0, partoa.Length);
                    Array.ConstrainedCopy(data, 0, tmp, partoa.Length, data.Length);
                    data   = tmp;
                    partoa = null;
                    break;
                }
            }

            var size = (inc)
                                ? serverCrypt[port].GetPacketSize(data)
                                : clientCrypt[port].GetPacketSize(data);

            if (size > data.Length)
            {
#if DEBUG
                //Console.WriteLine("Found partial packet. Storing...");
#endif

                if (inc)
                {
                    if (daemon == PacketInfo.Daemon.Login)
                    {
                        partil = new byte[data.Length];
                        Array.ConstrainedCopy(data, 0, partil, 0, data.Length);
                    }
                    else if (daemon == PacketInfo.Daemon.World)
                    {
                        partiw = new byte[data.Length];
                        Array.ConstrainedCopy(data, 0, partiw, 0, data.Length);
                    }
                    else if (daemon == PacketInfo.Daemon.Chat)
                    {
                        partic = new byte[data.Length];
                        Array.ConstrainedCopy(data, 0, partic, 0, data.Length);
                    }
                    else if (daemon == PacketInfo.Daemon.Auction)
                    {
                        partia = new byte[data.Length];
                        Array.ConstrainedCopy(data, 0, partia, 0, data.Length);
                    }
                }
                else
                {
                    if (daemon == PacketInfo.Daemon.Login)
                    {
                        partol = new byte[data.Length];
                        Array.ConstrainedCopy(data, 0, partol, 0, data.Length);
                    }
                    else if (daemon == PacketInfo.Daemon.World)
                    {
                        partow = new byte[data.Length];
                        Array.ConstrainedCopy(data, 0, partow, 0, data.Length);
                    }
                    else if (daemon == PacketInfo.Daemon.Chat)
                    {
                        partoc = new byte[data.Length];
                        Array.ConstrainedCopy(data, 0, partoc, 0, data.Length);
                    }
                    else if (daemon == PacketInfo.Daemon.Auction)
                    {
                        partoa = new byte[data.Length];
                        Array.ConstrainedCopy(data, 0, partoa, 0, data.Length);
                    }
                }

                return;
            }

            if (size < data.Length)
            {
                // Process the first subpacket
                var sub = new byte[size];
                Array.ConstrainedCopy(data, 0, sub, 0, size);
                ProcessPacket(sub, inc, daemon, port);

                // Process the rest of the data.  May contain further subpackets, or a partial packet.  We don't care
                sub = new byte[data.Length - size];
                Array.ConstrainedCopy(data, size, sub, 0, data.Length - size);
                ProcessPacket(sub, inc, daemon, port);

                return;
            }

            if (inc)
            {
                serverCrypt[port].Decrypt(data);
            }
            else
            {
                clientCrypt[port].Decrypt(data);
            }

            var ppkt = new PacketInfo(data, DateTime.Now, inc, daemon);

            if (inc && ((ppkt.Opcode == 101 && daemon == PacketInfo.Daemon.Login) ||
                        (ppkt.Opcode == 140 && daemon == PacketInfo.Daemon.World) ||
                        (ppkt.Opcode == 401 && daemon == PacketInfo.Daemon.Chat) ||
                        (ppkt.Opcode == 101 && daemon == PacketInfo.Daemon.Auction)))
            {
                unsafe
                {
                    fixed(byte *pp = data)
                    {
                        var key  = *(uint *)&pp[6];
                        var step = *(ushort *)&pp[16];

                        serverCrypt[port].ChangeKey(key, step);
                        clientCrypt[port].ChangeKey(key, step);
                    }
                }
            }

            if (!paused)
            {
                if (flvPackets.InvokeRequired)
                {
                    this.Invoke(new AddPacketDel(AddPacket), new object[] { ppkt });
                }
                else
                {
                    AddPacket(ppkt);
                }
            }
        }