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;
}