Microsoft.Protocols.TestTools.StackSdk.RemoteDesktop.Rdpbcgr.RdpbcgrDecoder.ParseRdpServerRedirectionPacket C# (CSharp) Method

ParseRdpServerRedirectionPacket() private method

Parse RDP_SERVER_REDIRECTION_PACKET
private ParseRdpServerRedirectionPacket ( byte data, int &currentIndex ) : RDP_SERVER_REDIRECTION_PACKET
data byte data to be parsed
currentIndex int current parser index
return RDP_SERVER_REDIRECTION_PACKET
        private RDP_SERVER_REDIRECTION_PACKET ParseRdpServerRedirectionPacket(
            byte[] data,
            ref int currentIndex)
        {
            RDP_SERVER_REDIRECTION_PACKET packet = new RDP_SERVER_REDIRECTION_PACKET();

            int startIndex = currentIndex;

            // RDP_SERVER_REDIRECTION_PACKET: flags
            packet.Flags = ParseUInt16(data, ref currentIndex, false);

            // RDP_SERVER_REDIRECTION_PACKET: length
            packet.Length = ParseUInt16(data, ref currentIndex, false);

            // RDP_SERVER_REDIRECTION_PACKET: sessionId
            packet.SessionId = ParseUInt32(data, ref currentIndex, false);

            // RDP_SERVER_REDIRECTION_PACKET: redirFlags
            packet.RedirFlags = (RedirectionFlags)ParseUInt32(data, ref currentIndex, false);

            if ((packet.RedirFlags & RedirectionFlags.LB_TARGET_NET_ADDRESS) == RedirectionFlags.LB_TARGET_NET_ADDRESS)
            {
                // RDP_SERVER_REDIRECTION_PACKET: targetNetAddress
                packet.TargetNetAddressLength = ParseUInt32(data, ref currentIndex, false);
                packet.TargetNetAddress = GetBytes(data, ref currentIndex, (int)packet.TargetNetAddressLength);
            }

            if ((packet.RedirFlags & RedirectionFlags.LB_LOAD_BALANCE_INFO) == RedirectionFlags.LB_LOAD_BALANCE_INFO)
            {
                // RDP_SERVER_REDIRECTION_PACKET: loadBalanceInfo
                packet.LoadBalanceInfoLength = ParseUInt32(data, ref currentIndex, false);
                packet.LoadBalanceInfo = GetBytes(data, ref currentIndex, (int)packet.LoadBalanceInfoLength);
            }

            if ((packet.RedirFlags & RedirectionFlags.LB_USERNAME) == RedirectionFlags.LB_USERNAME)
            {
                // RDP_SERVER_REDIRECTION_PACKET: userName
                packet.UserNameLength = ParseUInt32(data, ref currentIndex, false);
                packet.UserName = GetBytes(data, ref currentIndex, (int)packet.UserNameLength);
            }

            if ((packet.RedirFlags & RedirectionFlags.LB_DOMAIN) == RedirectionFlags.LB_DOMAIN)
            {
                // RDP_SERVER_REDIRECTION_PACKET: domain
                packet.DomainLength = ParseUInt32(data, ref currentIndex, false);
                packet.Domain = GetBytes(data, ref currentIndex, (int)packet.DomainLength);
            }

            if ((packet.RedirFlags & RedirectionFlags.LB_PASSWORD) == RedirectionFlags.LB_PASSWORD)
            {
                // RDP_SERVER_REDIRECTION_PACKET: password
                packet.PasswordLength = ParseUInt32(data, ref currentIndex, false);
                packet.Password = GetBytes(data, ref currentIndex, (int)packet.PasswordLength);
            }

            if ((packet.RedirFlags & RedirectionFlags.LB_TARGET_FQDN) == RedirectionFlags.LB_TARGET_FQDN)
            {
                // RDP_SERVER_REDIRECTION_PACKET: targetFqdn
                packet.TargetFQDNLength = ParseUInt32(data, ref currentIndex, false);
                packet.TargetFQDN = GetBytes(data, ref currentIndex, (int)packet.TargetFQDNLength);
            }

            if ((packet.RedirFlags & RedirectionFlags.LB_TARGET_NETBIOS_NAME)
                == RedirectionFlags.LB_TARGET_NETBIOS_NAME)
            {
                // RDP_SERVER_REDIRECTION_PACKET: targetNetBiosName
                packet.TargetNetBiosNameLength = ParseUInt32(data, ref currentIndex, false);
                packet.TargetNetBiosName = GetBytes(data, ref currentIndex, (int)packet.TargetNetBiosNameLength);
            }

            if ((packet.RedirFlags & RedirectionFlags.LB_TARGET_NET_ADDRESSES)
                == RedirectionFlags.LB_TARGET_NET_ADDRESSES)
            {
                // RDP_SERVER_REDIRECTION_PACKET: targetNetAddresses
                packet.TargetNetAddressesLength = ParseUInt32(data, ref currentIndex, false);
                packet.TargetNetAddresses.addressCount = ParseUInt32(data, ref currentIndex, false);
                packet.TargetNetAddresses.address = new TARGET_NET_ADDRESS[packet.TargetNetAddresses.addressCount];
                for (int i = 0; i < packet.TargetNetAddresses.addressCount; ++i)
                {
                    packet.TargetNetAddresses.address[i].addressLength = ParseUInt32(data, ref currentIndex, false);
                    packet.TargetNetAddresses.address[i].address = GetBytes(data, ref currentIndex,
                        (int)packet.TargetNetAddresses.address[i].addressLength);
                }
            }

            // check if there's paddings
            int remainBytes = packet.Length - (currentIndex - startIndex);
            if (remainBytes > 0)
            {
                packet.Pad = GetBytes(data, ref currentIndex, remainBytes);
            }

            return packet;
        }
RdpbcgrDecoder