The Standard Security Server Redirection PDU is sent by the server to the client to instruct it to reconnect to an existing session on another server. The information required to perform the reconnection is contained in an embedded Server Redirection Packet (see section 2.2.13.1). This PDU MUST NOT be sent if Enhanced RDP Security (see section 5.4) is in effect.
Inheritance: RdpbcgrServerPdu
        /// <summary>
        /// Decode Standard Security Server Redirection PDU.
        /// </summary>
        /// <param name="data">data to be parsed</param>
        /// <param name="decryptedUserData">decrypted user data to be parsed</param>
        /// <param name="type">security header type</param>
        /// <returns>decoded Server Redirection PDU</returns>
        public StackPacket DecodeServerRedirectionPDU(
            byte[] data,
            byte[] decryptedUserData,
            SecurityHeaderType type)
        {
            Server_Redirection_Pdu pdu = new Server_Redirection_Pdu();

            // data index
            int dataIndex = 0;

            UpdateSecurityHeaderType(ref type);

            // Server_Redirection_Pdu: commonHeader
            pdu.commonHeader = ParseMcsCommonHeader(data, ref dataIndex, type);

            // user data index
            int userDataIndex = 0;

            // Server_Redirection_PDU: serverRedirectionPdu
            pdu.serverRedirectionPdu = ParseRdpServerRedirectionPacket(decryptedUserData, ref userDataIndex);

            // Check if data length exceeded expectation
            VerifyDataLength(decryptedUserData.Length, userDataIndex, ConstValue.ERROR_MESSAGE_DATA_LENGTH_EXCEEDED);
            return pdu;
        }
Ejemplo n.º 2
0
        public override StackPacket Clone()
        {
            Server_Redirection_Pdu pduClone = new Server_Redirection_Pdu();
            pduClone.commonHeader = commonHeader;
            pduClone.serverRedirectionPdu = new RDP_SERVER_REDIRECTION_PACKET();
            pduClone.serverRedirectionPdu.Domain = RdpbcgrUtility.CloneByteArray(serverRedirectionPdu.Domain);
            pduClone.serverRedirectionPdu.DomainLength = serverRedirectionPdu.DomainLength;
            pduClone.serverRedirectionPdu.Flags = serverRedirectionPdu.Flags;
            pduClone.serverRedirectionPdu.Length = serverRedirectionPdu.Length;
            pduClone.serverRedirectionPdu.LoadBalanceInfo = RdpbcgrUtility.CloneByteArray(serverRedirectionPdu.LoadBalanceInfo);
            pduClone.serverRedirectionPdu.LoadBalanceInfoLength = serverRedirectionPdu.LoadBalanceInfoLength;
            pduClone.serverRedirectionPdu.Pad = RdpbcgrUtility.CloneByteArray(serverRedirectionPdu.Pad);
            pduClone.serverRedirectionPdu.Password = RdpbcgrUtility.CloneByteArray(serverRedirectionPdu.Password);
            pduClone.serverRedirectionPdu.PasswordLength = serverRedirectionPdu.PasswordLength;
            pduClone.serverRedirectionPdu.RedirFlags = serverRedirectionPdu.RedirFlags;
            pduClone.serverRedirectionPdu.SessionId = serverRedirectionPdu.SessionId;
            pduClone.serverRedirectionPdu.TargetFQDN = RdpbcgrUtility.CloneByteArray(serverRedirectionPdu.TargetFQDN);
            pduClone.serverRedirectionPdu.TargetFQDNLength = serverRedirectionPdu.TargetFQDNLength;
            pduClone.serverRedirectionPdu.TargetNetAddress = RdpbcgrUtility.CloneByteArray(serverRedirectionPdu.TargetNetAddress);
            pduClone.serverRedirectionPdu.TargetNetAddresses.addressCount = serverRedirectionPdu.TargetNetAddresses.addressCount;
            if (serverRedirectionPdu.TargetNetAddresses.address != null)
            {
                pduClone.serverRedirectionPdu.TargetNetAddresses.address =
                    new TARGET_NET_ADDRESS[serverRedirectionPdu.TargetNetAddresses.address.Length];
                for (int i = 0; i < serverRedirectionPdu.TargetNetAddresses.address.Length; ++i)
                {
                    pduClone.serverRedirectionPdu.TargetNetAddresses.address[i].address =
                        RdpbcgrUtility.CloneByteArray(serverRedirectionPdu.TargetNetAddresses.address[i].address);
                    pduClone.serverRedirectionPdu.TargetNetAddresses.address[i].addressLength =
                        serverRedirectionPdu.TargetNetAddresses.address[i].addressLength;
                }
            }
            pduClone.serverRedirectionPdu.TargetNetAddressesLength = serverRedirectionPdu.TargetNetAddressesLength;
            pduClone.serverRedirectionPdu.TargetNetAddressLength = serverRedirectionPdu.TargetNetAddressLength;
            pduClone.serverRedirectionPdu.TargetNetBiosName =
                RdpbcgrUtility.CloneByteArray(serverRedirectionPdu.TargetNetBiosName);
            pduClone.serverRedirectionPdu.TargetNetBiosNameLength =
                serverRedirectionPdu.TargetNetBiosNameLength;
            pduClone.serverRedirectionPdu.UserName = RdpbcgrUtility.CloneByteArray(serverRedirectionPdu.UserName);
            pduClone.serverRedirectionPdu.UserNameLength = serverRedirectionPdu.UserNameLength;

            return pduClone;
        }