The MCS Connect Initial PDU is a Standard RDP Connection Sequence PDU sent from client to server during the Basic Settings Exchange phase (see Section ). It is sent after receiving the X.224 Connection Confirm PDU. The MCS Connect Initial PDU encapsulates a GCC Conference Create Request, which encapsulates concatenated blocks of settings data. A basic high-level overview of the nested structure for the Client MCS Connect Initial PDU is illustrated in Figure 2. Note that the order of the settings data blocks is allowed to vary from that shown in Figure 2 and the message syntax layout which follows. This is possible because each data block is identified by a User Data Header structure (see section ).
file:///C:/Documents and Settings/test/Desktop/PAC/latest_XMLS_16may/RDPBCGR/_rfc_ms-rdpbcgr2_1_1_3.xml
Inheritance: RdpbcgrClientPdu
 private void S8_ServerRedirection_PositiveTest_WithRoutingToken_VerifyMCSConnectInitialPDU(Client_MCS_Connect_Initial_Pdu_with_GCC_Conference_Create_Request mcsConnectRequest)
 {
     this.TestSite.Assert.AreEqual<uint>(RdpbcgrTestData.Test_Redirection_SessionId,
         mcsConnectRequest.mcsCi.gccPdu.clientClusterData.RedirectedSessionID,
         "Verify if the RefirectedSessionID field within Client Cluster Data is equal to the SessionID sent by the server in Server Redirection PDU.");
 }
        /// <summary>
        /// Decode MCS Connect Initial PDU with GCC Conference Create Initial
        /// </summary>
        /// <param name="data">data to be parsed</param>
        /// <returns>Decoded MCS Connect Initial PDU with GCC Conference Create Initial</returns>
        public StackPacket DecodeMcsConnectInitialPDU(byte[] data)
        {
            // initialize
            int currentIndex = 0;
            Client_MCS_Connect_Initial_Pdu_with_GCC_Conference_Create_Request pdu =
                new Client_MCS_Connect_Initial_Pdu_with_GCC_Conference_Create_Request();

            // McsConnectResponse: TpktHeader
            pdu.tpktHeader = ParseTpktHeader(data, ref currentIndex);

            // McsConnectResponse: X224
            pdu.x224Data = ParseX224Data(data, ref currentIndex);

            // T125 Data: decode McsConnectResponse
            int t125DataLength = data.Length - currentIndex;
            if (t125DataLength <= 0)
            {
                throw new FormatException(ConstValue.ERROR_MESSAGE_DATA_INDEX_OUT_OF_RANGE);
            }
            byte[] t125Data = new byte[t125DataLength];
            Array.Copy(data, currentIndex, t125Data, 0, t125Data.Length);
            Connect_Initial mcsConnectInitial = new Connect_Initial();
            Asn1DecodingBuffer decodeBuffer = new Asn1DecodingBuffer(t125Data);
            mcsConnectInitial.BerDecode(decodeBuffer);

            // McsConnectResponse:result
            pdu.mcsCi.targetParameters.maxChannelIds = (long)mcsConnectInitial.targetParameters.maxChannelIds.Value;
            pdu.mcsCi.targetParameters.maxHeight = (long)mcsConnectInitial.targetParameters.maxHeight.Value;
            pdu.mcsCi.targetParameters.maxMcsPduSize = (long)mcsConnectInitial.targetParameters.maxMCSPDUsize.Value;
            pdu.mcsCi.targetParameters.maxTokenIds = (long)mcsConnectInitial.targetParameters.maxTokenIds.Value;
            pdu.mcsCi.targetParameters.maxUserIds = (long)mcsConnectInitial.targetParameters.maxUserIds.Value;
            pdu.mcsCi.targetParameters.minThroughput = (long)mcsConnectInitial.targetParameters.minThroughput.Value;
            pdu.mcsCi.targetParameters.numPriorities = (long)mcsConnectInitial.targetParameters.numPriorities.Value;
            pdu.mcsCi.targetParameters.protocolVersion = (long)mcsConnectInitial.targetParameters.protocolVersion.Value;

            pdu.mcsCi.minimumParameters.maxChannelIds = (long)mcsConnectInitial.minimumParameters.maxChannelIds.Value;
            pdu.mcsCi.minimumParameters.maxHeight = (long)mcsConnectInitial.minimumParameters.maxHeight.Value;
            pdu.mcsCi.minimumParameters.maxMcsPduSize = (long)mcsConnectInitial.minimumParameters.maxMCSPDUsize.Value;
            pdu.mcsCi.minimumParameters.maxTokenIds = (long)mcsConnectInitial.minimumParameters.maxTokenIds.Value;
            pdu.mcsCi.minimumParameters.maxUserIds = (long)mcsConnectInitial.minimumParameters.maxUserIds.Value;
            pdu.mcsCi.minimumParameters.minThroughput = (long)mcsConnectInitial.minimumParameters.minThroughput.Value;
            pdu.mcsCi.minimumParameters.numPriorities = (long)mcsConnectInitial.minimumParameters.numPriorities.Value;
            pdu.mcsCi.minimumParameters.protocolVersion = (long)mcsConnectInitial.minimumParameters.protocolVersion.Value;

            pdu.mcsCi.maximumParameters.maxChannelIds = (long)mcsConnectInitial.maximumParameters.maxChannelIds.Value;
            pdu.mcsCi.maximumParameters.maxHeight = (long)mcsConnectInitial.maximumParameters.maxHeight.Value;
            pdu.mcsCi.maximumParameters.maxMcsPduSize = (long)mcsConnectInitial.maximumParameters.maxMCSPDUsize.Value;
            pdu.mcsCi.maximumParameters.maxTokenIds = (long)mcsConnectInitial.maximumParameters.maxTokenIds.Value;
            pdu.mcsCi.maximumParameters.maxUserIds = (long)mcsConnectInitial.maximumParameters.maxUserIds.Value;
            pdu.mcsCi.maximumParameters.minThroughput = (long)mcsConnectInitial.maximumParameters.minThroughput.Value;
            pdu.mcsCi.maximumParameters.numPriorities = (long)mcsConnectInitial.maximumParameters.numPriorities.Value;
            pdu.mcsCi.maximumParameters.protocolVersion = (long)mcsConnectInitial.maximumParameters.protocolVersion.Value;

            // T125 User Data: get McsConnectResponse's user data
            //byte[] userData = new byte[mcsConnectInitial.userData.Length];
            //Stream mscInput = mcsConnectInitial.userData.toInputStream();
            //mscInput.Read(userData, 0, userData.Length);
            byte[] userData = mcsConnectInitial.userData.ByteArrayValue;

            // T125 User Data: decode McsConnectResponse's user data
            Asn1DecodingBuffer connectDataBuffer = new Asn1DecodingBuffer(userData);
            ConnectData connectData = new ConnectData();
            connectData.PerDecode(connectDataBuffer);

            // Gcc Data: get Gcc data
            int gccDataLength = userData.Length - ConstValue.GCC_CCI_DATA_OFFSET;
            if (gccDataLength <= 0)
            {
                throw new FormatException(ConstValue.ERROR_MESSAGE_DATA_INDEX_OUT_OF_RANGE);
            }
            byte[] gccData = new byte[gccDataLength];
            Array.Copy(userData, ConstValue.GCC_CCI_DATA_OFFSET, gccData, 0, gccData.Length);

            // Gcc Data: decode Gcc data
            ConnectGCCPDU gccPdu = new ConnectGCCPDU();
            Asn1DecodingBuffer gccPduBuffer = new Asn1DecodingBuffer(gccData);
            gccPdu.PerDecode(gccPduBuffer);

            // McsConnectResponse: H221Key
            ConferenceCreateRequest conferenceRequest = (ConferenceCreateRequest)gccPdu.GetData();
            H221NonStandardIdentifier identifier =
                (H221NonStandardIdentifier)conferenceRequest.userData.Elements[0].key.GetData();
            pdu.mcsCi.gccPdu.h221Key = Encoding.ASCII.GetString(identifier.ByteArrayValue);

            // Gcc User Data: get Gcc user data
            byte[] gccUserData = conferenceRequest.userData.Elements[0].value.ByteArrayValue;

            // Reset current index
            currentIndex = 0;
            while (currentIndex < gccUserData.Length)
            {
                // Peek data type
                int tempIndex = currentIndex;
                int orgIndex = currentIndex;
                TS_UD_HEADER_type_Values type =
                    (TS_UD_HEADER_type_Values)ParseUInt16(gccUserData, ref tempIndex, false);
                ushort userDataLength = ParseUInt16(gccUserData, ref tempIndex, false);

                // Parse data by type
                switch (type)
                {
                    case TS_UD_HEADER_type_Values.CS_CORE:
                        pdu.mcsCi.gccPdu.clientCoreData = ParseTsUdCsCore(gccUserData, ref currentIndex, userDataLength);
                        break;

                    case TS_UD_HEADER_type_Values.CS_NET:
                        pdu.mcsCi.gccPdu.clientNetworkData = ParseTsUdCsNet(gccUserData, ref currentIndex);
                        break;

                    case TS_UD_HEADER_type_Values.CS_SECURITY:
                        pdu.mcsCi.gccPdu.clientSecurityData = ParseTsUdCsSec(gccUserData, ref currentIndex);
                        break;

                    case TS_UD_HEADER_type_Values.CS_CLUSTER:
                        pdu.mcsCi.gccPdu.clientClusterData = ParseTsUdCsCluster(gccUserData, ref currentIndex);
                        break;

                    case TS_UD_HEADER_type_Values.CS_MONITOR:
                        pdu.mcsCi.gccPdu.clientMonitorData = ParseTsUdCsMon(gccUserData, ref currentIndex);
                        break;

                    case TS_UD_HEADER_type_Values.CS_MCS_MSGCHANNEL:
                        pdu.mcsCi.gccPdu.clientMessageChannelData = ParseTsUdCsMcsMsgChannel(gccUserData, ref currentIndex);
                        break;

                    case TS_UD_HEADER_type_Values.CS_MULTITRANSPORT:
                        pdu.mcsCi.gccPdu.clientMultitransportChannelData = ParseTsUdCsMultiTransport(gccUserData, ref currentIndex);
                        break;

                    case TS_UD_HEADER_type_Values.CS_MONITOR_EX:
                        pdu.mcsCi.gccPdu.clientMonitorExtendedData = ParseTsUdCsMonitorEX(gccUserData, ref currentIndex);
                        break;

                    default:
                        break;
                    //throw new FormatException(ConstValue.ERROR_MESSAGE_ENUM_UNRECOGNIZED);
                }
                currentIndex = orgIndex + userDataLength;
            }

            // Check if data length exceeded expectation
            VerifyDataLength(gccUserData.Length, currentIndex, ConstValue.ERROR_MESSAGE_DATA_LENGTH_EXCEEDED);
            return pdu;
        }
        /// <summary>
        /// 2.2.1.3
        /// </summary>
        /// <param name="connectInitialPdu"></param>
        public void VerifyPdu(Client_MCS_Connect_Initial_Pdu_with_GCC_Conference_Create_Request connectInitialPdu)
        {
            //Site.Log.Add(TestTools.LogEntryKind.Debug, "CheckMCSConnectInitialPdu");
            //<?>
            CaptureRequirement(connectInitialPdu.mcsCi.gccPdu != null, 41);
            //<?>
            //site.CaptureRequirementIfAreEqual<byte>(0, connectInitialPdu.x224Data.type, 66,
            // @"[In Client MCS Connect Initial PDU with GCC Conference Create Request] x224Data (3 bytes): An X.224 Class 0 Data PDU, as specified in [X224] section 13.7.");

            if (!serverConfig.isExtendedClientDataSupported)
            {
                //<capture> also capture R265
                site.CaptureRequirementIfIsNull(connectInitialPdu.mcsCi.gccPdu.clientMonitorData, 78,
                    @"In  Client MCS Connect Initial PDU with GCC Conference Create Request, clientMonitorData (variable): This field MUST "
                    + @"NOT be included if the server did not advertise support for Extended Client Data Blocks by using the EXTENDED_CLIENT_DATA_SUPPORTED"
                    + @" flag (0x00000001) as described in section 2.2.1.2.1.");
            }
            bool isR81Satisfied = connectInitialPdu.mcsCi.gccPdu.clientCoreData.header.type == TS_UD_HEADER_type_Values.CS_CORE || connectInitialPdu.mcsCi.gccPdu.clientCoreData.header.type == TS_UD_HEADER_type_Values.CS_SECURITY
                || connectInitialPdu.mcsCi.gccPdu.clientCoreData.header.type == TS_UD_HEADER_type_Values.CS_NET || connectInitialPdu.mcsCi.gccPdu.clientCoreData.header.type == TS_UD_HEADER_type_Values.CS_CLUSTER
                || connectInitialPdu.mcsCi.gccPdu.clientCoreData.header.type == TS_UD_HEADER_type_Values.CS_MONITOR || connectInitialPdu.mcsCi.gccPdu.clientCoreData.header.type == TS_UD_HEADER_type_Values.SC_CORE
                || connectInitialPdu.mcsCi.gccPdu.clientCoreData.header.type == TS_UD_HEADER_type_Values.SC_SECURITY || connectInitialPdu.mcsCi.gccPdu.clientCoreData.header.type == TS_UD_HEADER_type_Values.SC_NET;
            site.CaptureRequirementIfIsTrue(isR81Satisfied, 81,
                @"In TS_UD_HEADER, the type field can take one of the following values: CS_CORE 0xC001,CS_SECURITY 0xC002,CS_NET 0xC003,CS_CLUSTER 0xC004,"
                + @"SC_CORE 0x0C01,SC_SECURITY 0x0C02,SC_NET 0xOC03");
            //<capture> also caputre R93
            site.CaptureRequirementIfAreEqual<TS_UD_HEADER_type_Values>(TS_UD_HEADER_type_Values.CS_CORE, connectInitialPdu.mcsCi.gccPdu.clientCoreData.header.type, 82,
                @"In TS_UD_HEADER, if the type is CS_CORE0xC001 then the data block which follows User Data Header (TS_UD_HEADER) contains Client Core Data");
            site.CaptureRequirementIfAreEqual<TS_UD_HEADER_type_Values>(TS_UD_HEADER_type_Values.CS_SECURITY, connectInitialPdu.mcsCi.gccPdu.clientSecurityData.header.type, 83,
                @"In TS_UD_HEADER, if the type is CS_SECURITY 0xC002 then the data block which follows User Data Header (TS_UD_HEADER) contains Client Security Data");
            if (connectInitialPdu.mcsCi.gccPdu.clientNetworkData != null)
            {
                site.CaptureRequirementIfAreEqual<TS_UD_HEADER_type_Values>(TS_UD_HEADER_type_Values.CS_NET, connectInitialPdu.mcsCi.gccPdu.clientNetworkData.header.type, 84,
                    @"In TS_UD_HEADER, if the type is CS_NET 0xC003 then the data block which follows contains User Data Header (TS_UD_HEADER) Client Network Data.");
            }

            if (connectInitialPdu.mcsCi.gccPdu.clientClusterData != null)
            {
                site.CaptureRequirementIfAreEqual<TS_UD_HEADER_type_Values>(TS_UD_HEADER_type_Values.CS_CLUSTER, connectInitialPdu.mcsCi.gccPdu.clientClusterData.header.type, 85,
                    @"In TS_UD_HEADER, if the type is CS_CLUSTER 0xC004 then the data block which follows User Data Header (TS_UD_HEADER) contains Client Cluster Data.");
            }

            if (connectInitialPdu.mcsCi.gccPdu.clientMonitorData != null)
            {
                site.CaptureRequirementIfAreEqual<TS_UD_HEADER_type_Values>(TS_UD_HEADER_type_Values.CS_MONITOR, connectInitialPdu.mcsCi.gccPdu.clientMonitorData.header.type, 86,
                    @"In User Data Header (TS_UD_HEADER), type (2 bytes): If the type is CS_MONITOR 0xC005 then the data block that follows contains Client Monitor"
                    + @" Data (section 2.2.1.3.6).");
                VerifyStructure(connectInitialPdu.mcsCi.gccPdu.clientMonitorData);
            }
            if (connectInitialPdu.mcsCi.gccPdu.clientCoreData != null)
            {
                VerifyStructure(connectInitialPdu.mcsCi.gccPdu.clientCoreData);
            }
            if (connectInitialPdu.mcsCi.gccPdu.clientSecurityData != null)
            {
                VerifyStructure(connectInitialPdu.mcsCi.gccPdu.clientSecurityData);
            }
            if (connectInitialPdu.mcsCi.gccPdu.clientNetworkData != null)
            {
                VerifyStructure(connectInitialPdu.mcsCi.gccPdu.clientNetworkData);
            }
            if(connectInitialPdu.mcsCi.gccPdu.clientClusterData != null)
            {
                VerifyStructure(connectInitialPdu.mcsCi.gccPdu.clientClusterData);
            }
        }
