private static RdpPacket getLoginInfo(string domain, string username, string password, string command, string directory, bool bAutoReconnect) { int num = 2 * "127.0.0.1".Length; int num2 = 2 * @"C:\WINNT\System32\mstscax.dll".Length; int num1 = _p; int num3 = 2 * domain.Length; int num4 = 2 * username.Length; int num5 = 2 * password.Length; int num6 = 2 * command.Length; int num7 = 2 * directory.Length; RdpPacket packet = new RdpPacket(); int num8 = 0x213b; packet.WriteLittleEndian32(0); packet.WriteLittleEndian32(num8); packet.WriteLittleEndian16((short)num3); packet.WriteLittleEndian16((short)num4); if ((num8 & 8) != 0) { packet.WriteLittleEndian16((short)num5); } else { packet.WriteLittleEndian16((short)0); } packet.WriteLittleEndian16((short)num6); packet.WriteLittleEndian16((short)num7); if (0 < num3) { packet.WriteUnicodeString(domain); } else { packet.WriteLittleEndian16((short)0); } packet.WriteUnicodeString(username); if ((num8 & 8) != 0) { packet.WriteUnicodeString(password); } else { packet.WriteLittleEndian16((short)0); } if (0 < num6) { packet.WriteUnicodeString(command); } else { packet.WriteLittleEndian16((short)0); } if (0 < num7) { packet.WriteUnicodeString(directory); } else { packet.WriteLittleEndian16((short)0); } packet.WriteLittleEndian16((short)2); packet.WriteLittleEndian16((short)(num + 2)); packet.WriteUnicodeString("127.0.0.1"); packet.WriteLittleEndian16((short)(num2 + 2)); packet.WriteUnicodeString(@"C:\WINNT\System32\mstscax.dll"); TimeZoneInfo info = TimeZoneInfo.Local; packet.WriteLittleEndian32((int)info.BaseUtcOffset.TotalMinutes); packet.WriteUnicodeString(info.StandardName); packet.Position += 0x3e - (2 * info.StandardName.Length); if (info.SupportsDaylightSavingTime) { packet.WriteLittleEndian16((short)0); packet.WriteLittleEndian16((ushort)10); packet.WriteLittleEndian16((short)0); packet.WriteLittleEndian16((short)30); packet.WriteLittleEndian16((short)2); packet.WriteLittleEndian16((short)0); packet.WriteLittleEndian16((short)0); packet.WriteLittleEndian16((short)0); packet.WriteLittleEndian32(0); } else { packet.WriteLittleEndian16((short)0); packet.WriteLittleEndian16((short)0); packet.WriteLittleEndian16((short)0); packet.WriteLittleEndian16((short)0); packet.WriteLittleEndian16((short)0); packet.WriteLittleEndian16((short)0); packet.WriteLittleEndian16((short)0); packet.WriteLittleEndian16((short)0); packet.WriteLittleEndian32(0); } packet.WriteUnicodeString(info.DaylightName); packet.Position += 0x3e - (2 * info.DaylightName.Length); if (info.SupportsDaylightSavingTime) { packet.WriteLittleEndian16((short)0); packet.WriteLittleEndian16((ushort)3); packet.WriteLittleEndian16((short)0); packet.WriteLittleEndian16((short)0x1b); packet.WriteLittleEndian16((short)1); packet.WriteLittleEndian16((short)0); packet.WriteLittleEndian16((short)0); packet.WriteLittleEndian16((short)0); packet.WriteLittleEndian32((int)(info.BaseUtcOffset.TotalMinutes + 1.0)); } else { packet.WriteLittleEndian16((short)0); packet.WriteLittleEndian16((short)0); packet.WriteLittleEndian16((short)0); packet.WriteLittleEndian16((short)0); packet.WriteLittleEndian16((short)0); packet.WriteLittleEndian16((short)0); packet.WriteLittleEndian16((short)0); packet.WriteLittleEndian16((short)0); packet.WriteLittleEndian32(0); } packet.WriteLittleEndianU32(0); PerformanceFlags flags = (PerformanceFlags)0; if (!RDPClient.IsHostFlagSet(HostFlags.DesktopBackground)) { flags |= PerformanceFlags.PERF_DISABLE_WALLPAPER; } if (RDPClient.IsHostFlagSet(HostFlags.FontSmoothing)) { flags |= PerformanceFlags.PERF_ENABLE_FONT_SMOOTHING; } if (RDPClient.IsHostFlagSet(HostFlags.DesktopComposition)) { flags |= PerformanceFlags.PERF_ENABLE_DESKTOP_COMPOSITION; } if (!RDPClient.IsHostFlagSet(HostFlags.ShowWindowContents)) { flags |= PerformanceFlags.PERF_DISABLE_FULLWINDOWDRAG; } if (!RDPClient.IsHostFlagSet(HostFlags.MenuAnimation)) { flags |= PerformanceFlags.PERF_DISABLE_MENUANIMATIONS; } if (!RDPClient.IsHostFlagSet(HostFlags.VisualStyles)) { flags |= PerformanceFlags.PERF_DISABLE_THEMING; } packet.WriteLittleEndian32((int)flags); if (bAutoReconnect) { packet.WriteLittleEndian32(0x1c); packet.WriteLittleEndian32(0x1c); packet.WriteLittleEndian32(1); packet.WriteLittleEndian32(RDPClient.LogonID); HMACT64 hmact = new HMACT64(RDPClient.ReconnectCookie); hmact.update(Secure.GetClentRandom()); byte[] buffer = hmact.digest(); packet.Write(buffer, 0, buffer.Length); return(packet); } packet.WriteLittleEndian32(0); return(packet); }
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); }