public object Deserialize(byte[] data) { PayloadReader pr = new PayloadReader(data); ObjectTypes Id = (ObjectTypes)pr.ReadByte(); switch (Id) { case ObjectTypes.Null: return(null); case ObjectTypes.Other: { BinaryFormatter bf = new BinaryFormatter(); bf.Binder = new DeserializationBinder(); return(bf.Deserialize(new MemoryStream(pr.ReadBytes(pr.Length - pr.Offset)))); } case ObjectTypes.Byte: return(pr.ReadByte()); case ObjectTypes.Short: return(pr.ReadShort()); case ObjectTypes.UShort: return(pr.ReadUShort()); case ObjectTypes.Int: return(pr.ReadInteger()); case ObjectTypes.UINT: return(pr.ReadUInteger()); case ObjectTypes.Long: return(pr.ReadLong()); case ObjectTypes.Bool: return(pr.ReadByte() == 1); case ObjectTypes.String: return(pr.ReadString()); case ObjectTypes.SolidBrush: return(new SolidBrush(Color.FromArgb(pr.ReadByte(), pr.ReadByte(), pr.ReadByte(), pr.ReadByte()))); case ObjectTypes.Rectangle: return(new Rectangle(pr.ReadInteger(), pr.ReadInteger(), pr.ReadInteger(), pr.ReadInteger())); case ObjectTypes.Size: return(new Size(pr.ReadInteger(), pr.ReadInteger())); case ObjectTypes.ByteArray: return(pr.ReadBytes(pr.ReadInteger())); case ObjectTypes.Bitmap: { using (MemoryStream stream = new MemoryStream(pr.Buffer, pr.Offset, pr.Length - pr.Offset)) { long oldPos = stream.Position; Bitmap bmp = (Bitmap)Bitmap.FromStream(stream); pr.Offset += (int)(stream.Position - oldPos); return(bmp); } } default: throw new Exception("Error deserializing"); } }
public PacketHeader(byte[] header, int offset, Connection connection) { this.connection = connection; PayloadReader pr = new PayloadReader(header); pr.Offset += offset; PacketSize = pr.ReadThreeByteInteger(); isCompressed = pr.ReadBool(); isCached = pr.ReadBool(); PacketID = (PacketId)pr.ReadByte(); MessageId = pr.ReadUInteger(); PluginId = pr.ReadULong(); isPluginPacket = pr.ReadBool(); CurPacketId = pr.ReadUShort(); Hash = pr.ReadUInteger(); ChannelId = pr.ReadUInteger(); PeerId = pr.ReadUInteger(); }
private void onPacketTaskQueue(IMessage message) { MsgPacketQueue msgPacketQueue = message as MsgPacketQueue; if (msgPacketQueue == null) { //client is behaving strange Client.Disconnect(DisconnectReason.StrangeBehaviorDetected); return; } PayloadReader pr = new PayloadReader(msgPacketQueue.Data); while (pr.Offset < pr.Length) { PacketId packetId = (PacketId)pr.ReadByte(); byte Duplicates = pr.ReadByte(); bool isPlugin = pr.ReadBool(); ulong PluginId = isPlugin ? pr.ReadULong() : 0; bool isChannel = pr.ReadBool(); uint ChannelConnectionId = isChannel ? pr.ReadUInteger() : 0; uint MessageId = pr.ReadUInteger(); byte[] data = pr.ReadBytes(pr.ReadThreeByteInteger()); int TotalLength = data.Length * Duplicates; for (; Duplicates > 0; Duplicates--) { //read the message again in a loop just incase if somebody will change the variables in the message IMessage TempMsg = messageHandler.HandleMessage(new PayloadReader(data), MessageId); switch (packetId) { case PacketId.Payload: { try { //if(DPI.Inspect(data, false)) { if (Client.MultiThreadProcessing) { //ThreadPool.QueueUserWorkItem((object o) => Client.onReceiveMessage(TempMsg)); } else { //Client.onReceiveMessage(TempMsg); } } } catch (Exception ex) { Client.onException(ex, ErrorType.UserLand); } break; } case PacketId.StreamMessages: { StreamQueue.Enqueue(TempMsg); break; } case PacketId.ChannelPayload: { //new R_ChannelPayload(data) { RawSize = data.Length }.ReadPayload(this); break; } } } } }