public RiftPacket Read(DateTime pTransmitted) { long packetLength; int sizeOfPacketLength; switch (mProtocolState) { case EProtocolState.Normal: { if (ReadEncodedLong(mUnprocessedBuffer, 0, mUnprocessedLength, out packetLength, out sizeOfPacketLength) && (sizeOfPacketLength + packetLength) <= mUnprocessedLength) { Buffer.BlockCopy(mUnprocessedBuffer, 0, mProcessedBuffer, mProcessedLength, sizeOfPacketLength + (int)packetLength); mUnprocessedLength -= (sizeOfPacketLength + (int)packetLength); mProcessedLength += (sizeOfPacketLength + (int)packetLength); if (mUnprocessedLength > 0) { Buffer.BlockCopy(mUnprocessedBuffer, sizeOfPacketLength + (int)packetLength, mUnprocessedBuffer, 0, mUnprocessedLength); } } break; } case EProtocolState.Compressed: { for (int index = 0; index < mUnprocessedLength; ++index) { if (index >= 3 && mUnprocessedBuffer[index] == 0xFF && mUnprocessedBuffer[index - 1] == 0xFF && mUnprocessedBuffer[index - 2] == 0x00 && mUnprocessedBuffer[index - 3] == 0x00) { mInflaterStream.SetLength(0); mInflater.Write(mUnprocessedBuffer, 0, index + 1); mInflater.Flush(); mInflaterStream.Position = 0; mProcessedLength += mInflaterStream.Read(mProcessedBuffer, mProcessedLength, mProcessedBuffer.Length - mProcessedLength); mUnprocessedLength -= (index + 1); if (mUnprocessedLength > 0) { Buffer.BlockCopy(mUnprocessedBuffer, index + 1, mUnprocessedBuffer, 0, mUnprocessedLength); } break; } } break; } case EProtocolState.EncryptedAndCompressed: { for (int index = 0; index < mUnprocessedLength; ++index) { if (mDecryptLength >= mDecryptBuffer.Length || index >= mUnprocessedBuffer.Length) { System.Diagnostics.Debug.Write("Bad"); } mDecryptBuffer[mDecryptLength] = DecryptByte(mUnprocessedBuffer[index]); ++mDecryptLength; if (mDecryptLength >= 4 && mDecryptBuffer[mDecryptLength - 1] == 0xFF && mDecryptBuffer[mDecryptLength - 2] == 0xFF && mDecryptBuffer[mDecryptLength - 3] == 0x00 && mDecryptBuffer[mDecryptLength - 4] == 0x00) { mInflaterStream.SetLength(0); mInflater.Write(mDecryptBuffer, 0, mDecryptLength); mInflater.Flush(); mInflaterStream.Position = 0; mProcessedLength += mInflaterStream.Read(mProcessedBuffer, mProcessedLength, mProcessedBuffer.Length - mProcessedLength); mDecryptLength = 0; } } mUnprocessedLength = 0; break; } default: break; } if (!ReadEncodedLong(mProcessedBuffer, 0, mProcessedLength, out packetLength, out sizeOfPacketLength)) { return(null); } if (mProcessedLength < (sizeOfPacketLength + packetLength)) { return(null); } byte[] packetBuffer = new byte[packetLength]; Buffer.BlockCopy(mProcessedBuffer, sizeOfPacketLength, packetBuffer, 0, (int)packetLength); mProcessedLength -= (sizeOfPacketLength + (int)packetLength); if (mProcessedLength > 0) { Buffer.BlockCopy(mProcessedBuffer, sizeOfPacketLength + (int)packetLength, mProcessedBuffer, 0, mProcessedLength); } //PacketDescriptions.PacketDescription description = PacketDescriptions.Instance.Descriptions.Find(d => d.Outbound == mOutbound && d.Opcode == opcode); RiftPacketReader reader = new RiftPacketReader(pTransmitted, mOutbound, packetBuffer, 0, packetBuffer.Length); RiftPacket packet; int sizeOfPacket; if (!reader.ReadPacket(out packet, out sizeOfPacket)) { return(null); } packet.Raw = packetBuffer; return(packet); }
public void OpenFile(string pFilename) { mFileSaveMenu.Enabled = false; mTerminated = true; int percent = 0; using (FileStream stream = new FileStream(pFilename, FileMode.Open, FileAccess.Read)) { BinaryReader reader = new BinaryReader(stream); mLocalPort = reader.ReadUInt16(); while (stream.Position < stream.Length) { long timestamp = reader.ReadInt64(); bool outbound = reader.ReadBoolean(); int size = reader.ReadInt32(); byte[] buffer = reader.ReadBytes(size); RiftPacketReader packetReader = new RiftPacketReader(new DateTime(timestamp), outbound, buffer, 0, buffer.Length); RiftPacket packet; int sizeOfPacket; packetReader.ReadPacket(out packet, out sizeOfPacket); packet.Raw = buffer; AddPacket(packet); int newPercent = (int)((stream.Position * 100) / stream.Length); while (newPercent > percent) { ++percent; ProgressUpdate(); } } } Text = string.Format("Port {0} (ReadOnly)", mLocalPort); }
public RiftPacket Read(DateTime pTransmitted) { long packetLength; int sizeOfPacketLength; switch (mProtocolState) { case EProtocolState.Normal: { if (ReadEncodedLong(mUnprocessedBuffer, 0, mUnprocessedLength, out packetLength, out sizeOfPacketLength) && (sizeOfPacketLength + packetLength) <= mUnprocessedLength) { Buffer.BlockCopy(mUnprocessedBuffer, 0, mProcessedBuffer, mProcessedLength, sizeOfPacketLength + (int)packetLength); mUnprocessedLength -= (sizeOfPacketLength + (int)packetLength); mProcessedLength += (sizeOfPacketLength + (int)packetLength); if (mUnprocessedLength > 0) Buffer.BlockCopy(mUnprocessedBuffer, sizeOfPacketLength + (int)packetLength, mUnprocessedBuffer, 0, mUnprocessedLength); } break; } case EProtocolState.Compressed: { for (int index = 0; index < mUnprocessedLength; ++index) { if (index >= 3 && mUnprocessedBuffer[index] == 0xFF && mUnprocessedBuffer[index - 1] == 0xFF && mUnprocessedBuffer[index - 2] == 0x00 && mUnprocessedBuffer[index - 3] == 0x00) { mInflaterStream.SetLength(0); mInflater.Write(mUnprocessedBuffer, 0, index + 1); mInflater.Flush(); mInflaterStream.Position = 0; mProcessedLength += mInflaterStream.Read(mProcessedBuffer, mProcessedLength, mProcessedBuffer.Length - mProcessedLength); mUnprocessedLength -= (index + 1); if (mUnprocessedLength > 0) Buffer.BlockCopy(mUnprocessedBuffer, index + 1, mUnprocessedBuffer, 0, mUnprocessedLength); break; } } break; } case EProtocolState.EncryptedAndCompressed: { for (int index = 0; index < mUnprocessedLength; ++index) { if (mDecryptLength >= mDecryptBuffer.Length || index >= mUnprocessedBuffer.Length) { System.Diagnostics.Debug.Write("Bad"); } mDecryptBuffer[mDecryptLength] = DecryptByte(mUnprocessedBuffer[index]); ++mDecryptLength; if (mDecryptLength >= 4 && mDecryptBuffer[mDecryptLength - 1] == 0xFF && mDecryptBuffer[mDecryptLength - 2] == 0xFF && mDecryptBuffer[mDecryptLength - 3] == 0x00 && mDecryptBuffer[mDecryptLength - 4] == 0x00) { mInflaterStream.SetLength(0); mInflater.Write(mDecryptBuffer, 0, mDecryptLength); mInflater.Flush(); mInflaterStream.Position = 0; mProcessedLength += mInflaterStream.Read(mProcessedBuffer, mProcessedLength, mProcessedBuffer.Length - mProcessedLength); mDecryptLength = 0; } } mUnprocessedLength = 0; break; } default: break; } if (!ReadEncodedLong(mProcessedBuffer, 0, mProcessedLength, out packetLength, out sizeOfPacketLength)) return null; if (mProcessedLength < (sizeOfPacketLength + packetLength)) return null; byte[] packetBuffer = new byte[packetLength]; Buffer.BlockCopy(mProcessedBuffer, sizeOfPacketLength, packetBuffer, 0, (int)packetLength); mProcessedLength -= (sizeOfPacketLength + (int)packetLength); if (mProcessedLength > 0) Buffer.BlockCopy(mProcessedBuffer, sizeOfPacketLength + (int)packetLength, mProcessedBuffer, 0, mProcessedLength); //PacketDescriptions.PacketDescription description = PacketDescriptions.Instance.Descriptions.Find(d => d.Outbound == mOutbound && d.Opcode == opcode); RiftPacketReader reader = new RiftPacketReader(pTransmitted, mOutbound, packetBuffer, 0, packetBuffer.Length); RiftPacket packet; int sizeOfPacket; if (!reader.ReadPacket(out packet, out sizeOfPacket)) return null; packet.Raw = packetBuffer; return packet; }