Ejemplo n.º 4
0
        /// <summary>
        /// Create an instance of the class that is identical to the current PDU. 
        /// </summary>
        /// <returns>The new instance.</returns>
        public override StackPacket Clone()
        {
            Client_MCS_Connect_Initial_Pdu_with_GCC_Conference_Create_Request cloneMCSInitialPdu =
               new Client_MCS_Connect_Initial_Pdu_with_GCC_Conference_Create_Request(context);

            cloneMCSInitialPdu.tpktHeader = tpktHeader;
            cloneMCSInitialPdu.x224Data = x224Data;
            if (mcsCi != null)
            {
                cloneMCSInitialPdu.mcsCi = new MCSConnectInitial();
                cloneMCSInitialPdu.mcsCi.calledDomainSelector = RdpbcgrUtility.CloneByteArray(mcsCi.calledDomainSelector);
                cloneMCSInitialPdu.mcsCi.callingDomainSelector = RdpbcgrUtility.CloneByteArray(mcsCi.callingDomainSelector);
                cloneMCSInitialPdu.mcsCi.maximumParameters = mcsCi.maximumParameters;
                cloneMCSInitialPdu.mcsCi.minimumParameters = mcsCi.minimumParameters;
                cloneMCSInitialPdu.mcsCi.targetParameters = mcsCi.targetParameters;
                cloneMCSInitialPdu.mcsCi.upwardFlag = mcsCi.upwardFlag;

                if (mcsCi.gccPdu != null)
                {
                    #region clone mcsCi.gccPdu filed
                    cloneMCSInitialPdu.mcsCi.gccPdu = new ConnectGCC();
                    cloneMCSInitialPdu.mcsCi.gccPdu.callerIdentifier = mcsCi.gccPdu.callerIdentifier;
                    cloneMCSInitialPdu.mcsCi.gccPdu.conductedPrivileges =
                        (mcsCi.gccPdu.conductedPrivileges == null) ?
                        null : (int[])mcsCi.gccPdu.conductedPrivileges.Clone();
                    cloneMCSInitialPdu.mcsCi.gccPdu.conductibleConference = mcsCi.gccPdu.conductibleConference;
                    cloneMCSInitialPdu.mcsCi.gccPdu.conductorPrivileges =
                        (mcsCi.gccPdu.conductorPrivileges == null) ?
                        null : (int[])mcsCi.gccPdu.conductorPrivileges.Clone();
                    cloneMCSInitialPdu.mcsCi.gccPdu.conferenceDescription = mcsCi.gccPdu.conferenceDescription;
                    cloneMCSInitialPdu.mcsCi.gccPdu.conferenceName = mcsCi.gccPdu.conferenceName;
                    cloneMCSInitialPdu.mcsCi.gccPdu.convenerPassword = mcsCi.gccPdu.convenerPassword;
                    cloneMCSInitialPdu.mcsCi.gccPdu.h221Key = mcsCi.gccPdu.h221Key;
                    cloneMCSInitialPdu.mcsCi.gccPdu.listedConference = mcsCi.gccPdu.listedConference;
                    cloneMCSInitialPdu.mcsCi.gccPdu.lockedConference = mcsCi.gccPdu.lockedConference;
                    cloneMCSInitialPdu.mcsCi.gccPdu.nonConductedPrivileges =
                        (mcsCi.gccPdu.nonConductedPrivileges == null) ?
                        null : (int[])mcsCi.gccPdu.nonConductedPrivileges.Clone();
                    cloneMCSInitialPdu.mcsCi.gccPdu.password = mcsCi.gccPdu.password;
                    cloneMCSInitialPdu.mcsCi.gccPdu.terminationMethod = mcsCi.gccPdu.terminationMethod;

                    if (mcsCi.gccPdu.clientCoreData != null)
                    {
                        cloneMCSInitialPdu.mcsCi.gccPdu.clientCoreData = new TS_UD_CS_CORE();
                        cloneMCSInitialPdu.mcsCi.gccPdu.clientCoreData.header =
                            mcsCi.gccPdu.clientCoreData.header;
                        cloneMCSInitialPdu.mcsCi.gccPdu.clientCoreData.version =
                            mcsCi.gccPdu.clientCoreData.version;
                        cloneMCSInitialPdu.mcsCi.gccPdu.clientCoreData.desktopHeight =
                            mcsCi.gccPdu.clientCoreData.desktopHeight;
                        cloneMCSInitialPdu.mcsCi.gccPdu.clientCoreData.desktopWidth =
                            mcsCi.gccPdu.clientCoreData.desktopWidth;
                        cloneMCSInitialPdu.mcsCi.gccPdu.clientCoreData.colorDepth =
                            mcsCi.gccPdu.clientCoreData.colorDepth;
                        cloneMCSInitialPdu.mcsCi.gccPdu.clientCoreData.SASSequence =
                            mcsCi.gccPdu.clientCoreData.SASSequence;
                        cloneMCSInitialPdu.mcsCi.gccPdu.clientCoreData.keyboardLayout =
                            mcsCi.gccPdu.clientCoreData.keyboardLayout;
                        cloneMCSInitialPdu.mcsCi.gccPdu.clientCoreData.clientBuild =
                            mcsCi.gccPdu.clientCoreData.clientBuild;
                        cloneMCSInitialPdu.mcsCi.gccPdu.clientCoreData.clientDigProductId =
                            mcsCi.gccPdu.clientCoreData.clientDigProductId;
                        cloneMCSInitialPdu.mcsCi.gccPdu.clientCoreData.clientName =
                            mcsCi.gccPdu.clientCoreData.clientName;
                        cloneMCSInitialPdu.mcsCi.gccPdu.clientCoreData.clientProductId =
                            mcsCi.gccPdu.clientCoreData.clientProductId;
                        cloneMCSInitialPdu.mcsCi.gccPdu.clientCoreData.connnectionType =
                            mcsCi.gccPdu.clientCoreData.connnectionType;
                        cloneMCSInitialPdu.mcsCi.gccPdu.clientCoreData.earlyCapabilityFlags =
                            mcsCi.gccPdu.clientCoreData.earlyCapabilityFlags;
                        cloneMCSInitialPdu.mcsCi.gccPdu.clientCoreData.highColorDepth =
                            mcsCi.gccPdu.clientCoreData.highColorDepth;
                        cloneMCSInitialPdu.mcsCi.gccPdu.clientCoreData.imeFileName =
                            mcsCi.gccPdu.clientCoreData.imeFileName;
                        cloneMCSInitialPdu.mcsCi.gccPdu.clientCoreData.keyboardFunctionKey =
                            mcsCi.gccPdu.clientCoreData.keyboardFunctionKey;
                        cloneMCSInitialPdu.mcsCi.gccPdu.clientCoreData.keyboardSubType =
                            mcsCi.gccPdu.clientCoreData.keyboardSubType;
                        cloneMCSInitialPdu.mcsCi.gccPdu.clientCoreData.keyboardType =
                            mcsCi.gccPdu.clientCoreData.keyboardType;
                        cloneMCSInitialPdu.mcsCi.gccPdu.clientCoreData.pad1octets =
                            mcsCi.gccPdu.clientCoreData.pad1octets;
                        cloneMCSInitialPdu.mcsCi.gccPdu.clientCoreData.postBeta2ColorDepth =
                            mcsCi.gccPdu.clientCoreData.postBeta2ColorDepth;
                        cloneMCSInitialPdu.mcsCi.gccPdu.clientCoreData.serialNumber =
                            mcsCi.gccPdu.clientCoreData.serialNumber;
                        cloneMCSInitialPdu.mcsCi.gccPdu.clientCoreData.serverSelectedProtocol =
                            mcsCi.gccPdu.clientCoreData.serverSelectedProtocol;
                        cloneMCSInitialPdu.mcsCi.gccPdu.clientCoreData.supportedColorDepths =
                            mcsCi.gccPdu.clientCoreData.supportedColorDepths;
                        cloneMCSInitialPdu.mcsCi.gccPdu.clientCoreData.desktopPhysicalWidth =
                            mcsCi.gccPdu.clientCoreData.desktopPhysicalWidth;
                        cloneMCSInitialPdu.mcsCi.gccPdu.clientCoreData.desktopPhysicalHeight=
                            mcsCi.gccPdu.clientCoreData.desktopPhysicalHeight;
                        cloneMCSInitialPdu.mcsCi.gccPdu.clientCoreData.desktopOrientation =
                            mcsCi.gccPdu.clientCoreData.desktopOrientation;
                        cloneMCSInitialPdu.mcsCi.gccPdu.clientCoreData.desktopScaleFactor =
                            mcsCi.gccPdu.clientCoreData.desktopScaleFactor;
                        cloneMCSInitialPdu.mcsCi.gccPdu.clientCoreData.deviceScaleFactor =
                            mcsCi.gccPdu.clientCoreData.deviceScaleFactor;
                    }

                    if (mcsCi.gccPdu.clientClusterData != null)
                    {
                        cloneMCSInitialPdu.mcsCi.gccPdu.clientClusterData = new TS_UD_CS_CLUSTER();
                        cloneMCSInitialPdu.mcsCi.gccPdu.clientClusterData.Flags =
                            mcsCi.gccPdu.clientClusterData.Flags;
                        cloneMCSInitialPdu.mcsCi.gccPdu.clientClusterData.header =
                            mcsCi.gccPdu.clientClusterData.header;
                        cloneMCSInitialPdu.mcsCi.gccPdu.clientClusterData.RedirectedSessionID =
                            mcsCi.gccPdu.clientClusterData.RedirectedSessionID;
                    }

                    if (mcsCi.gccPdu.clientMonitorData != null)
                    {
                        cloneMCSInitialPdu.mcsCi.gccPdu.clientMonitorData = new TS_UD_CS_MONITOR();
                        cloneMCSInitialPdu.mcsCi.gccPdu.clientMonitorData.Flags =
                            mcsCi.gccPdu.clientMonitorData.Flags;
                        cloneMCSInitialPdu.mcsCi.gccPdu.clientMonitorData.header =
                            mcsCi.gccPdu.clientMonitorData.header;
                        cloneMCSInitialPdu.mcsCi.gccPdu.clientMonitorData.monitorCount =
                            mcsCi.gccPdu.clientMonitorData.monitorCount;
                        if (mcsCi.gccPdu.clientMonitorData.monitorDefArray != null)
                        {
                            cloneMCSInitialPdu.mcsCi.gccPdu.clientMonitorData.monitorDefArray =
                                new Collection<TS_MONITOR_DEF>();
                            for (int count = 0; count < mcsCi.gccPdu.clientMonitorData.monitorDefArray.Count; count++)
                            {
                                cloneMCSInitialPdu.mcsCi.gccPdu.clientMonitorData.monitorDefArray.Add(
                                    mcsCi.gccPdu.clientMonitorData.monitorDefArray[count]);
                            }

                        }
                    }

                    if (mcsCi.gccPdu.clientNetworkData != null)
                    {
                        cloneMCSInitialPdu.mcsCi.gccPdu.clientNetworkData = new TS_UD_CS_NET();
                        cloneMCSInitialPdu.mcsCi.gccPdu.clientNetworkData.header =
                            mcsCi.gccPdu.clientNetworkData.header;
                        cloneMCSInitialPdu.mcsCi.gccPdu.clientNetworkData.channelCount =
                            mcsCi.gccPdu.clientNetworkData.channelCount;
                        if (mcsCi.gccPdu.clientNetworkData.channelDefArray != null)
                        {
                            cloneMCSInitialPdu.mcsCi.gccPdu.clientNetworkData.channelDefArray =
                                new List<CHANNEL_DEF>();
                            cloneMCSInitialPdu.mcsCi.gccPdu.clientNetworkData.channelDefArray.AddRange
                                (mcsCi.gccPdu.clientNetworkData.channelDefArray);
                        }
                    }

                    if (mcsCi.gccPdu.clientSecurityData != null)
                    {
                        cloneMCSInitialPdu.mcsCi.gccPdu.clientSecurityData = new TS_UD_CS_SEC();
                        cloneMCSInitialPdu.mcsCi.gccPdu.clientSecurityData.encryptionMethods =
                            mcsCi.gccPdu.clientSecurityData.encryptionMethods;
                        cloneMCSInitialPdu.mcsCi.gccPdu.clientSecurityData.extEncryptionMethods =
                            mcsCi.gccPdu.clientSecurityData.extEncryptionMethods;
                        cloneMCSInitialPdu.mcsCi.gccPdu.clientSecurityData.header =
                            mcsCi.gccPdu.clientSecurityData.header;
                    }

                    if (mcsCi.gccPdu.clientMessageChannelData != null)
                    {
                        cloneMCSInitialPdu.mcsCi.gccPdu.clientMessageChannelData = new TS_UD_CS_MCS_MSGCHANNEL();
                        cloneMCSInitialPdu.mcsCi.gccPdu.clientMessageChannelData.header = mcsCi.gccPdu.clientMessageChannelData.header;
                        cloneMCSInitialPdu.mcsCi.gccPdu.clientMessageChannelData.flags = mcsCi.gccPdu.clientMessageChannelData.flags;
                    }

                    if (mcsCi.gccPdu.clientMultitransportChannelData != null)
                    {
                        cloneMCSInitialPdu.mcsCi.gccPdu.clientMultitransportChannelData = new TS_UD_CS_MULTITRANSPORT();
                        cloneMCSInitialPdu.mcsCi.gccPdu.clientMultitransportChannelData.header = mcsCi.gccPdu.clientMultitransportChannelData.header;
                        cloneMCSInitialPdu.mcsCi.gccPdu.clientMultitransportChannelData.flags = mcsCi.gccPdu.clientMultitransportChannelData.flags;
                    }

                    if (mcsCi.gccPdu.clientMonitorExtendedData != null)
                    {
                        cloneMCSInitialPdu.mcsCi.gccPdu.clientMonitorExtendedData = new TS_UD_CS_MONITOR_EX();
                        cloneMCSInitialPdu.mcsCi.gccPdu.clientMonitorExtendedData.header = mcsCi.gccPdu.clientMonitorExtendedData.header;
                        cloneMCSInitialPdu.mcsCi.gccPdu.clientMonitorExtendedData.flags = mcsCi.gccPdu.clientMonitorExtendedData.flags;
                        cloneMCSInitialPdu.mcsCi.gccPdu.clientMonitorExtendedData.monitorAttributeSize = mcsCi.gccPdu.clientMonitorExtendedData.monitorAttributeSize;
                        cloneMCSInitialPdu.mcsCi.gccPdu.clientMonitorExtendedData.monitorCount = mcsCi.gccPdu.clientMonitorExtendedData.monitorCount;

                        List<TS_MONITOR_ATTRIBUTES> attributes = new List<TS_MONITOR_ATTRIBUTES>();
                        foreach (TS_MONITOR_ATTRIBUTES attribute in mcsCi.gccPdu.clientMonitorExtendedData.monitorAttributesArray)
                        {
                            attributes.Add(attribute.Clone());
                        }
                        cloneMCSInitialPdu.mcsCi.gccPdu.clientMonitorExtendedData.monitorAttributesArray = attributes.ToArray();

                    }
                    #endregion clone mcsCi.gccPdu filed
                }
            }

            return cloneMCSInitialPdu;
        }