Exemplo n.º 1
0
        public static string MakeDetailedPacketLog(byte[] data, bool isSinglePacket = false)
        {
            StringBuilder sb = new StringBuilder();

            while (true)
            {
                QPacket qp = new QPacket(data);
                sb.AppendLine("##########################################################");
                sb.AppendLine(qp.ToStringDetailed());
                if (qp.type == QPacket.PACKETTYPE.DATA && qp.m_byPartNumber == 0)
                {
                    switch (qp.m_oSourceVPort.type)
                    {
                    case QPacket.STREAMTYPE.OldRVSec:
                        if (qp.flags.Contains(QPacket.PACKETFLAG.FLAG_ACK))
                        {
                            break;
                        }
                        sb.AppendLine("Trying to process RMC packet...");
                        try
                        {
                            MemoryStream m = new MemoryStream(qp.payload);
                            RMCP         p = new RMCP(qp);
                            m.Seek(p._afterProtocolOffset + 4, 0);
                            if (!p.isRequest)
                            {
                                m.ReadByte();
                            }
                            p.methodID = Helper.ReadU32(m);
                            sb.AppendLine("\tRMC Request  : " + p.isRequest);
                            sb.AppendLine("\tRMC Protocol : " + p.proto);
                            sb.AppendLine("\tRMC Method   : " + p.methodID.ToString("X"));
                            if (p.proto == RMCP.PROTOCOL.GlobalNotificationEventProtocol && p.methodID == 1)
                            {
                                sb.AppendLine("\t\tNotification :");
                                sb.AppendLine("\t\t\tSource".PadRight(20) + ": 0x" + Helper.ReadU32(m).ToString("X8"));
                                uint type = Helper.ReadU32(m);
                                sb.AppendLine("\t\t\tType".PadRight(20) + ": " + (type / 1000));
                                sb.AppendLine("\t\t\tSubType".PadRight(20) + ": " + (type % 1000));
                                sb.AppendLine("\t\t\tParam 1".PadRight(20) + ": 0x" + Helper.ReadU32(m).ToString("X8"));
                                sb.AppendLine("\t\t\tParam 2".PadRight(20) + ": 0x" + Helper.ReadU32(m).ToString("X8"));
                                sb.AppendLine("\t\t\tParam String".PadRight(20) + ": " + Helper.ReadString(m));
                                sb.AppendLine("\t\t\tParam 3".PadRight(20) + ": 0x" + Helper.ReadU32(m).ToString("X8"));
                            }
                            sb.AppendLine();
                        }
                        catch
                        {
                            sb.AppendLine("Error processing RMC packet");
                            sb.AppendLine();
                        }
                        break;

                    case QPacket.STREAMTYPE.DO:
                        if (qp.flags.Contains(QPacket.PACKETFLAG.FLAG_ACK))
                        {
                            break;
                        }
                        sb.AppendLine("Trying to unpack DO messages...");
                        try
                        {
                            MemoryStream m    = new MemoryStream(qp.payload);
                            uint         size = Helper.ReadU32(m);
                            byte[]       buff = new byte[size];
                            m.Read(buff, 0, (int)size);
                            DO.UnpackMessage(buff, 1, sb);
                            sb.AppendLine();
                        }
                        catch
                        {
                            sb.AppendLine("Error processing DO messages");
                            sb.AppendLine();
                        }
                        break;
                    }
                }
                int size2 = qp.toBuffer().Length;
                if (size2 == data.Length || isSinglePacket)
                {
                    break;
                }
                MemoryStream m2 = new MemoryStream(data);
                m2.Seek(size2, 0);
                size2 = (int)(m2.Length - m2.Position);
                if (size2 <= 8)
                {
                    break;
                }
                data = new byte[size2];
                m2.Write(data, 0, size2);
            }
            return(sb.ToString());
        }