internal static RdpPacket sendMcsData(bool use_rdp5, int num_channels, int serverSelectedProtocol) { RdpPacket packet = new RdpPacket(); string clientName = RDPClient.ClientName; if (clientName.Length > 15) { clientName = clientName.Substring(0, 15); } int num = 2 * clientName.Length; int num2 = 0x9e; if (use_rdp5) { num2 += 0x60; } if (use_rdp5 && (num_channels > 0)) { num2 += (num_channels * 12) + 8; } if ((RDPClient.serverNegotiateFlags & NegotiationFlags.EXTENDED_CLIENT_DATA_SUPPORTED) != ((NegotiationFlags)0)) { num2 += 8; } packet.WriteBigEndian16((short)5); packet.WriteBigEndian16((short)20); packet.WriteByte(0x7c); packet.WriteBigEndian16((short)1); packet.WriteBigEndian16((short)(num2 | 0x8000)); packet.WriteBigEndian16((short)8); packet.WriteBigEndian16((short)0x10); packet.WriteByte(0); packet.WriteLittleEndian16((ushort)0xc001); packet.WriteByte(0); packet.WriteLittleEndian32(0x61637544); packet.WriteBigEndian16((short)((num2 - 14) | 0x8000)); packet.WriteLittleEndian16((ushort)0xc001); packet.WriteLittleEndian16(use_rdp5 ? ((short)0xd8) : ((short)0x88)); packet.WriteLittleEndian16(use_rdp5 ? ((short)4) : ((short)1)); packet.WriteLittleEndian16((short)8); packet.WriteLittleEndian16((short)RDPClient.width); packet.WriteLittleEndian16((short)RDPClient.height); packet.WriteLittleEndian16((ushort)0xca01); packet.WriteLittleEndian16((ushort)0xaa03); packet.WriteLittleEndian32(0x409); packet.WriteLittleEndian32(use_rdp5 ? 0xa28 : 0x1a3); packet.WriteUnicodeString(clientName); packet.Position += 30 - num; packet.WriteLittleEndian32(4); packet.WriteLittleEndian32(0); packet.WriteLittleEndian32(12); packet.Position += 0x40L; packet.WriteLittleEndian16((ushort)0xca01); packet.WriteLittleEndian16(use_rdp5 ? ((short)1) : ((short)0)); if (use_rdp5) { packet.WriteLittleEndian32(0); packet.WriteLittleEndian16((short)((byte)RDPClient.server_bpp)); packet.WriteLittleEndian16((short)7); packet.WriteLittleEndian16((short)1); packet.Position += 0x40L; packet.WriteByte(0); packet.WriteByte(0); packet.WriteLittleEndian32(serverSelectedProtocol); packet.WriteLittleEndian16((ushort)0xc004); packet.WriteLittleEndian16((short)12); int num3 = 13; if (((RDPClient.flags & HostFlags.ConsoleSession) != ((HostFlags)0)) || (RDPClient.sessionID != 0)) { num3 |= 2; } packet.WriteLittleEndian32(num3); packet.WriteLittleEndian32(RDPClient.sessionID); } packet.WriteLittleEndian16((ushort)0xc002); packet.WriteLittleEndian16(use_rdp5 ? ((short)12) : ((short)8)); int num4 = 0; if (serverSelectedProtocol == 0) { num4 |= 3; } packet.WriteLittleEndian32(num4); if (use_rdp5) { packet.WriteLittleEndian32(0); } if (use_rdp5 && (num_channels > 0)) { packet.WriteLittleEndian16((ushort)0xc003); packet.WriteLittleEndian16((short)((num_channels * 12) + 8)); packet.WriteLittleEndian32(num_channels); foreach (IVirtualChannel channel in Channels.RegisteredChannels) { packet.WriteString(channel.ChannelName, false); packet.WriteByte(0); packet.WriteBigEndian32((uint)0xc0a00000); } } if ((RDPClient.serverNegotiateFlags & NegotiationFlags.EXTENDED_CLIENT_DATA_SUPPORTED) != ((NegotiationFlags)0)) { packet.WriteLittleEndian16((ushort)0xc006); packet.WriteLittleEndian16((short)8); packet.WriteLittleEndian32(0); } return(packet); }