/** * Construct MCS data, including channel, encryption and display options * * @return Packet populated with MCS data */ public RdpPacket_Localised sendMcsData() { logger.debug("Secure.sendMcsData"); RdpPacket_Localised buffer = new RdpPacket_Localised(512); int hostlen = 2 * (Options.hostname == null ? 0 : Options.hostname.length()); if (hostlen > 30) { hostlen = 30; } int length = 162 + 76 + 12 + 4; if (Options.use_rdp5 && (channels.num_channels() > 0)) length += channels.num_channels() * 12 + 8; buffer.setBigEndian16(5); /* unknown */ buffer.setBigEndian16(0x14); buffer.set8(0x7c); buffer.setBigEndian16(1); buffer.setBigEndian16(length | 0x8000); // remaining length buffer.setBigEndian16(8); // length? buffer.setBigEndian16(16); buffer.set8(0); buffer.setLittleEndian16(0xc001); buffer.set8(0); buffer.setLittleEndian32(0x61637544); // "Duca" ?! buffer.setBigEndian16(length - 14 | 0x8000); // remaining length // Client information buffer.setLittleEndian16(SEC_TAG_CLI_INFO); buffer.setLittleEndian16(216); // length buffer.setLittleEndian16(Options.use_rdp5 ? 4 : 1); buffer.setLittleEndian16(8); buffer.setLittleEndian16(Options.width); buffer.setLittleEndian16(Options.height); buffer.setLittleEndian16(0xca01); buffer.setLittleEndian16(0xaa03); buffer.setLittleEndian32(Options.keylayout); buffer.setLittleEndian32(2600); // or 0ece // // client // build? we // are 2600 // compatible // :-) /* Unicode name of client, padded to 32 bytes */ buffer.outUnicodeString(Options.hostname, hostlen); buffer.incrementPosition(30 - hostlen); buffer.setLittleEndian32(4); buffer.setLittleEndian32(0); buffer.setLittleEndian32(12); buffer.incrementPosition(64); /* reserved? 4 + 12 doublewords */ buffer.setLittleEndian16(0xca01); // out_uint16_le(s, 0xca01); buffer.setLittleEndian16(1); buffer.setLittleEndian32(0); // out_uint32(s, 0); buffer.set8(Options.server_bpp); // out_uint8(s, g_server_bpp); buffer.setLittleEndian16(0x0700); // out_uint16_le(s, 0x0700); buffer.set8(0); // out_uint8(s, 0); buffer.setLittleEndian32(1); // out_uint32_le(s, 1); buffer.incrementPosition(64); buffer.setLittleEndian32(0); // selected_protocol /* End of client info */ buffer.setLittleEndian16(SEC_TAG_CLI_4); // out_uint16_le(s, SEC_TAG_CLI_4); buffer.setLittleEndian16(12); // out_uint16_le(s, 12); int cluster_flags = 0; cluster_flags |= SEC_CC_REDIRECTION_SUPPORTED; cluster_flags |= (SEC_CC_REDIRECT_VERSION_3 << 2); if (Options.console_session) { cluster_flags |= SEC_CC_REDIRECT_SESSIONID_FIELD_VALID; } buffer.setLittleEndian32(cluster_flags); // out_uint32_le(s, buffer.setLittleEndian32(0); // redirect session id? // Client encryption settings // buffer.setLittleEndian16(SEC_TAG_CLI_CRYPT); buffer.setLittleEndian16(12); // length buffer.setLittleEndian32(Options.encryption ? 0x3 : 0); buffer.setLittleEndian32(0); // unknown if (Options.use_rdp5 && (channels.num_channels() > 0)) { logger.debug(("num_channels is " + channels.num_channels())); buffer.setLittleEndian16(SEC_TAG_CLI_CHANNELS); // out_uint16_le(s, // SEC_TAG_CLI_CHANNELS); buffer.setLittleEndian16(channels.num_channels() * 12 + 8); // out_uint16_le(s, buffer.setLittleEndian32(channels.num_channels()); // out_uint32_le(s, // g_num_channels); // // number of // virtual // channels for (int i = 0; i < channels.num_channels(); i++) { logger.debug(("Requesting channel " + channels.channel(i).name())); buffer.out_uint8p(channels.channel(i).name(), 8); // out_uint8a(s, // g_channels[i].name, // 8); buffer.setBigEndian32(channels.channel(i).flags()); // out_uint32_be(s, // g_channels[i].flags); } } buffer.markEnd(); return buffer; }