private static byte[] EncodeInfoData(TS_INFO_PACKET infoPacket)
{
List<byte> infoBuffer = new List<byte>();
if (infoPacket != null)
{
RdpbcgrEncoder.EncodeStructure(infoBuffer, infoPacket.CodePage);
RdpbcgrEncoder.EncodeStructure(infoBuffer, (uint)infoPacket.flags);
RdpbcgrEncoder.EncodeStructure(infoBuffer, infoPacket.cbDomain);
RdpbcgrEncoder.EncodeStructure(infoBuffer, infoPacket.cbUserName);
RdpbcgrEncoder.EncodeStructure(infoBuffer, infoPacket.cbPassword);
RdpbcgrEncoder.EncodeStructure(infoBuffer, infoPacket.cbAlternateShell);
RdpbcgrEncoder.EncodeStructure(infoBuffer, infoPacket.cbWorkingDir);
if ((infoPacket.flags & flags_Values.INFO_UNICODE) == flags_Values.INFO_UNICODE)
{
// +2 means add a null-terminator for a unicode string
RdpbcgrEncoder.EncodeUnicodeString(infoBuffer, infoPacket.Domain, (uint)(infoPacket.cbDomain + 2));
RdpbcgrEncoder.EncodeUnicodeString(infoBuffer,
infoPacket.UserName,
(uint)(infoPacket.cbUserName + 2));
RdpbcgrEncoder.EncodeUnicodeString(infoBuffer,
infoPacket.Password,
(uint)(infoPacket.cbPassword + 2));
RdpbcgrEncoder.EncodeUnicodeString(infoBuffer,
infoPacket.AlternateShell,
(uint)(infoPacket.cbAlternateShell + 2));
RdpbcgrEncoder.EncodeUnicodeString(infoBuffer,
infoPacket.WorkingDir,
(uint)(infoPacket.cbWorkingDir + 2));
}
else
{
// +1 means add a null-terminator for an ansi string
RdpbcgrEncoder.EncodeAnsiString(infoBuffer, infoPacket.Domain, (uint)(infoPacket.cbDomain + 1));
RdpbcgrEncoder.EncodeAnsiString(infoBuffer,
infoPacket.UserName,
(uint)(infoPacket.cbUserName + 1));
RdpbcgrEncoder.EncodeAnsiString(infoBuffer,
infoPacket.Password,
(uint)(infoPacket.cbPassword + 1));
RdpbcgrEncoder.EncodeAnsiString(infoBuffer,
infoPacket.AlternateShell,
(uint)(infoPacket.cbAlternateShell + 1));
RdpbcgrEncoder.EncodeAnsiString(infoBuffer,
infoPacket.WorkingDir,
(uint)(infoPacket.cbWorkingDir + 1));
}
if (infoPacket.extraInfo != null)
{
RdpbcgrEncoder.EncodeStructure(infoBuffer, (ushort)infoPacket.extraInfo.clientAddressFamily);
RdpbcgrEncoder.EncodeStructure(infoBuffer, infoPacket.extraInfo.cbClientAddress);
if ((infoPacket.flags & flags_Values.INFO_UNICODE) == flags_Values.INFO_UNICODE)
{
RdpbcgrEncoder.EncodeUnicodeString(infoBuffer,
infoPacket.extraInfo.clientAddress,
infoPacket.extraInfo.cbClientAddress);
}
else
{
RdpbcgrEncoder.EncodeAnsiString(infoBuffer,
infoPacket.extraInfo.clientAddress,
infoPacket.extraInfo.cbClientAddress);
}
RdpbcgrEncoder.EncodeStructure(infoBuffer, infoPacket.extraInfo.cbClientDir);
if ((infoPacket.flags & flags_Values.INFO_UNICODE) == flags_Values.INFO_UNICODE)
{
RdpbcgrEncoder.EncodeUnicodeString(infoBuffer,
infoPacket.extraInfo.clientDir,
infoPacket.extraInfo.cbClientDir);
}
else
{
RdpbcgrEncoder.EncodeAnsiString(infoBuffer,
infoPacket.extraInfo.clientDir,
infoPacket.extraInfo.cbClientDir);
}
RdpbcgrEncoder.EncodeStructure(infoBuffer, (ushort)infoPacket.extraInfo.clientTimeZone.Bias);
RdpbcgrEncoder.EncodeUnicodeString(infoBuffer,
infoPacket.extraInfo.clientTimeZone.StandardName,
ConstValue.TIME_ZONE_STANDARD_NAME_SIZE);
RdpbcgrEncoder.EncodeStructure(infoBuffer, infoPacket.extraInfo.clientTimeZone.StandardDate);
RdpbcgrEncoder.EncodeStructure(infoBuffer, infoPacket.extraInfo.clientTimeZone.StandardBias);
RdpbcgrEncoder.EncodeUnicodeString(infoBuffer,
infoPacket.extraInfo.clientTimeZone.DaylightName,
ConstValue.TIME_ZONE_DAYLIGHT_NAME_SIZE);
RdpbcgrEncoder.EncodeStructure(infoBuffer, infoPacket.extraInfo.clientTimeZone.DaylightDate);
RdpbcgrEncoder.EncodeStructure(infoBuffer, infoPacket.extraInfo.clientTimeZone.DaylightBias);
RdpbcgrEncoder.EncodeStructure(infoBuffer, infoPacket.extraInfo.clientSessionId);
RdpbcgrEncoder.EncodeStructure(infoBuffer, (uint)infoPacket.extraInfo.performanceFlags);
RdpbcgrEncoder.EncodeStructure(infoBuffer, infoPacket.extraInfo.cbAutoReconnectLen);
if (infoPacket.extraInfo.cbAutoReconnectLen != 0)
{
RdpbcgrEncoder.EncodeStructure(infoBuffer,
(uint)infoPacket.extraInfo.autoReconnectCookie.cbLen);
RdpbcgrEncoder.EncodeStructure(infoBuffer,
(uint)infoPacket.extraInfo.autoReconnectCookie.Version);
RdpbcgrEncoder.EncodeStructure(infoBuffer, infoPacket.extraInfo.autoReconnectCookie.LogonId);
RdpbcgrEncoder.EncodeBytes(infoBuffer,
infoPacket.extraInfo.autoReconnectCookie.SecurityVerifier); ;
}
if (infoPacket.extraInfo.reserved1 != null)
{
RdpbcgrEncoder.EncodeStructure(infoBuffer, infoPacket.extraInfo.reserved1.actualData);
}
if (infoPacket.extraInfo.reserved2 != null)
{
RdpbcgrEncoder.EncodeStructure(infoBuffer, infoPacket.extraInfo.reserved2.actualData);
}
if (infoPacket.extraInfo.cbDynamicDSTTimeZoneKeyName != null)
{
RdpbcgrEncoder.EncodeStructure(infoBuffer, infoPacket.extraInfo.cbDynamicDSTTimeZoneKeyName.actualData);
}
if (infoPacket.extraInfo.dynamicDSTTimeZoneKeyName != null)
{
RdpbcgrEncoder.EncodeUnicodeString(infoBuffer,
infoPacket.extraInfo.dynamicDSTTimeZoneKeyName,
infoPacket.extraInfo.cbDynamicDSTTimeZoneKeyName.actualData);
}
if (infoPacket.extraInfo.dynamicDaylightTimeDisabled != null)
{
RdpbcgrEncoder.EncodeStructure(infoBuffer, infoPacket.extraInfo.dynamicDaylightTimeDisabled.actualData);
}
}
}
return infoBuffer.ToArray();
}