public Message(byte[] Data) : base(Data) { PacketBody = new Body(); this.PacketBody.SequenceNumber = this.Reader.ReadByte(); this.PacketBody.FragmentCount = this.Reader.ReadByte(); this.PacketBody.FragmentNumber = this.Reader.ReadByte(); this.PacketBody.Unknown1 = this.Reader.ReadUInt32(); this.PacketBody.Unknown2 = this.Reader.ReadByte(); this.PacketBody.Unknown3 = this.Reader.ReadUInt32(); this.PacketBody.CompressedMessageSize = (ushort)((this.Reader.ReadUInt16() & 0x7FFF) - 2); this.PacketBody.Unknown8 = this.Reader.ReadUInt16(); this.PacketBody.MessageData = new byte[4096]; //no decompressed size is being sent with the packet here? byte[] compressedMessageData = new byte[this.PacketBody.CompressedMessageSize + 0x10]; this.Reader.Read(compressedMessageData, 0, this.PacketBody.CompressedMessageSize); LightweightCompression lWCompression = new LightweightCompression(); lWCompression.Start(compressedMessageData, this.PacketBody.CompressedMessageSize, false); this.PacketBody.UncompressedMessageSize = lWCompression.Read(this.PacketBody.MessageData, 4096); this.PacketBody.Unknown5 = this.Reader.ReadUInt32(); var dwLoop = 0; do { this.PacketBody.Unknown6 |= (byte)(this.Reader.ReadByte() << dwLoop); dwLoop += 8; } while (dwLoop < 32); if (this.PacketBody.Unknown5 != 1) { this.PacketBody.SnapshotSequence = this.Reader.ReadUInt32(); this.PacketBody.BaseSequence = this.Reader.ReadUInt32(); this.PacketBody.CompressedBodyMessageSize = this.Reader.ReadUInt32() & 0x7FFFFFFF; this.PacketBody.UncompressedBodyMessageSize = this.Reader.ReadUInt32(); this.PacketBody.ComponentCount = this.Reader.ReadUInt16(); this.PacketBody.Unknown7 = this.Reader.ReadUInt32(); this.PacketBody.FragmentMessageData = new byte[this.Reader.BaseStream.Length - this.Reader.BaseStream.Position]; this.Reader.Read(this.PacketBody.FragmentMessageData, 0, this.PacketBody.FragmentMessageData.Length); } }
private Sequence ProcessSequence() { Sequence seq = new Sequence(); byte[] data = new byte[this._currentSequenceBufferOffset]; Array.Copy(_sequenceBuffer, 0, data, 0, data.Length); BinaryReader reader = new BinaryReader(new MemoryStream(data)); try { seq.Unknown1 = reader.ReadUInt32(); seq.Unknown2 = reader.ReadByte(); if ((seq.Unknown2 & 1) != 0) { seq.Unknown3 = reader.ReadUInt32(); seq.CompressedMessageSize = (ushort)((reader.ReadUInt16() & 0x7FFF) - 2); seq.UncompressedMessageSize = reader.ReadUInt16(); seq.MessageData = new byte[seq.UncompressedMessageSize]; byte[] compressedMessageData = new byte[seq.CompressedMessageSize + 0x10]; reader.Read(compressedMessageData, 0, seq.CompressedMessageSize); LightweightCompression lWCompression = new LightweightCompression(); lWCompression.Start(compressedMessageData, seq.CompressedMessageSize, false); lWCompression.Read(seq.MessageData, seq.UncompressedMessageSize); } if ((seq.Unknown2 & 2) != 0) { seq.Compressed2MessageSize = (ushort)((reader.ReadUInt16() & 0x7FFF) - 2); seq.Uncompressed2MessageSize = reader.ReadUInt16(); seq.Message2Data = new byte[seq.Uncompressed2MessageSize]; byte[] compressedMessageData = new byte[seq.Compressed2MessageSize + 0x10]; reader.Read(compressedMessageData, 0, seq.Compressed2MessageSize); LightweightCompression lWCompression = new LightweightCompression(); lWCompression.Start(compressedMessageData, seq.Compressed2MessageSize, false); lWCompression.Read(seq.Message2Data, seq.Uncompressed2MessageSize); } seq = ReadSnapshotAcks(reader, seq); //client packets dont seem to always contain a snapshot if (reader.BaseStream.Position == reader.BaseStream.Length) { reader.Close(); return(seq); } seq.SnapshotSequence = reader.ReadUInt32(); seq.BaseSequence = reader.ReadUInt32(); seq.CompressedBodyMessageSize = reader.ReadUInt32() & 0x7FFFFFFF; seq.UncompressedBodyMessageSize = reader.ReadUInt32(); seq.ComponentCount = reader.ReadUInt16(); seq.Unknown7 = reader.ReadUInt32(); byte[] compressedSnapshotData = new byte[seq.CompressedBodyMessageSize + 0x10]; reader.Read(compressedSnapshotData, 0, (int)seq.CompressedBodyMessageSize); seq.SnapshotMessageData = new byte[seq.UncompressedBodyMessageSize]; LightweightCompression lWSnapCompression = new LightweightCompression(); lWSnapCompression.Start(compressedSnapshotData, (int)seq.CompressedBodyMessageSize, false); lWSnapCompression.Read(seq.SnapshotMessageData, (int)seq.UncompressedBodyMessageSize); Log.Debug("Unknown1: {@Unknown1}", seq.Unknown1.ToString("X")); Log.Debug("Unknown2: {@Unknown2}", seq.Unknown2); Log.Debug("Unknown3: {@Unknown3}", seq.Unknown3); Log.Debug("CompressedMessageSize: {@CompressedMessageSize}", seq.CompressedMessageSize); Log.Debug("UncompressedMessageSize: {@UncompressedMessageSize}", seq.UncompressedMessageSize); Log.Debug("MessageData: {@MessageData}", seq.MessageData); Log.Debug("Compressed2MessageSize: {@Compressed2MessageSize}", seq.Compressed2MessageSize); Log.Debug("Uncompressed2MessageSize: {@Uncompressed2MessageSize}", seq.Uncompressed2MessageSize); Log.Debug("Message2Data: {@Message2Data}", seq.Message2Data); Log.Debug("Unknown5: {@Unknown5}", seq.Unknown5); Log.Debug("Unknown6: {@Unknown6}", seq.Unknown6); Log.Debug("SnapshotSequence: {@SnapshotSequence}", seq.SnapshotSequence); Log.Debug("BaseSequence: {@BaseSequence}", seq.BaseSequence); Log.Debug("CompressedBodyMessageSize: {@CompressedBodyMessageSize}", seq.CompressedBodyMessageSize); Log.Debug("UncompressedBodyMessageSize: {@UncompressedBodyMessageSize}", seq.UncompressedBodyMessageSize); Log.Debug("ComponentCount: {@ComponentCount}", seq.ComponentCount); Log.Debug("Unknown7: {@Unknown7}", seq.Unknown7); if (reader.BaseStream.Position != reader.BaseStream.Length) { throw (new Exception("Didn't read sequence to end")); } reader.Close(); return(seq); } catch (Exception ex) { Log.Error(ex.Message); Log.Error("Unknown1: {@Unknown1}", seq.Unknown1.ToString("X")); Log.Error("Unknown2: {@Unknown2}", seq.Unknown2); Log.Error("Unknown3: {@Unknown3}", seq.Unknown3); Log.Error("CompressedMessageSize: {@CompressedMessageSize}", seq.CompressedMessageSize); Log.Error("UncompressedMessageSize: {@UncompressedMessageSize}", seq.UncompressedMessageSize); Log.Error("MessageData: {@MessageData}", seq.MessageData); Log.Error("Compressed2MessageSize: {@Compressed2MessageSize}", seq.Compressed2MessageSize); Log.Error("Uncompressed2MessageSize: {@Uncompressed2MessageSize}", seq.Uncompressed2MessageSize); Log.Error("Message2Data: {@Message2Data}", seq.Message2Data); Log.Error("Unknown5: {@Unknown5}", seq.Unknown5); Log.Error("Unknown6: {@Unknown6}", seq.Unknown6); Log.Error("SnapshotSequence: {@SnapshotSequence}", seq.SnapshotSequence); Log.Error("BaseSequence: {@BaseSequence}", seq.BaseSequence); Log.Error("CompressedBodyMessageSize: {@CompressedBodyMessageSize}", seq.CompressedBodyMessageSize); Log.Error("UncompressedBodyMessageSize: {@UncompressedBodyMessageSize}", seq.UncompressedBodyMessageSize); Log.Error("ComponentCount: {@ComponentCount}", seq.ComponentCount); Log.Error("Unknown7: {@Unknown7}", seq.Unknown7); Console.ReadLine(); return(new Sequence()); } }