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; }
public PacketClass(TcpDatagram tcp, bool inc, PacketInfo.Daemon daemon, ushort port) { Tcp = tcp; IsIncoming = inc; Daemon = daemon; Port = port; }
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); } }
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); } } }