protected unsafe override void InternalWritePacket2(WowPacket packet) { var data = packet.Data; byte[] bytes; if (this.SnifferId == PktSnifferId.Kamilla) { bytes = new byte[OutChunkHeaderKamilla.Size]; fixed (byte* bytesPtr = bytes) { var header = (OutChunkHeaderKamilla*)bytesPtr; header->m_header.ConnectionId = packet.ConnectionId; header->m_header.DataLength = data.Length + 4; header->m_header.Direction = packet.Direction; header->m_header.OptionalDataLength = 1; header->m_header.TickCount = packet.ArrivalTicks; header->m_flags = (byte)packet.Flags; header->m_opcode = packet.Opcode; } } else { bytes = new byte[OutChunkHeader.Size]; fixed (byte* bytesPtr = bytes) { var header = (OutChunkHeader*)bytesPtr; header->m_header.ConnectionId = packet.ConnectionId; header->m_header.DataLength = data.Length + 4; header->m_header.Direction = packet.Direction; header->m_header.OptionalDataLength = 0; header->m_header.TickCount = packet.ArrivalTicks; header->m_opcode = packet.Opcode; } } m_stream.WriteBytes(bytes); m_stream.WriteBytes(data); }
protected unsafe override void InternalRead(Action<int> reportProgressDelegate) { int headerSize = ChunkHeader.Size; var headerBytes = new byte[headerSize]; var startTicks = this.StartTicks; fixed (byte* ptr = headerBytes) { int progress = 0; var header = (ChunkHeader*)ptr; while (!m_stream.IsRead) { if (m_stream.Read(headerBytes, 0, headerSize) != headerSize) throw new EndOfStreamException(); var flags = PacketFlags.None; if (m_snifferId == PktSnifferId.Kamilla && header->OptionalDataLength > 0) { flags = (PacketFlags)m_stream.ReadByte(); m_stream.Skip(header->OptionalDataLength - 1); } else m_stream.Skip(header->OptionalDataLength); var opcode = m_stream.ReadUInt32(); var data = m_stream.ReadBytes(header->DataLength - 4); var wowFlags = (WowPacketFlags)(flags & ~PacketFlags.All); if ((wowFlags & WowPacketFlags.HelloPacket) != 0) opcode = SpecialWowOpcodes.HelloOpcode; flags &= PacketFlags.All; var packet = new WowPacket(data, header->Direction, flags, wowFlags, this.StartTime.AddMilliseconds(header->TickCount - startTicks), header->TickCount, opcode, header->ConnectionId); this.InternalAddPacket(packet); this.OnPacketAdded(packet); if (reportProgressDelegate != null) { int newProgress = (int)( (m_stream.Position - m_streamOriginalPosition) * 100 / (m_stream.Length - m_streamOriginalPosition)); if (newProgress != progress) { progress = newProgress; reportProgressDelegate(progress); } } } } }
protected override void InternalRead(Action<int> reportProgressDelegate) { var ConnectionIds = new Dictionary<int, byte>(); var direction = TransferDirection.ToClient; uint opcode = SpecialWowOpcodes.UnknownOpcode; var time = DateTime.MinValue; uint ticks = 0; byte conn_id = 0; byte[] data = null; var flags = PacketFlags.None; var flags2 = WowPacketFlags.None; int progress = 0; BinaryReader br = new BinaryReader(m_streamReader.BaseStream); try { while (br.BaseStream.Position < br.BaseStream.Length) { opcode = (uint)br.ReadInt32(); int data_size = br.ReadInt32(); time = br.ReadUInt32().AsUnixTime(); direction = (TransferDirection)br.ReadByte(); data = br.ReadBytes(data_size); var pkt = new WowPacket(data, direction, flags, flags2, time, ticks, opcode, conn_id); this.InternalAddPacket(pkt); this.OnPacketAdded(pkt); if (reportProgressDelegate != null) { int newProgress = (int)(br.BaseStream.Position * 100 / br.BaseStream.Length); if (newProgress != progress) { progress = newProgress; reportProgressDelegate(progress); } } } } catch (Exception ex) { throw new FormatException("Error reading data on position " + br.BaseStream.Position + " (" + br.BaseStream.Length + ").", ex); } finally { this.CloseStream(); } }
protected override void InternalWritePacket2(WowPacket packet) { throw new NotSupportedException(); }
protected override void InternalRead(Action<int> reportProgressDelegate) { var ConnectionIds = new Dictionary<int, byte>(); int nLine = 0; string line; var direction = TransferDirection.ToClient; uint opcode = SpecialWowOpcodes.UnknownOpcode; var time = DateTime.MinValue; uint ticks = 0; byte conn_id = 0; byte[] data = null; bool waitingDate = true; bool readingData = false; string dataString = null; var flags = PacketFlags.None; var flags2 = WowPacketFlags.None; int progress = 0; try { while ((line = m_streamReader.ReadLine()) != null) { ++nLine; if (nLine == 1) { if (line.StartsWith("EXPECTED CLIENT BUILD ", StringComparison.InvariantCultureIgnoreCase)) { m_version = GetClientBuildInfo(uint.Parse(line.Substring("EXPECTED CLIENT BUILD ".Length))); } continue; } if (line.Trim() == string.Empty) { readingData = false; if (data != null) { string[] datas = dataString.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); if (datas.Length != data.Length) throw new FormatException( string.Format("Error in data chunk at line {0} ({1} vs {2} len)", nLine, datas.Length, data.Length) ); for (int i = 0; i < datas.Length; ++i) data[i] = byte.Parse(datas[i], NumberStyles.AllowHexSpecifier); var pkt = new WowPacket(data, direction, flags, flags2, time, ticks, opcode, conn_id); this.InternalAddPacket(pkt); this.OnPacketAdded(pkt); if (reportProgressDelegate != null) { int newProgress = (int)(m_streamReader.BaseStream.Position * 100 / m_streamReader.BaseStream.Length); if (newProgress != progress) { progress = newProgress; reportProgressDelegate(progress); } } dataString = null; data = null; flags = PacketFlags.None; flags2 = WowPacketFlags.None; ticks = 0; } waitingDate = true; } else if (waitingDate) { var parts = line.Split(new char[] { ' ' }, 4); time = DateTime.Parse(parts[0] + ' ' + parts[1], CultureInfo.InvariantCulture); waitingDate = false; if (parts.Length >= 4) ticks = uint.Parse(parts[2], NumberStyles.AllowHexSpecifier); if (line.IndexOf("SERVER") != -1) direction = TransferDirection.ToClient; else if (line.IndexOf("CLIENT") != -1) direction = TransferDirection.ToServer; } else if (readingData) { dataString += line; } else if (line.StartsWith("CLIENT")) { direction = TransferDirection.ToServer; } else if (line.StartsWith("SERVER")) { direction = TransferDirection.ToClient; } else if (line.StartsWith("SOCKET")) { int socket = int.Parse(line.Substring(line.IndexOf(':') + 1).Trim()); if (ConnectionIds.ContainsKey(socket)) conn_id = ConnectionIds[socket]; else { conn_id = (byte)(ConnectionIds.Count == 0 ? 1 : ConnectionIds.Last().Value + 1); ConnectionIds.Add(socket, conn_id); } } else if (line.StartsWith("LENGTH")) { int len = int.Parse(line.Substring(line.IndexOf(':') + 1).Trim()); data = new byte[len]; } else if (line.StartsWith("OPCODE")) { string substr = line.Substring(line.IndexOf('(') + 1 + 2).TrimEnd(')'); opcode = ushort.Parse(substr, NumberStyles.AllowHexSpecifier); if (opcode == 0x4F57) { flags2 |= WowPacketFlags.HelloPacket; opcode = SpecialWowOpcodes.HelloOpcode; } } else if (line.StartsWith("DATA")) { readingData = true; dataString = string.Empty; } else if (line.Trim().Equals("NOT SEND", StringComparison.InvariantCultureIgnoreCase)) { flags |= PacketFlags.Freezed; } else throw new IOException(); } } catch (Exception ex) { throw new FormatException("Error reading data on line " + nLine + ".", ex); } finally { this.CloseStream(); } }
protected unsafe override void InternalRead(Action<int> reportProgressDelegate) { int headerSize = ChunkHeader.Size; var headerBytes = new byte[headerSize]; var startTicks = this.StartTicks; bool firstPacket = true; fixed (byte* ptr = headerBytes) { int progress = 0; var header = (ChunkHeader*)ptr; while (m_stream.CanRead(1)) { if (m_stream.Read(headerBytes, 0, headerSize) != headerSize) throw new EndOfStreamException(); var flags = PacketFlags.None; int connId = 0; if (m_snifferId == PktSnifferId.Kamilla) { int nOptBytes = header->OptionalDataLength; if (--nOptBytes >= 0) { flags = (PacketFlags)m_stream.ReadByte(); if (--nOptBytes >= 0) { connId = m_stream.ReadByte(); if (nOptBytes > 0) m_stream.Skip(nOptBytes); } } } else m_stream.Skip(header->OptionalDataLength); var opcode = m_stream.ReadUInt32(); var data = m_stream.ReadBytes(header->DataLength - 4); var wowFlags = (WowPacketFlags)(flags & ~PacketFlags.All); if ((wowFlags & WowPacketFlags.HelloPacket) != 0) opcode = SpecialWowOpcodes.HelloOpcode; flags &= PacketFlags.All; var packet = new WowPacket(data, header->Direction, flags, wowFlags, header->UnixTime.AsUnixTime(), header->TickCount, opcode, connId); this.InternalAddPacket(packet); this.OnPacketAdded(packet); if (firstPacket) { if (this.StartTicks == 0) { this.StartTime = packet.ArrivalTime; this.StartTicks = packet.ArrivalTicks; } } firstPacket = false; if (reportProgressDelegate != null) { int newProgress = (int)( (m_stream.Position - m_streamOriginalPosition) * 100 / (m_stream.Length - m_streamOriginalPosition)); if (newProgress != progress) { progress = newProgress; reportProgressDelegate(progress); } } } } }