a180a41bba1d50822df23fff0099e90b86638b89vboxsync/* -*- c-basic-offset: 8 -*-
a180a41bba1d50822df23fff0099e90b86638b89vboxsync rdesktop: A Remote Desktop Protocol client.
a180a41bba1d50822df23fff0099e90b86638b89vboxsync Protocol services - RDP layer
a180a41bba1d50822df23fff0099e90b86638b89vboxsync Copyright (C) Matthew Chapman <matthewc.unsw.edu.au> 1999-2008
a180a41bba1d50822df23fff0099e90b86638b89vboxsync Copyright 2003-2011 Peter Astrand <astrand@cendio.se> for Cendio AB
a180a41bba1d50822df23fff0099e90b86638b89vboxsync Copyright 2011-2014 Henrik Andersson <hean01@cendio.se> for Cendio AB
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync This program is free software: you can redistribute it and/or modify
a180a41bba1d50822df23fff0099e90b86638b89vboxsync it under the terms of the GNU General Public License as published by
a180a41bba1d50822df23fff0099e90b86638b89vboxsync the Free Software Foundation, either version 3 of the License, or
a180a41bba1d50822df23fff0099e90b86638b89vboxsync (at your option) any later version.
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync This program is distributed in the hope that it will be useful,
a180a41bba1d50822df23fff0099e90b86638b89vboxsync but WITHOUT ANY WARRANTY; without even the implied warranty of
a180a41bba1d50822df23fff0099e90b86638b89vboxsync MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
a180a41bba1d50822df23fff0099e90b86638b89vboxsync GNU General Public License for more details.
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync You should have received a copy of the GNU General Public License
a180a41bba1d50822df23fff0099e90b86638b89vboxsync along with this program. If not, see <http://www.gnu.org/licenses/>.
a180a41bba1d50822df23fff0099e90b86638b89vboxsync*/
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
6e9aa255e3376b2da5824c09c4c62bc233463bfevboxsync/*
6e9aa255e3376b2da5824c09c4c62bc233463bfevboxsync * Oracle GPL Disclaimer: For the avoidance of doubt, except that if any license choice
6e9aa255e3376b2da5824c09c4c62bc233463bfevboxsync * other than GPL or LGPL is available it will apply instead, Oracle elects to use only
6e9aa255e3376b2da5824c09c4c62bc233463bfevboxsync * the General Public License version 2 (GPLv2) at this time for any software where
6e9aa255e3376b2da5824c09c4c62bc233463bfevboxsync * a choice of GPL license versions is made available with the language indicating
6e9aa255e3376b2da5824c09c4c62bc233463bfevboxsync * that GPLv2 or any later version may be used, or where a choice of which version
6e9aa255e3376b2da5824c09c4c62bc233463bfevboxsync * of the GPL is applied is otherwise unspecified.
6e9aa255e3376b2da5824c09c4c62bc233463bfevboxsync */
6e9aa255e3376b2da5824c09c4c62bc233463bfevboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#include <time.h>
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#ifndef _WIN32
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#include <errno.h>
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#include <unistd.h>
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#endif
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#include "rdesktop.h"
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#include "ssl.h"
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#ifdef HAVE_ICONV
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#ifdef HAVE_ICONV_H
6e9aa255e3376b2da5824c09c4c62bc233463bfevboxsync
6e9aa255e3376b2da5824c09c4c62bc233463bfevboxsync#if defined(RT_OS_SOLARIS) && !defined(_XPG6)
6e9aa255e3376b2da5824c09c4c62bc233463bfevboxsync# define VBOX_XPG6_TMP_DEF
6e9aa255e3376b2da5824c09c4c62bc233463bfevboxsync# define _XPG6
6e9aa255e3376b2da5824c09c4c62bc233463bfevboxsync#endif
6e9aa255e3376b2da5824c09c4c62bc233463bfevboxsync#if defined(RT_OS_SOLARIS) && defined(__USE_LEGACY_PROTOTYPES__)
6e9aa255e3376b2da5824c09c4c62bc233463bfevboxsync# define VBOX_LEGACY_PROTO_TMP_DEF
6e9aa255e3376b2da5824c09c4c62bc233463bfevboxsync# undef __USE_LEGACY_PROTOTYPES__
6e9aa255e3376b2da5824c09c4c62bc233463bfevboxsync#endif
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#include <iconv.h>
6e9aa255e3376b2da5824c09c4c62bc233463bfevboxsync#if defined(VBOX_XPG6_TMP_DEF)
6e9aa255e3376b2da5824c09c4c62bc233463bfevboxsync# undef _XPG6
6e9aa255e3376b2da5824c09c4c62bc233463bfevboxsync# undef VBOX_XPG6_TMP_DEF
6e9aa255e3376b2da5824c09c4c62bc233463bfevboxsync#endif
6e9aa255e3376b2da5824c09c4c62bc233463bfevboxsync#if defined(VBOX_LEGACY_PROTO_TMP_DEF)
6e9aa255e3376b2da5824c09c4c62bc233463bfevboxsync# define __USE_LEGACY_PROTOTYPES__
6e9aa255e3376b2da5824c09c4c62bc233463bfevboxsync# undef VBOX_LEGACY_PROTO_TMP_DEF
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#endif
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#ifndef ICONV_CONST
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#define ICONV_CONST ""
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#endif
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#endif
6e9aa255e3376b2da5824c09c4c62bc233463bfevboxsync#endif
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncextern uint16 g_mcs_userid;
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncextern char *g_username;
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncextern char g_password[64];
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncextern char g_codepage[16];
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncextern RD_BOOL g_bitmap_compression;
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncextern RD_BOOL g_orders;
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncextern RD_BOOL g_encryption;
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncextern RD_BOOL g_desktop_save;
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncextern RD_BOOL g_polygon_ellipse_orders;
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncextern RDP_VERSION g_rdp_version;
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncextern uint16 g_server_rdp_version;
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncextern uint32 g_rdp5_performanceflags;
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncextern int g_server_depth;
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncextern int g_width;
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncextern int g_height;
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncextern RD_BOOL g_bitmap_cache;
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncextern RD_BOOL g_bitmap_cache_persist_enable;
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncextern RD_BOOL g_numlock_sync;
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncextern RD_BOOL g_pending_resize;
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncextern RD_BOOL g_network_error;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncuint8 *g_next_packet;
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncuint32 g_rdp_shareid;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncextern RDPCOMP g_mppc_dict;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync/* Session Directory support */
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncextern RD_BOOL g_redirect;
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncextern char *g_redirect_server;
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncextern uint32 g_redirect_server_len;
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncextern char *g_redirect_domain;
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncextern uint32 g_redirect_domain_len;
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncextern char *g_redirect_username;
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncextern uint32 g_redirect_username_len;
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncextern uint8 *g_redirect_lb_info;
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncextern uint32 g_redirect_lb_info_len;
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncextern uint8 *g_redirect_cookie;
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncextern uint32 g_redirect_cookie_len;
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncextern uint32 g_redirect_flags;
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncextern uint32 g_redirect_session_id;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync/* END Session Directory support */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncextern uint32 g_reconnect_logonid;
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncextern char g_reconnect_random[16];
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncextern time_t g_reconnect_random_ts;
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncextern RD_BOOL g_has_reconnect_random;
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncextern uint8 g_client_random[SEC_RANDOM_SIZE];
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#if WITH_DEBUG
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncstatic uint32 g_packetno;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#endif
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#ifdef HAVE_ICONV
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncstatic RD_BOOL g_iconv_works = True;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#endif
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync/* Receive an RDP packet */
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncstatic STREAM
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncrdp_recv(uint8 * type)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync{
a180a41bba1d50822df23fff0099e90b86638b89vboxsync static STREAM rdp_s;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync uint16 length, pdu_type;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync uint8 rdpver;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync if ((rdp_s == NULL) || (g_next_packet >= rdp_s->end) || (g_next_packet == NULL))
a180a41bba1d50822df23fff0099e90b86638b89vboxsync {
a180a41bba1d50822df23fff0099e90b86638b89vboxsync rdp_s = sec_recv(&rdpver);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync if (rdp_s == NULL)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync return NULL;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync if (rdpver == 0xff)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync {
a180a41bba1d50822df23fff0099e90b86638b89vboxsync g_next_packet = rdp_s->end;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync *type = 0;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync return rdp_s;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync }
a180a41bba1d50822df23fff0099e90b86638b89vboxsync else if (rdpver != 3)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync {
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* rdp5_process should move g_next_packet ok */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync rdp5_process(rdp_s);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync *type = 0;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync return rdp_s;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync }
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync g_next_packet = rdp_s->p;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync }
a180a41bba1d50822df23fff0099e90b86638b89vboxsync else
a180a41bba1d50822df23fff0099e90b86638b89vboxsync {
a180a41bba1d50822df23fff0099e90b86638b89vboxsync rdp_s->p = g_next_packet;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync }
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync in_uint16_le(rdp_s, length);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* 32k packets are really 8, keepalive fix */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync if (length == 0x8000)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync {
a180a41bba1d50822df23fff0099e90b86638b89vboxsync g_next_packet += 8;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync *type = 0;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync return rdp_s;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync }
a180a41bba1d50822df23fff0099e90b86638b89vboxsync in_uint16_le(rdp_s, pdu_type);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync in_uint8s(rdp_s, 2); /* userid */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync *type = pdu_type & 0xf;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#if WITH_DEBUG
a180a41bba1d50822df23fff0099e90b86638b89vboxsync DEBUG(("RDP packet #%d, (type %x)\n", ++g_packetno, *type));
a180a41bba1d50822df23fff0099e90b86638b89vboxsync hexdump(g_next_packet, length);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#endif /* */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync g_next_packet += length;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync return rdp_s;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync}
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync/* Initialise an RDP data packet */
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncstatic STREAM
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncrdp_init_data(int maxlen)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync{
a180a41bba1d50822df23fff0099e90b86638b89vboxsync STREAM s;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync s = sec_init(g_encryption ? SEC_ENCRYPT : 0, maxlen + 18);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync s_push_layer(s, rdp_hdr, 18);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync return s;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync}
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync/* Send an RDP data packet */
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncstatic void
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncrdp_send_data(STREAM s, uint8 data_pdu_type)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync{
a180a41bba1d50822df23fff0099e90b86638b89vboxsync uint16 length;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync s_pop_layer(s, rdp_hdr);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync length = s->end - s->p;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, length);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, (RDP_PDU_DATA | 0x10));
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, (g_mcs_userid + 1001));
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint32_le(s, g_rdp_shareid);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint8(s, 0); /* pad */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint8(s, 1); /* streamid */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, (length - 14));
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint8(s, data_pdu_type);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint8(s, 0); /* compress_type */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16(s, 0); /* compress_len */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync sec_send(s, g_encryption ? SEC_ENCRYPT : 0);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync}
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync/* Output a string in Unicode */
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncvoid
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncrdp_out_unistr(STREAM s, char *string, int len)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync{
a180a41bba1d50822df23fff0099e90b86638b89vboxsync if (string == NULL || len == 0)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync return;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#ifdef HAVE_ICONV
a180a41bba1d50822df23fff0099e90b86638b89vboxsync size_t ibl = strlen(string), obl = len + 2;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync static iconv_t iconv_h = (iconv_t) - 1;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync char *pin = string, *pout = (char *) s->p;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync memset(pout, 0, len + 4);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync if (g_iconv_works)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync {
a180a41bba1d50822df23fff0099e90b86638b89vboxsync if (iconv_h == (iconv_t) - 1)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync {
a180a41bba1d50822df23fff0099e90b86638b89vboxsync size_t i = 1, o = 4;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync if ((iconv_h = iconv_open(WINDOWS_CODEPAGE, g_codepage)) == (iconv_t) - 1)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync {
a180a41bba1d50822df23fff0099e90b86638b89vboxsync warning("rdp_out_unistr: iconv_open[%s -> %s] fail %p\n",
a180a41bba1d50822df23fff0099e90b86638b89vboxsync g_codepage, WINDOWS_CODEPAGE, iconv_h);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync g_iconv_works = False;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync rdp_out_unistr(s, string, len);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync return;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync }
a180a41bba1d50822df23fff0099e90b86638b89vboxsync if (iconv(iconv_h, (ICONV_CONST char **) &pin, &i, &pout, &o) ==
a180a41bba1d50822df23fff0099e90b86638b89vboxsync (size_t) - 1)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync {
a180a41bba1d50822df23fff0099e90b86638b89vboxsync iconv_close(iconv_h);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync iconv_h = (iconv_t) - 1;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync warning("rdp_out_unistr: iconv(1) fail, errno %d\n", errno);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync g_iconv_works = False;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync rdp_out_unistr(s, string, len);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync return;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync }
a180a41bba1d50822df23fff0099e90b86638b89vboxsync pin = string;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync pout = (char *) s->p;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync }
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync if (iconv(iconv_h, (ICONV_CONST char **) &pin, &ibl, &pout, &obl) == (size_t) - 1)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync {
a180a41bba1d50822df23fff0099e90b86638b89vboxsync iconv_close(iconv_h);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync iconv_h = (iconv_t) - 1;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync warning("rdp_out_unistr: iconv(2) fail, errno %d\n", errno);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync g_iconv_works = False;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync rdp_out_unistr(s, string, len);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync return;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync }
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync s->p += len + 2;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync }
a180a41bba1d50822df23fff0099e90b86638b89vboxsync else
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#endif
a180a41bba1d50822df23fff0099e90b86638b89vboxsync {
a180a41bba1d50822df23fff0099e90b86638b89vboxsync int i = 0, j = 0;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync len += 2;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync while (i < len)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync {
a180a41bba1d50822df23fff0099e90b86638b89vboxsync s->p[i++] = string[j++];
a180a41bba1d50822df23fff0099e90b86638b89vboxsync s->p[i++] = 0;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync }
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync s->p += len;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync }
a180a41bba1d50822df23fff0099e90b86638b89vboxsync}
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync/* Input a string in Unicode
a180a41bba1d50822df23fff0099e90b86638b89vboxsync *
a180a41bba1d50822df23fff0099e90b86638b89vboxsync * Returns str_len of string
a180a41bba1d50822df23fff0099e90b86638b89vboxsync */
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncvoid
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncrdp_in_unistr(STREAM s, int in_len, char **string, uint32 * str_size)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync{
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* Dynamic allocate of destination string if not provided */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync *string = xmalloc(in_len * 2);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync *str_size = in_len * 2;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#ifdef HAVE_ICONV
a180a41bba1d50822df23fff0099e90b86638b89vboxsync size_t ibl = in_len, obl = *str_size - 1;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync char *pin = (char *) s->p, *pout = *string;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync static iconv_t iconv_h = (iconv_t) - 1;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync if (g_iconv_works)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync {
a180a41bba1d50822df23fff0099e90b86638b89vboxsync if (iconv_h == (iconv_t) - 1)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync {
a180a41bba1d50822df23fff0099e90b86638b89vboxsync if ((iconv_h = iconv_open(g_codepage, WINDOWS_CODEPAGE)) == (iconv_t) - 1)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync {
a180a41bba1d50822df23fff0099e90b86638b89vboxsync warning("rdp_in_unistr: iconv_open[%s -> %s] fail %p\n",
a180a41bba1d50822df23fff0099e90b86638b89vboxsync WINDOWS_CODEPAGE, g_codepage, iconv_h);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync g_iconv_works = False;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync return rdp_in_unistr(s, in_len, string, str_size);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync }
a180a41bba1d50822df23fff0099e90b86638b89vboxsync }
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync if (iconv(iconv_h, (ICONV_CONST char **) &pin, &ibl, &pout, &obl) == (size_t) - 1)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync {
a180a41bba1d50822df23fff0099e90b86638b89vboxsync if (errno == E2BIG)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync {
a180a41bba1d50822df23fff0099e90b86638b89vboxsync warning("server sent an unexpectedly long string, truncating\n");
a180a41bba1d50822df23fff0099e90b86638b89vboxsync }
a180a41bba1d50822df23fff0099e90b86638b89vboxsync else
a180a41bba1d50822df23fff0099e90b86638b89vboxsync {
a180a41bba1d50822df23fff0099e90b86638b89vboxsync warning("rdp_in_unistr: iconv fail, errno %d\n", errno);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync free(*string);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync *string = NULL;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync *str_size = 0;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync }
a180a41bba1d50822df23fff0099e90b86638b89vboxsync }
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* we must update the location of the current STREAM for future reads of s->p */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync s->p += in_len;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync *pout = 0;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync if (*string)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync *str_size = pout - *string;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync }
a180a41bba1d50822df23fff0099e90b86638b89vboxsync else
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#endif
a180a41bba1d50822df23fff0099e90b86638b89vboxsync {
a180a41bba1d50822df23fff0099e90b86638b89vboxsync int i = 0;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync int rem = 0;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync uint32 len = in_len / 2;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync if (len > *str_size - 1)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync {
a180a41bba1d50822df23fff0099e90b86638b89vboxsync warning("server sent an unexpectedly long string, truncating\n");
a180a41bba1d50822df23fff0099e90b86638b89vboxsync len = *str_size - 1;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync rem = in_len - 2 * len;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync }
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync while (i < len)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync {
a180a41bba1d50822df23fff0099e90b86638b89vboxsync in_uint8a(s, &string[i++], 1);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync in_uint8s(s, 1);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync }
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync in_uint8s(s, rem);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync string[len] = 0;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync *str_size = len;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync }
a180a41bba1d50822df23fff0099e90b86638b89vboxsync}
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync/* Parse a logon info packet */
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncstatic void
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncrdp_send_logon_info(uint32 flags, char *domain, char *user,
a180a41bba1d50822df23fff0099e90b86638b89vboxsync char *password, char *program, char *directory)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync{
a180a41bba1d50822df23fff0099e90b86638b89vboxsync char *ipaddr = tcp_get_address();
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* length of string in TS_INFO_PACKET excludes null terminator */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync int len_domain = 2 * strlen(domain);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync int len_user = 2 * strlen(user);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync int len_password = 2 * strlen(password);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync int len_program = 2 * strlen(program);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync int len_directory = 2 * strlen(directory);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* length of strings in TS_EXTENDED_PACKET includes null terminator */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync int len_ip = 2 * strlen(ipaddr) + 2;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync int len_dll = 2 * strlen("C:\\WINNT\\System32\\mstscax.dll") + 2;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync int packetlen = 0;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync uint32 sec_flags = g_encryption ? (SEC_LOGON_INFO | SEC_ENCRYPT) : SEC_LOGON_INFO;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync STREAM s;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync time_t t = time(NULL);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync time_t tzone;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync uint8 security_verifier[16];
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync if (g_rdp_version == RDP_V4 || 1 == g_server_rdp_version)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync {
a180a41bba1d50822df23fff0099e90b86638b89vboxsync DEBUG_RDP5(("Sending RDP4-style Logon packet\n"));
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync s = sec_init(sec_flags, 18 + len_domain + len_user + len_password
a180a41bba1d50822df23fff0099e90b86638b89vboxsync + len_program + len_directory + 10);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint32(s, 0);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint32_le(s, flags);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, len_domain);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, len_user);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, len_password);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, len_program);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, len_directory);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync rdp_out_unistr(s, domain, len_domain);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync rdp_out_unistr(s, user, len_user);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync rdp_out_unistr(s, password, len_password);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync rdp_out_unistr(s, program, len_program);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync rdp_out_unistr(s, directory, len_directory);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync }
a180a41bba1d50822df23fff0099e90b86638b89vboxsync else
a180a41bba1d50822df23fff0099e90b86638b89vboxsync {
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync DEBUG_RDP5(("Sending RDP5-style Logon packet\n"));
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync if (g_redirect == True && g_redirect_cookie_len > 0)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync {
a180a41bba1d50822df23fff0099e90b86638b89vboxsync len_password = g_redirect_cookie_len;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync len_password -= 2; /* substract 2 bytes which is added below */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync }
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync packetlen =
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* size of TS_INFO_PACKET */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync 4 + /* CodePage */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync 4 + /* flags */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync 2 + /* cbDomain */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync 2 + /* cbUserName */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync 2 + /* cbPassword */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync 2 + /* cbAlternateShell */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync 2 + /* cbWorkingDir */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync 2 + len_domain + /* Domain */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync 2 + len_user + /* UserName */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync 2 + len_password + /* Password */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync 2 + len_program + /* AlternateShell */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync 2 + len_directory + /* WorkingDir */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* size of TS_EXTENDED_INFO_PACKET */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync 2 + /* clientAdressFamily */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync 2 + /* cbClientAdress */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync len_ip + /* clientAddress */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync 2 + /* cbClientDir */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync len_dll + /* clientDir */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* size of TS_TIME_ZONE_INFORMATION */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync 4 + /* Bias, (UTC = local time + bias */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync 64 + /* StandardName, 32 unicode char array, Descriptive standard time on client */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync 16 + /* StandardDate */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync 4 + /* StandardBias */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync 64 + /* DaylightName, 32 unicode char array */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync 16 + /* DaylightDate */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync 4 + /* DaylightBias */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync 4 + /* clientSessionId */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync 4 + /* performanceFlags */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync 2 + /* cbAutoReconnectCookie, either 0 or 0x001c */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* size of ARC_CS_PRIVATE_PACKET */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync 28; /* autoReconnectCookie */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync s = sec_init(sec_flags, packetlen);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync DEBUG_RDP5(("Called sec_init with packetlen %d\n", packetlen));
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* TS_INFO_PACKET */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint32(s, 0); /* Code Page */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint32_le(s, flags);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, len_domain);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, len_user);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, len_password);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, len_program);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, len_directory);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync if (0 < len_domain)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync rdp_out_unistr(s, domain, len_domain);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync else
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, 0); /* mandatory 2 bytes null terminator */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync if (0 < len_user)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync rdp_out_unistr(s, user, len_user);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync else
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, 0); /* mandatory 2 bytes null terminator */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync if (0 < len_password)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync {
a180a41bba1d50822df23fff0099e90b86638b89vboxsync if (g_redirect == True && 0 < g_redirect_cookie_len)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync {
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint8p(s, g_redirect_cookie, g_redirect_cookie_len);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync }
a180a41bba1d50822df23fff0099e90b86638b89vboxsync else
a180a41bba1d50822df23fff0099e90b86638b89vboxsync {
a180a41bba1d50822df23fff0099e90b86638b89vboxsync rdp_out_unistr(s, password, len_password);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync }
a180a41bba1d50822df23fff0099e90b86638b89vboxsync }
a180a41bba1d50822df23fff0099e90b86638b89vboxsync else
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, 0); /* mandatory 2 bytes null terminator */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync if (0 < len_program)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync rdp_out_unistr(s, program, len_program);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync else
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, 0); /* mandatory 2 bytes null terminator */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync if (0 < len_directory)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync rdp_out_unistr(s, directory, len_directory);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync else
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, 0); /* mandatory 2 bytes null terminator */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* TS_EXTENDED_INFO_PACKET */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, 2); /* clientAddressFamily = AF_INET */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, len_ip); /* cbClientAddress, Length of client ip */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync rdp_out_unistr(s, ipaddr, len_ip - 2); /* clientAddress */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, len_dll); /* cbClientDir */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync rdp_out_unistr(s, "C:\\WINNT\\System32\\mstscax.dll", len_dll - 2); /* clientDir */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* TS_TIME_ZONE_INFORMATION */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync tzone = (mktime(gmtime(&t)) - mktime(localtime(&t))) / 60;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint32_le(s, tzone);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync rdp_out_unistr(s, "GTB, normaltid", 2 * strlen("GTB, normaltid"));
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint8s(s, 62 - 2 * strlen("GTB, normaltid"));
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint32_le(s, 0x0a0000);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint32_le(s, 0x050000);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint32_le(s, 3);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint32_le(s, 0);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint32_le(s, 0);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync rdp_out_unistr(s, "GTB, sommartid", 2 * strlen("GTB, sommartid"));
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint8s(s, 62 - 2 * strlen("GTB, sommartid"));
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint32_le(s, 0x30000);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint32_le(s, 0x050000);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint32_le(s, 2);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint32(s, 0);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint32_le(s, 0xffffffc4); /* DaylightBias */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* Rest of TS_EXTENDED_INFO_PACKET */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint32_le(s, 0); /* clientSessionId (Ignored by server MUST be 0) */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint32_le(s, g_rdp5_performanceflags);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* Client Auto-Reconnect */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync if (g_has_reconnect_random)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync {
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, 28); /* cbAutoReconnectLen */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* ARC_CS_PRIVATE_PACKET */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint32_le(s, 28); /* cbLen */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint32_le(s, 1); /* Version */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint32_le(s, g_reconnect_logonid); /* LogonId */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync rdssl_hmac_md5(g_reconnect_random, sizeof(g_reconnect_random),
a180a41bba1d50822df23fff0099e90b86638b89vboxsync g_client_random, SEC_RANDOM_SIZE, security_verifier);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint8a(s, security_verifier, sizeof(security_verifier));
a180a41bba1d50822df23fff0099e90b86638b89vboxsync }
a180a41bba1d50822df23fff0099e90b86638b89vboxsync else
a180a41bba1d50822df23fff0099e90b86638b89vboxsync {
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, 0); /* cbAutoReconnectLen */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync }
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync }
a180a41bba1d50822df23fff0099e90b86638b89vboxsync s_mark_end(s);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* clear the redirect flag */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync g_redirect = False;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync sec_send(s, sec_flags);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync}
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync/* Send a control PDU */
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncstatic void
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncrdp_send_control(uint16 action)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync{
a180a41bba1d50822df23fff0099e90b86638b89vboxsync STREAM s;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync s = rdp_init_data(8);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, action);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16(s, 0); /* userid */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint32(s, 0); /* control id */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync s_mark_end(s);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync rdp_send_data(s, RDP_DATA_PDU_CONTROL);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync}
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync/* Send a synchronisation PDU */
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncstatic void
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncrdp_send_synchronise(void)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync{
a180a41bba1d50822df23fff0099e90b86638b89vboxsync STREAM s;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync s = rdp_init_data(4);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, 1); /* type */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, 1002);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync s_mark_end(s);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync rdp_send_data(s, RDP_DATA_PDU_SYNCHRONISE);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync}
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync/* Send a single input event */
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncvoid
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncrdp_send_input(uint32 time, uint16 message_type, uint16 device_flags, uint16 param1, uint16 param2)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync{
a180a41bba1d50822df23fff0099e90b86638b89vboxsync STREAM s;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync s = rdp_init_data(16);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, 1); /* number of events */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16(s, 0); /* pad */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint32_le(s, time);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, message_type);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, device_flags);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, param1);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, param2);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync s_mark_end(s);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync rdp_send_data(s, RDP_DATA_PDU_INPUT);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync}
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync/* Send a client window information PDU */
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncvoid
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncrdp_send_client_window_status(int status)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync{
a180a41bba1d50822df23fff0099e90b86638b89vboxsync STREAM s;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync static int current_status = 1;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync if (current_status == status)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync return;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync s = rdp_init_data(12);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint32_le(s, status);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync switch (status)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync {
a180a41bba1d50822df23fff0099e90b86638b89vboxsync case 0: /* shut the server up */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync break;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync case 1: /* receive data again */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint32_le(s, 0); /* unknown */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, g_width);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, g_height);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync break;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync }
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync s_mark_end(s);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync rdp_send_data(s, RDP_DATA_PDU_CLIENT_WINDOW_STATUS);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync current_status = status;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync}
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync/* Send persistent bitmap cache enumeration PDU's */
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncstatic void
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncrdp_enum_bmpcache2(void)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync{
a180a41bba1d50822df23fff0099e90b86638b89vboxsync STREAM s;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync HASH_KEY keylist[BMPCACHE2_NUM_PSTCELLS];
a180a41bba1d50822df23fff0099e90b86638b89vboxsync uint32 num_keys, offset, count, flags;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync offset = 0;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync num_keys = pstcache_enumerate(2, keylist);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync while (offset < num_keys)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync {
a180a41bba1d50822df23fff0099e90b86638b89vboxsync count = MIN(num_keys - offset, 169);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync s = rdp_init_data(24 + count * sizeof(HASH_KEY));
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync flags = 0;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync if (offset == 0)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync flags |= PDU_FLAG_FIRST;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync if (num_keys - offset <= 169)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync flags |= PDU_FLAG_LAST;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* header */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint32_le(s, 0);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, count);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, 0);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, 0);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, 0);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, 0);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, num_keys);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint32_le(s, 0);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint32_le(s, flags);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* list */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint8a(s, keylist[offset], count * sizeof(HASH_KEY));
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync s_mark_end(s);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync rdp_send_data(s, 0x2b);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync offset += 169;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync }
a180a41bba1d50822df23fff0099e90b86638b89vboxsync}
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync/* Send an (empty) font information PDU */
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncstatic void
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncrdp_send_fonts(uint16 seq)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync{
a180a41bba1d50822df23fff0099e90b86638b89vboxsync STREAM s;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync s = rdp_init_data(8);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16(s, 0); /* number of fonts */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, 0); /* pad? */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, seq); /* unknown */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, 0x32); /* entry size */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync s_mark_end(s);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync rdp_send_data(s, RDP_DATA_PDU_FONT2);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync}
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync/* Output general capability set */
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncstatic void
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncrdp_out_general_caps(STREAM s)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync{
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, RDP_CAPSET_GENERAL);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, RDP_CAPLEN_GENERAL);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, 1); /* OS major type */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, 3); /* OS minor type */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, 0x200); /* Protocol version */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16(s, 0); /* Pad */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16(s, 0); /* Compression types */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, (g_rdp_version >= RDP_V5) ? 0x40d : 0);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* Pad, according to T.128. 0x40d seems to
a180a41bba1d50822df23fff0099e90b86638b89vboxsync trigger
a180a41bba1d50822df23fff0099e90b86638b89vboxsync the server to start sending RDP5 packets.
a180a41bba1d50822df23fff0099e90b86638b89vboxsync However, the value is 0x1d04 with W2KTSK and
a180a41bba1d50822df23fff0099e90b86638b89vboxsync NT4MS. Hmm.. Anyway, thankyou, Microsoft,
a180a41bba1d50822df23fff0099e90b86638b89vboxsync for sending such information in a padding
a180a41bba1d50822df23fff0099e90b86638b89vboxsync field.. */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16(s, 0); /* Update capability */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16(s, 0); /* Remote unshare capability */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16(s, 0); /* Compression level */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16(s, 0); /* Pad */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync}
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync/* Output bitmap capability set */
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncstatic void
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncrdp_out_bitmap_caps(STREAM s)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync{
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, RDP_CAPSET_BITMAP);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, RDP_CAPLEN_BITMAP);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, g_server_depth); /* Preferred colour depth */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, 1); /* Receive 1 BPP */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, 1); /* Receive 4 BPP */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, 1); /* Receive 8 BPP */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, 800); /* Desktop width */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, 600); /* Desktop height */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16(s, 0); /* Pad */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16(s, 1); /* Allow resize */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, g_bitmap_compression ? 1 : 0); /* Support compression */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16(s, 0); /* Unknown */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, 1); /* Unknown */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16(s, 0); /* Pad */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync}
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync/* Output order capability set */
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncstatic void
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncrdp_out_order_caps(STREAM s)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync{
a180a41bba1d50822df23fff0099e90b86638b89vboxsync uint8 order_caps[32];
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync memset(order_caps, 0, 32);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync order_caps[0] = 1; /* dest blt */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync order_caps[1] = 1; /* pat blt */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync order_caps[2] = 1; /* screen blt */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync order_caps[3] = (g_bitmap_cache ? 1 : 0); /* memblt */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync order_caps[4] = 0; /* triblt */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync order_caps[8] = 1; /* line */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync order_caps[9] = 1; /* line */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync order_caps[10] = 1; /* rect */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync order_caps[11] = (g_desktop_save ? 1 : 0); /* desksave */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync order_caps[13] = 1; /* memblt */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync order_caps[14] = 1; /* triblt */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync order_caps[20] = (g_polygon_ellipse_orders ? 1 : 0); /* polygon */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync order_caps[21] = (g_polygon_ellipse_orders ? 1 : 0); /* polygon2 */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync order_caps[22] = 1; /* polyline */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync order_caps[25] = (g_polygon_ellipse_orders ? 1 : 0); /* ellipse */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync order_caps[26] = (g_polygon_ellipse_orders ? 1 : 0); /* ellipse2 */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync order_caps[27] = 1; /* text2 */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, RDP_CAPSET_ORDER);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, RDP_CAPLEN_ORDER);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint8s(s, 20); /* Terminal desc, pad */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, 1); /* Cache X granularity */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, 20); /* Cache Y granularity */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16(s, 0); /* Pad */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, 1); /* Max order level */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, 0x147); /* Number of fonts */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, 0x2a); /* Capability flags */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint8p(s, order_caps, 32); /* Orders supported */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, 0x6a1); /* Text capability flags */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint8s(s, 6); /* Pad */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint32_le(s, g_desktop_save == False ? 0 : 0x38400); /* Desktop cache size */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint32(s, 0); /* Unknown */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint32_le(s, 0x4e4); /* Unknown */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync}
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync/* Output bitmap cache capability set */
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncstatic void
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncrdp_out_bmpcache_caps(STREAM s)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync{
a180a41bba1d50822df23fff0099e90b86638b89vboxsync int Bpp;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, RDP_CAPSET_BMPCACHE);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, RDP_CAPLEN_BMPCACHE);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync Bpp = (g_server_depth + 7) / 8; /* bytes per pixel */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint8s(s, 24); /* unused */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, 0x258); /* entries */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, 0x100 * Bpp); /* max cell size */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, 0x12c); /* entries */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, 0x400 * Bpp); /* max cell size */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, 0x106); /* entries */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, 0x1000 * Bpp); /* max cell size */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync}
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync/* Output bitmap cache v2 capability set */
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncstatic void
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncrdp_out_bmpcache2_caps(STREAM s)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync{
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, RDP_CAPSET_BMPCACHE2);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, RDP_CAPLEN_BMPCACHE2);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, g_bitmap_cache_persist_enable ? 2 : 0); /* version */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_be(s, 3); /* number of caches in this set */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* max cell size for cache 0 is 16x16, 1 = 32x32, 2 = 64x64, etc */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint32_le(s, BMPCACHE2_C0_CELLS);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint32_le(s, BMPCACHE2_C1_CELLS);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync if (pstcache_init(2))
a180a41bba1d50822df23fff0099e90b86638b89vboxsync {
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint32_le(s, BMPCACHE2_NUM_PSTCELLS | BMPCACHE2_FLAG_PERSIST);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync }
a180a41bba1d50822df23fff0099e90b86638b89vboxsync else
a180a41bba1d50822df23fff0099e90b86638b89vboxsync {
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint32_le(s, BMPCACHE2_C2_CELLS);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync }
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint8s(s, 20); /* other bitmap caches not used */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync}
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync/* Output control capability set */
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncstatic void
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncrdp_out_control_caps(STREAM s)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync{
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, RDP_CAPSET_CONTROL);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, RDP_CAPLEN_CONTROL);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16(s, 0); /* Control capabilities */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16(s, 0); /* Remote detach */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, 2); /* Control interest */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, 2); /* Detach interest */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync}
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync/* Output activation capability set */
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncstatic void
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncrdp_out_activate_caps(STREAM s)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync{
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, RDP_CAPSET_ACTIVATE);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, RDP_CAPLEN_ACTIVATE);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16(s, 0); /* Help key */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16(s, 0); /* Help index key */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16(s, 0); /* Extended help key */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16(s, 0); /* Window activate */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync}
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync/* Output pointer capability set */
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncstatic void
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncrdp_out_pointer_caps(STREAM s)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync{
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, RDP_CAPSET_POINTER);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, RDP_CAPLEN_POINTER);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16(s, 0); /* Colour pointer */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, 20); /* Cache size */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync}
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
6e9aa255e3376b2da5824c09c4c62bc233463bfevboxsync#ifndef VBOX
a180a41bba1d50822df23fff0099e90b86638b89vboxsync/* Output new pointer capability set */
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncstatic void
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncrdp_out_newpointer_caps(STREAM s)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync{
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, RDP_CAPSET_POINTER);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, RDP_CAPLEN_NEWPOINTER);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, 1); /* Colour pointer */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, 20); /* Cache size */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, 20); /* Cache size for new pointers */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync}
6e9aa255e3376b2da5824c09c4c62bc233463bfevboxsync#endif
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync/* Output share capability set */
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncstatic void
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncrdp_out_share_caps(STREAM s)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync{
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, RDP_CAPSET_SHARE);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, RDP_CAPLEN_SHARE);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16(s, 0); /* userid */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16(s, 0); /* pad */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync}
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync/* Output colour cache capability set */
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncstatic void
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncrdp_out_colcache_caps(STREAM s)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync{
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, RDP_CAPSET_COLCACHE);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, RDP_CAPLEN_COLCACHE);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, 6); /* cache size */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16(s, 0); /* pad */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync}
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync/* Output brush cache capability set */
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncstatic void
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncrdp_out_brushcache_caps(STREAM s)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync{
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, RDP_CAPSET_BRUSHCACHE);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, RDP_CAPLEN_BRUSHCACHE);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint32_le(s, 1); /* cache type */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync}
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncstatic uint8 caps_0x0d[] = {
a180a41bba1d50822df23fff0099e90b86638b89vboxsync 0x01, 0x00, 0x00, 0x00, 0x09, 0x04, 0x00, 0x00,
a180a41bba1d50822df23fff0099e90b86638b89vboxsync 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
a180a41bba1d50822df23fff0099e90b86638b89vboxsync 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
a180a41bba1d50822df23fff0099e90b86638b89vboxsync 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
a180a41bba1d50822df23fff0099e90b86638b89vboxsync 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
a180a41bba1d50822df23fff0099e90b86638b89vboxsync 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
a180a41bba1d50822df23fff0099e90b86638b89vboxsync 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
a180a41bba1d50822df23fff0099e90b86638b89vboxsync 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
a180a41bba1d50822df23fff0099e90b86638b89vboxsync 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
a180a41bba1d50822df23fff0099e90b86638b89vboxsync 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
a180a41bba1d50822df23fff0099e90b86638b89vboxsync 0x00, 0x00, 0x00, 0x00
a180a41bba1d50822df23fff0099e90b86638b89vboxsync};
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncstatic uint8 caps_0x0c[] = { 0x01, 0x00, 0x00, 0x00 };
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncstatic uint8 caps_0x0e[] = { 0x01, 0x00, 0x00, 0x00 };
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncstatic uint8 caps_0x10[] = {
a180a41bba1d50822df23fff0099e90b86638b89vboxsync 0xFE, 0x00, 0x04, 0x00, 0xFE, 0x00, 0x04, 0x00,
a180a41bba1d50822df23fff0099e90b86638b89vboxsync 0xFE, 0x00, 0x08, 0x00, 0xFE, 0x00, 0x08, 0x00,
a180a41bba1d50822df23fff0099e90b86638b89vboxsync 0xFE, 0x00, 0x10, 0x00, 0xFE, 0x00, 0x20, 0x00,
a180a41bba1d50822df23fff0099e90b86638b89vboxsync 0xFE, 0x00, 0x40, 0x00, 0xFE, 0x00, 0x80, 0x00,
a180a41bba1d50822df23fff0099e90b86638b89vboxsync 0xFE, 0x00, 0x00, 0x01, 0x40, 0x00, 0x00, 0x08,
a180a41bba1d50822df23fff0099e90b86638b89vboxsync 0x00, 0x01, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00
a180a41bba1d50822df23fff0099e90b86638b89vboxsync};
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync/* Output unknown capability sets */
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncstatic void
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncrdp_out_unknown_caps(STREAM s, uint16 id, uint16 length, uint8 * caps)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync{
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, id);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, length);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint8p(s, caps, length - 4);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync}
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync#define RDP5_FLAG 0x0030
a180a41bba1d50822df23fff0099e90b86638b89vboxsync/* Send a confirm active PDU */
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncstatic void
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncrdp_send_confirm_active(void)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync{
a180a41bba1d50822df23fff0099e90b86638b89vboxsync STREAM s;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync uint32 sec_flags = g_encryption ? (RDP5_FLAG | SEC_ENCRYPT) : RDP5_FLAG;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync uint16 caplen =
a180a41bba1d50822df23fff0099e90b86638b89vboxsync RDP_CAPLEN_GENERAL + RDP_CAPLEN_BITMAP + RDP_CAPLEN_ORDER +
a180a41bba1d50822df23fff0099e90b86638b89vboxsync RDP_CAPLEN_COLCACHE +
a180a41bba1d50822df23fff0099e90b86638b89vboxsync RDP_CAPLEN_ACTIVATE + RDP_CAPLEN_CONTROL +
a180a41bba1d50822df23fff0099e90b86638b89vboxsync RDP_CAPLEN_SHARE +
a180a41bba1d50822df23fff0099e90b86638b89vboxsync RDP_CAPLEN_BRUSHCACHE + 0x58 + 0x08 + 0x08 + 0x34 /* unknown caps */ +
a180a41bba1d50822df23fff0099e90b86638b89vboxsync 4 /* w2k fix, sessionid */ ;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync if (g_rdp_version >= RDP_V5)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync {
a180a41bba1d50822df23fff0099e90b86638b89vboxsync caplen += RDP_CAPLEN_BMPCACHE2;
6e9aa255e3376b2da5824c09c4c62bc233463bfevboxsync#ifdef VBOX
6e9aa255e3376b2da5824c09c4c62bc233463bfevboxsync caplen += RDP_CAPLEN_POINTER;
6e9aa255e3376b2da5824c09c4c62bc233463bfevboxsync#else
a180a41bba1d50822df23fff0099e90b86638b89vboxsync caplen += RDP_CAPLEN_NEWPOINTER;
6e9aa255e3376b2da5824c09c4c62bc233463bfevboxsync#endif
a180a41bba1d50822df23fff0099e90b86638b89vboxsync }
a180a41bba1d50822df23fff0099e90b86638b89vboxsync else
a180a41bba1d50822df23fff0099e90b86638b89vboxsync {
a180a41bba1d50822df23fff0099e90b86638b89vboxsync caplen += RDP_CAPLEN_BMPCACHE;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync caplen += RDP_CAPLEN_POINTER;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync }
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync s = sec_init(sec_flags, 6 + 14 + caplen + sizeof(RDP_SOURCE));
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, 2 + 14 + caplen + sizeof(RDP_SOURCE));
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, (RDP_PDU_CONFIRM_ACTIVE | 0x10)); /* Version 1 */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, (g_mcs_userid + 1001));
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint32_le(s, g_rdp_shareid);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, 0x3ea); /* userid */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, sizeof(RDP_SOURCE));
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, caplen);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint8p(s, RDP_SOURCE, sizeof(RDP_SOURCE));
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint16_le(s, 0xe); /* num_caps */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync out_uint8s(s, 2); /* pad */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync rdp_out_general_caps(s);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync rdp_out_bitmap_caps(s);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync rdp_out_order_caps(s);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync if (g_rdp_version >= RDP_V5)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync {
a180a41bba1d50822df23fff0099e90b86638b89vboxsync rdp_out_bmpcache2_caps(s);
6e9aa255e3376b2da5824c09c4c62bc233463bfevboxsync#ifdef VBOX
6e9aa255e3376b2da5824c09c4c62bc233463bfevboxsync rdp_out_pointer_caps(s);
6e9aa255e3376b2da5824c09c4c62bc233463bfevboxsync#else
a180a41bba1d50822df23fff0099e90b86638b89vboxsync rdp_out_newpointer_caps(s);
6e9aa255e3376b2da5824c09c4c62bc233463bfevboxsync#endif
a180a41bba1d50822df23fff0099e90b86638b89vboxsync }
a180a41bba1d50822df23fff0099e90b86638b89vboxsync else
a180a41bba1d50822df23fff0099e90b86638b89vboxsync {
a180a41bba1d50822df23fff0099e90b86638b89vboxsync rdp_out_bmpcache_caps(s);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync rdp_out_pointer_caps(s);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync }
a180a41bba1d50822df23fff0099e90b86638b89vboxsync rdp_out_colcache_caps(s);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync rdp_out_activate_caps(s);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync rdp_out_control_caps(s);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync rdp_out_share_caps(s);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync rdp_out_brushcache_caps(s);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync rdp_out_unknown_caps(s, 0x0d, 0x58, caps_0x0d); /* CAPSTYPE_INPUT */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync rdp_out_unknown_caps(s, 0x0c, 0x08, caps_0x0c); /* CAPSTYPE_SOUND */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync rdp_out_unknown_caps(s, 0x0e, 0x08, caps_0x0e); /* CAPSTYPE_FONT */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync rdp_out_unknown_caps(s, 0x10, 0x34, caps_0x10); /* CAPSTYPE_GLYPHCACHE */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync s_mark_end(s);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync sec_send(s, sec_flags);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync}
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync/* Process a general capability set */
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncstatic void
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncrdp_process_general_caps(STREAM s)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync{
a180a41bba1d50822df23fff0099e90b86638b89vboxsync uint16 pad2octetsB; /* rdp5 flags? */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync in_uint8s(s, 10);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync in_uint16_le(s, pad2octetsB);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync if (!pad2octetsB)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync g_rdp_version = RDP_V4;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync}
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync/* Process a bitmap capability set */
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncstatic void
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncrdp_process_bitmap_caps(STREAM s)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync{
a180a41bba1d50822df23fff0099e90b86638b89vboxsync uint16 width, height, depth;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync in_uint16_le(s, depth);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync in_uint8s(s, 6);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync in_uint16_le(s, width);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync in_uint16_le(s, height);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync DEBUG(("setting desktop size and depth to: %dx%dx%d\n", width, height, depth));
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /*
a180a41bba1d50822df23fff0099e90b86638b89vboxsync * The server may limit depth and change the size of the desktop (for
a180a41bba1d50822df23fff0099e90b86638b89vboxsync * example when shadowing another session).
a180a41bba1d50822df23fff0099e90b86638b89vboxsync */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync if (g_server_depth != depth)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync {
a180a41bba1d50822df23fff0099e90b86638b89vboxsync warning("Remote desktop does not support colour depth %d; falling back to %d\n",
a180a41bba1d50822df23fff0099e90b86638b89vboxsync g_server_depth, depth);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync g_server_depth = depth;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync }
a180a41bba1d50822df23fff0099e90b86638b89vboxsync if (g_width != width || g_height != height)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync {
a180a41bba1d50822df23fff0099e90b86638b89vboxsync warning("Remote desktop changed from %dx%d to %dx%d.\n", g_width, g_height,
a180a41bba1d50822df23fff0099e90b86638b89vboxsync width, height);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync g_width = width;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync g_height = height;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync ui_resize_window();
a180a41bba1d50822df23fff0099e90b86638b89vboxsync }
a180a41bba1d50822df23fff0099e90b86638b89vboxsync}
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync/* Process server capabilities */
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncstatic void
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncrdp_process_server_caps(STREAM s, uint16 length)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync{
a180a41bba1d50822df23fff0099e90b86638b89vboxsync int n;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync uint8 *next, *start;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync uint16 ncapsets, capset_type, capset_length;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync start = s->p;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync in_uint16_le(s, ncapsets);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync in_uint8s(s, 2); /* pad */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync for (n = 0; n < ncapsets; n++)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync {
a180a41bba1d50822df23fff0099e90b86638b89vboxsync if (s->p > start + length)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync return;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync in_uint16_le(s, capset_type);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync in_uint16_le(s, capset_length);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync next = s->p + capset_length - 4;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync switch (capset_type)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync {
a180a41bba1d50822df23fff0099e90b86638b89vboxsync case RDP_CAPSET_GENERAL:
a180a41bba1d50822df23fff0099e90b86638b89vboxsync rdp_process_general_caps(s);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync break;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync case RDP_CAPSET_BITMAP:
a180a41bba1d50822df23fff0099e90b86638b89vboxsync rdp_process_bitmap_caps(s);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync break;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync }
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync s->p = next;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync }
a180a41bba1d50822df23fff0099e90b86638b89vboxsync}
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync/* Respond to a demand active PDU */
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncstatic void
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncprocess_demand_active(STREAM s)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync{
a180a41bba1d50822df23fff0099e90b86638b89vboxsync uint8 type;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync uint16 len_src_descriptor, len_combined_caps;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* at this point we need to ensure that we have ui created */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync rd_create_ui();
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync in_uint32_le(s, g_rdp_shareid);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync in_uint16_le(s, len_src_descriptor);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync in_uint16_le(s, len_combined_caps);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync in_uint8s(s, len_src_descriptor);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync DEBUG(("DEMAND_ACTIVE(id=0x%x)\n", g_rdp_shareid));
a180a41bba1d50822df23fff0099e90b86638b89vboxsync rdp_process_server_caps(s, len_combined_caps);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync rdp_send_confirm_active();
a180a41bba1d50822df23fff0099e90b86638b89vboxsync rdp_send_synchronise();
a180a41bba1d50822df23fff0099e90b86638b89vboxsync rdp_send_control(RDP_CTL_COOPERATE);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync rdp_send_control(RDP_CTL_REQUEST_CONTROL);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync rdp_recv(&type); /* RDP_PDU_SYNCHRONIZE */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync rdp_recv(&type); /* RDP_CTL_COOPERATE */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync rdp_recv(&type); /* RDP_CTL_GRANT_CONTROL */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync rdp_send_input(0, RDP_INPUT_SYNCHRONIZE, 0,
a180a41bba1d50822df23fff0099e90b86638b89vboxsync g_numlock_sync ? ui_get_numlock_state(read_keyboard_state()) : 0, 0);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync if (g_rdp_version >= RDP_V5)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync {
a180a41bba1d50822df23fff0099e90b86638b89vboxsync rdp_enum_bmpcache2();
a180a41bba1d50822df23fff0099e90b86638b89vboxsync rdp_send_fonts(3);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync }
a180a41bba1d50822df23fff0099e90b86638b89vboxsync else
a180a41bba1d50822df23fff0099e90b86638b89vboxsync {
a180a41bba1d50822df23fff0099e90b86638b89vboxsync rdp_send_fonts(1);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync rdp_send_fonts(2);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync }
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync rdp_recv(&type); /* RDP_PDU_UNKNOWN 0x28 (Fonts?) */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync reset_order_state();
a180a41bba1d50822df23fff0099e90b86638b89vboxsync}
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync/* Process a colour pointer PDU */
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncstatic void
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncprocess_colour_pointer_common(STREAM s, int bpp)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync{
a180a41bba1d50822df23fff0099e90b86638b89vboxsync uint16 width, height, cache_idx, masklen, datalen;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync uint16 x, y;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync uint8 *mask;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync uint8 *data;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync RD_HCURSOR cursor;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync in_uint16_le(s, cache_idx);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync in_uint16_le(s, x);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync in_uint16_le(s, y);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync in_uint16_le(s, width);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync in_uint16_le(s, height);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync in_uint16_le(s, masklen);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync in_uint16_le(s, datalen);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync in_uint8p(s, data, datalen);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync in_uint8p(s, mask, masklen);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync if ((width != 32) || (height != 32))
a180a41bba1d50822df23fff0099e90b86638b89vboxsync {
a180a41bba1d50822df23fff0099e90b86638b89vboxsync warning("process_colour_pointer_common: " "width %d height %d\n", width, height);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync }
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* keep hotspot within cursor bounding box */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync x = MIN(x, width - 1);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync y = MIN(y, height - 1);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync cursor = ui_create_cursor(x, y, width, height, mask, data, bpp);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync ui_set_cursor(cursor);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync cache_put_cursor(cache_idx, cursor);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync}
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync/* Process a colour pointer PDU */
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncvoid
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncprocess_colour_pointer_pdu(STREAM s)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync{
a180a41bba1d50822df23fff0099e90b86638b89vboxsync process_colour_pointer_common(s, 24);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync}
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync/* Process a New Pointer PDU - these pointers have variable bit depth */
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncvoid
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncprocess_new_pointer_pdu(STREAM s)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync{
a180a41bba1d50822df23fff0099e90b86638b89vboxsync int xor_bpp;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync in_uint16_le(s, xor_bpp);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync process_colour_pointer_common(s, xor_bpp);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync}
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync/* Process a cached pointer PDU */
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncvoid
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncprocess_cached_pointer_pdu(STREAM s)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync{
a180a41bba1d50822df23fff0099e90b86638b89vboxsync uint16 cache_idx;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync in_uint16_le(s, cache_idx);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync ui_set_cursor(cache_get_cursor(cache_idx));
a180a41bba1d50822df23fff0099e90b86638b89vboxsync}
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync/* Process a system pointer PDU */
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncvoid
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncprocess_system_pointer_pdu(STREAM s)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync{
a180a41bba1d50822df23fff0099e90b86638b89vboxsync uint16 system_pointer_type;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync in_uint16_le(s, system_pointer_type);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync switch (system_pointer_type)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync {
a180a41bba1d50822df23fff0099e90b86638b89vboxsync case RDP_NULL_POINTER:
a180a41bba1d50822df23fff0099e90b86638b89vboxsync ui_set_null_cursor();
a180a41bba1d50822df23fff0099e90b86638b89vboxsync break;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync default:
a180a41bba1d50822df23fff0099e90b86638b89vboxsync unimpl("System pointer message 0x%x\n", system_pointer_type);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync }
a180a41bba1d50822df23fff0099e90b86638b89vboxsync}
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync/* Process a pointer PDU */
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncstatic void
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncprocess_pointer_pdu(STREAM s)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync{
a180a41bba1d50822df23fff0099e90b86638b89vboxsync uint16 message_type;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync uint16 x, y;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync in_uint16_le(s, message_type);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync in_uint8s(s, 2); /* pad */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync switch (message_type)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync {
a180a41bba1d50822df23fff0099e90b86638b89vboxsync case RDP_POINTER_MOVE:
a180a41bba1d50822df23fff0099e90b86638b89vboxsync in_uint16_le(s, x);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync in_uint16_le(s, y);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync if (s_check(s))
a180a41bba1d50822df23fff0099e90b86638b89vboxsync ui_move_pointer(x, y);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync break;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync case RDP_POINTER_COLOR:
a180a41bba1d50822df23fff0099e90b86638b89vboxsync process_colour_pointer_pdu(s);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync break;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync case RDP_POINTER_CACHED:
a180a41bba1d50822df23fff0099e90b86638b89vboxsync process_cached_pointer_pdu(s);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync break;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync case RDP_POINTER_SYSTEM:
a180a41bba1d50822df23fff0099e90b86638b89vboxsync process_system_pointer_pdu(s);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync break;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync case RDP_POINTER_NEW:
a180a41bba1d50822df23fff0099e90b86638b89vboxsync process_new_pointer_pdu(s);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync break;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync default:
a180a41bba1d50822df23fff0099e90b86638b89vboxsync unimpl("Pointer message 0x%x\n", message_type);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync }
a180a41bba1d50822df23fff0099e90b86638b89vboxsync}
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync/* Process bitmap updates */
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncvoid
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncprocess_bitmap_updates(STREAM s)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync{
a180a41bba1d50822df23fff0099e90b86638b89vboxsync uint16 num_updates;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync uint16 left, top, right, bottom, width, height;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync uint16 cx, cy, bpp, Bpp, compress, bufsize, size;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync uint8 *data, *bmpdata;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync int i;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync in_uint16_le(s, num_updates);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync for (i = 0; i < num_updates; i++)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync {
a180a41bba1d50822df23fff0099e90b86638b89vboxsync in_uint16_le(s, left);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync in_uint16_le(s, top);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync in_uint16_le(s, right);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync in_uint16_le(s, bottom);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync in_uint16_le(s, width);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync in_uint16_le(s, height);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync in_uint16_le(s, bpp);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync Bpp = (bpp + 7) / 8;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync in_uint16_le(s, compress);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync in_uint16_le(s, bufsize);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync cx = right - left + 1;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync cy = bottom - top + 1;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync DEBUG(("BITMAP_UPDATE(l=%d,t=%d,r=%d,b=%d,w=%d,h=%d,Bpp=%d,cmp=%d)\n",
a180a41bba1d50822df23fff0099e90b86638b89vboxsync left, top, right, bottom, width, height, Bpp, compress));
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync if (!compress)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync {
a180a41bba1d50822df23fff0099e90b86638b89vboxsync int y;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync bmpdata = (uint8 *) xmalloc(width * height * Bpp);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync for (y = 0; y < height; y++)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync {
a180a41bba1d50822df23fff0099e90b86638b89vboxsync in_uint8a(s, &bmpdata[(height - y - 1) * (width * Bpp)],
a180a41bba1d50822df23fff0099e90b86638b89vboxsync width * Bpp);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync }
a180a41bba1d50822df23fff0099e90b86638b89vboxsync ui_paint_bitmap(left, top, cx, cy, width, height, bmpdata);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync xfree(bmpdata);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync continue;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync }
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync if (compress & 0x400)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync {
a180a41bba1d50822df23fff0099e90b86638b89vboxsync size = bufsize;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync }
a180a41bba1d50822df23fff0099e90b86638b89vboxsync else
a180a41bba1d50822df23fff0099e90b86638b89vboxsync {
a180a41bba1d50822df23fff0099e90b86638b89vboxsync in_uint8s(s, 2); /* pad */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync in_uint16_le(s, size);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync in_uint8s(s, 4); /* line_size, final_size */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync }
a180a41bba1d50822df23fff0099e90b86638b89vboxsync in_uint8p(s, data, size);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync bmpdata = (uint8 *) xmalloc(width * height * Bpp);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync if (bitmap_decompress(bmpdata, width, height, data, size, Bpp))
a180a41bba1d50822df23fff0099e90b86638b89vboxsync {
a180a41bba1d50822df23fff0099e90b86638b89vboxsync ui_paint_bitmap(left, top, cx, cy, width, height, bmpdata);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync }
a180a41bba1d50822df23fff0099e90b86638b89vboxsync else
a180a41bba1d50822df23fff0099e90b86638b89vboxsync {
a180a41bba1d50822df23fff0099e90b86638b89vboxsync DEBUG_RDP5(("Failed to decompress data\n"));
a180a41bba1d50822df23fff0099e90b86638b89vboxsync }
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync xfree(bmpdata);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync }
a180a41bba1d50822df23fff0099e90b86638b89vboxsync}
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync/* Process a palette update */
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncvoid
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncprocess_palette(STREAM s)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync{
a180a41bba1d50822df23fff0099e90b86638b89vboxsync COLOURENTRY *entry;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync COLOURMAP map;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync RD_HCOLOURMAP hmap;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync int i;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync in_uint8s(s, 2); /* pad */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync in_uint16_le(s, map.ncolours);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync in_uint8s(s, 2); /* pad */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync map.colours = (COLOURENTRY *) xmalloc(sizeof(COLOURENTRY) * map.ncolours);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync DEBUG(("PALETTE(c=%d)\n", map.ncolours));
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync for (i = 0; i < map.ncolours; i++)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync {
a180a41bba1d50822df23fff0099e90b86638b89vboxsync entry = &map.colours[i];
a180a41bba1d50822df23fff0099e90b86638b89vboxsync in_uint8(s, entry->red);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync in_uint8(s, entry->green);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync in_uint8(s, entry->blue);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync }
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync hmap = ui_create_colourmap(&map);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync ui_set_colourmap(hmap);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync xfree(map.colours);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync}
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync/* Process an update PDU */
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncstatic void
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncprocess_update_pdu(STREAM s)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync{
a180a41bba1d50822df23fff0099e90b86638b89vboxsync uint16 update_type, count;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync in_uint16_le(s, update_type);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync ui_begin_update();
a180a41bba1d50822df23fff0099e90b86638b89vboxsync switch (update_type)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync {
a180a41bba1d50822df23fff0099e90b86638b89vboxsync case RDP_UPDATE_ORDERS:
a180a41bba1d50822df23fff0099e90b86638b89vboxsync in_uint8s(s, 2); /* pad */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync in_uint16_le(s, count);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync in_uint8s(s, 2); /* pad */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync process_orders(s, count);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync break;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync case RDP_UPDATE_BITMAP:
a180a41bba1d50822df23fff0099e90b86638b89vboxsync process_bitmap_updates(s);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync break;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync case RDP_UPDATE_PALETTE:
a180a41bba1d50822df23fff0099e90b86638b89vboxsync process_palette(s);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync break;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync case RDP_UPDATE_SYNCHRONIZE:
a180a41bba1d50822df23fff0099e90b86638b89vboxsync break;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync default:
a180a41bba1d50822df23fff0099e90b86638b89vboxsync unimpl("update %d\n", update_type);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync }
a180a41bba1d50822df23fff0099e90b86638b89vboxsync ui_end_update();
a180a41bba1d50822df23fff0099e90b86638b89vboxsync}
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync/* Process a Save Session Info PDU */
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncvoid
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncprocess_pdu_logon(STREAM s)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync{
a180a41bba1d50822df23fff0099e90b86638b89vboxsync uint32 infotype;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync in_uint32_le(s, infotype);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync if (infotype == INFOTYPE_LOGON_EXTENDED_INF)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync {
a180a41bba1d50822df23fff0099e90b86638b89vboxsync uint32 fieldspresent;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync in_uint8s(s, 2); /* Length */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync in_uint32_le(s, fieldspresent);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync if (fieldspresent & LOGON_EX_AUTORECONNECTCOOKIE)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync {
a180a41bba1d50822df23fff0099e90b86638b89vboxsync uint32 len;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync uint32 version;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* TS_LOGON_INFO_FIELD */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync in_uint8s(s, 4); /* cbFieldData */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* ARC_SC_PRIVATE_PACKET */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync in_uint32_le(s, len);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync if (len != 28)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync {
a180a41bba1d50822df23fff0099e90b86638b89vboxsync warning("Invalid length in Auto-Reconnect packet\n");
a180a41bba1d50822df23fff0099e90b86638b89vboxsync return;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync }
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync in_uint32_le(s, version);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync if (version != 1)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync {
a180a41bba1d50822df23fff0099e90b86638b89vboxsync warning("Unsupported version of Auto-Reconnect packet\n");
a180a41bba1d50822df23fff0099e90b86638b89vboxsync return;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync }
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync in_uint32_le(s, g_reconnect_logonid);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync in_uint8a(s, g_reconnect_random, 16);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync g_has_reconnect_random = True;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync g_reconnect_random_ts = time(NULL);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync DEBUG(("Saving auto-reconnect cookie, id=%u\n", g_reconnect_logonid));
a180a41bba1d50822df23fff0099e90b86638b89vboxsync }
a180a41bba1d50822df23fff0099e90b86638b89vboxsync }
a180a41bba1d50822df23fff0099e90b86638b89vboxsync}
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync/* Process a disconnect PDU */
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncvoid
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncprocess_disconnect_pdu(STREAM s, uint32 * ext_disc_reason)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync{
a180a41bba1d50822df23fff0099e90b86638b89vboxsync in_uint32_le(s, *ext_disc_reason);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync DEBUG(("Received disconnect PDU\n"));
a180a41bba1d50822df23fff0099e90b86638b89vboxsync}
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync/* Process data PDU */
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncstatic RD_BOOL
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncprocess_data_pdu(STREAM s, uint32 * ext_disc_reason)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync{
a180a41bba1d50822df23fff0099e90b86638b89vboxsync uint8 data_pdu_type;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync uint8 ctype;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync uint16 clen;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync uint32 len;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync uint32 roff, rlen;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync struct stream *ns = &(g_mppc_dict.ns);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync in_uint8s(s, 6); /* shareid, pad, streamid */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync in_uint16_le(s, len);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync in_uint8(s, data_pdu_type);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync in_uint8(s, ctype);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync in_uint16_le(s, clen);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync clen -= 18;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync if (ctype & RDP_MPPC_COMPRESSED)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync {
a180a41bba1d50822df23fff0099e90b86638b89vboxsync if (len > RDP_MPPC_DICT_SIZE)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync error("error decompressed packet size exceeds max\n");
a180a41bba1d50822df23fff0099e90b86638b89vboxsync if (mppc_expand(s->p, clen, ctype, &roff, &rlen) == -1)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync error("error while decompressing packet\n");
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* len -= 18; */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* allocate memory and copy the uncompressed data into the temporary stream */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync ns->data = (uint8 *) xrealloc(ns->data, rlen);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync memcpy((ns->data), (unsigned char *) (g_mppc_dict.hist + roff), rlen);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync ns->size = rlen;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync ns->end = (ns->data + ns->size);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync ns->p = ns->data;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync ns->rdp_hdr = ns->p;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync s = ns;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync }
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync switch (data_pdu_type)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync {
a180a41bba1d50822df23fff0099e90b86638b89vboxsync case RDP_DATA_PDU_UPDATE:
a180a41bba1d50822df23fff0099e90b86638b89vboxsync process_update_pdu(s);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync break;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync case RDP_DATA_PDU_CONTROL:
a180a41bba1d50822df23fff0099e90b86638b89vboxsync DEBUG(("Received Control PDU\n"));
a180a41bba1d50822df23fff0099e90b86638b89vboxsync break;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync case RDP_DATA_PDU_SYNCHRONISE:
a180a41bba1d50822df23fff0099e90b86638b89vboxsync DEBUG(("Received Sync PDU\n"));
a180a41bba1d50822df23fff0099e90b86638b89vboxsync break;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync case RDP_DATA_PDU_POINTER:
a180a41bba1d50822df23fff0099e90b86638b89vboxsync process_pointer_pdu(s);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync break;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync case RDP_DATA_PDU_BELL:
a180a41bba1d50822df23fff0099e90b86638b89vboxsync ui_bell();
a180a41bba1d50822df23fff0099e90b86638b89vboxsync break;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync case RDP_DATA_PDU_LOGON:
a180a41bba1d50822df23fff0099e90b86638b89vboxsync DEBUG(("Received Logon PDU\n"));
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* User logged on */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync process_pdu_logon(s);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync break;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync case RDP_DATA_PDU_DISCONNECT:
a180a41bba1d50822df23fff0099e90b86638b89vboxsync process_disconnect_pdu(s, ext_disc_reason);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* We used to return true and disconnect immediately here, but
a180a41bba1d50822df23fff0099e90b86638b89vboxsync * Windows Vista sends a disconnect PDU with reason 0 when
a180a41bba1d50822df23fff0099e90b86638b89vboxsync * reconnecting to a disconnected session, and MSTSC doesn't
a180a41bba1d50822df23fff0099e90b86638b89vboxsync * drop the connection. I think we should just save the status.
a180a41bba1d50822df23fff0099e90b86638b89vboxsync */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync break;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync case RDP_DATA_PDU_AUTORECONNECT_STATUS:
a180a41bba1d50822df23fff0099e90b86638b89vboxsync warning("Automatic reconnect using cookie, failed.\n");
a180a41bba1d50822df23fff0099e90b86638b89vboxsync break;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync default:
a180a41bba1d50822df23fff0099e90b86638b89vboxsync unimpl("data PDU %d\n", data_pdu_type);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync }
a180a41bba1d50822df23fff0099e90b86638b89vboxsync return False;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync}
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync/* Process redirect PDU from Session Directory */
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncstatic RD_BOOL
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncprocess_redirect_pdu(STREAM s, RD_BOOL enhanced_redirect /*, uint32 * ext_disc_reason */ )
a180a41bba1d50822df23fff0099e90b86638b89vboxsync{
a180a41bba1d50822df23fff0099e90b86638b89vboxsync uint32 len;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync uint16 redirect_identifier;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* reset any previous redirection information */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync g_redirect = True;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync free(g_redirect_server);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync free(g_redirect_username);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync free(g_redirect_domain);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync free(g_redirect_lb_info);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync free(g_redirect_cookie);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync g_redirect_server = NULL;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync g_redirect_username = NULL;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync g_redirect_domain = NULL;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync g_redirect_lb_info = NULL;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync g_redirect_cookie = NULL;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* these 2 bytes are unknown, seem to be zeros */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync in_uint8s(s, 2);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* FIXME: Previous implementation only reads 4 bytes which has been working
a180a41bba1d50822df23fff0099e90b86638b89vboxsync but todays spec says something different. Investigate and retest
a180a41bba1d50822df23fff0099e90b86638b89vboxsync server redirection using WTS 2003 cluster.
a180a41bba1d50822df23fff0099e90b86638b89vboxsync */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync if (enhanced_redirect)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync {
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* read identifier */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync in_uint16_le(s, redirect_identifier);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync if (redirect_identifier != 0x0400)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync error("Protocol error in server redirection, unexpected data.");
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* FIXME: skip total length */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync in_uint8s(s, 2);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* read session_id */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync in_uint32_le(s, g_redirect_session_id);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync }
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* read connection flags */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync in_uint32_le(s, g_redirect_flags);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync if (g_redirect_flags & PDU_REDIRECT_HAS_IP)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync {
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* read length of ip string */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync in_uint32_le(s, len);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* read ip string */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync rdp_in_unistr(s, len, &g_redirect_server, &g_redirect_server_len);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync }
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync if (g_redirect_flags & PDU_REDIRECT_HAS_LOAD_BALANCE_INFO)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync {
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* read length of load balance info blob */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync in_uint32_le(s, g_redirect_lb_info_len);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* reallocate a loadbalance info blob */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync if (g_redirect_lb_info != NULL)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync free(g_redirect_lb_info);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync g_redirect_lb_info = xmalloc(g_redirect_lb_info_len);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* read load balance info blob */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync in_uint8p(s, g_redirect_lb_info, g_redirect_lb_info_len);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync }
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync if (g_redirect_flags & PDU_REDIRECT_HAS_USERNAME)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync {
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* read length of username string */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync in_uint32_le(s, len);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* read username string */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync rdp_in_unistr(s, len, &g_redirect_username, &g_redirect_username_len);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync }
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync if (g_redirect_flags & PDU_REDIRECT_HAS_DOMAIN)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync {
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* read length of domain string */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync in_uint32_le(s, len);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* read domain string */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync rdp_in_unistr(s, len, &g_redirect_domain, &g_redirect_domain_len);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync }
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync if (g_redirect_flags & PDU_REDIRECT_HAS_PASSWORD)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync {
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* the information in this blob is either a password or a cookie that
a180a41bba1d50822df23fff0099e90b86638b89vboxsync should be passed though as blob and not parsed as a unicode string */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* read blob length */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync in_uint32_le(s, g_redirect_cookie_len);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* reallocate cookie blob */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync if (g_redirect_cookie != NULL)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync free(g_redirect_cookie);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync g_redirect_cookie = xmalloc(g_redirect_cookie_len);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* read cookie as is */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync in_uint8p(s, g_redirect_cookie, g_redirect_cookie_len);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync }
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync if (g_redirect_flags & PDU_REDIRECT_DONT_STORE_USERNAME)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync {
a180a41bba1d50822df23fff0099e90b86638b89vboxsync warning("PDU_REDIRECT_DONT_STORE_USERNAME set\n");
a180a41bba1d50822df23fff0099e90b86638b89vboxsync }
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync if (g_redirect_flags & PDU_REDIRECT_USE_SMARTCARD)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync {
a180a41bba1d50822df23fff0099e90b86638b89vboxsync warning("PDU_REDIRECT_USE_SMARTCARD set\n");
a180a41bba1d50822df23fff0099e90b86638b89vboxsync }
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync if (g_redirect_flags & PDU_REDIRECT_INFORMATIONAL)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync {
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* By spec this is only for information and doesn't mean that an actual
a180a41bba1d50822df23fff0099e90b86638b89vboxsync redirect should be performed. How it should be used is not mentioned. */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync g_redirect = False;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync }
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync if (g_redirect_flags & PDU_REDIRECT_HAS_TARGET_FQDN)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync {
a180a41bba1d50822df23fff0099e90b86638b89vboxsync in_uint32_le(s, len);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* Let target fqdn replace target ip address */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync if (g_redirect_server)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync {
a180a41bba1d50822df23fff0099e90b86638b89vboxsync free(g_redirect_server);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync g_redirect_server = NULL;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync }
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* read fqdn string */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync rdp_in_unistr(s, len, &g_redirect_server, &g_redirect_server_len);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync }
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync if (g_redirect_flags & PDU_REDIRECT_HAS_TARGET_NETBIOS)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync {
a180a41bba1d50822df23fff0099e90b86638b89vboxsync warning("PDU_REDIRECT_HAS_TARGET_NETBIOS set\n");
a180a41bba1d50822df23fff0099e90b86638b89vboxsync }
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync if (g_redirect_flags & PDU_REDIRECT_HAS_TARGET_IP_ARRAY)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync {
a180a41bba1d50822df23fff0099e90b86638b89vboxsync warning("PDU_REDIRECT_HAS_TARGET_IP_ARRAY set\n");
a180a41bba1d50822df23fff0099e90b86638b89vboxsync }
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync return True;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync}
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync/* Process incoming packets */
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncvoid
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncrdp_main_loop(RD_BOOL * deactivated, uint32 * ext_disc_reason)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync{
a180a41bba1d50822df23fff0099e90b86638b89vboxsync while (rdp_loop(deactivated, ext_disc_reason))
a180a41bba1d50822df23fff0099e90b86638b89vboxsync {
a180a41bba1d50822df23fff0099e90b86638b89vboxsync if (g_pending_resize || g_redirect)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync {
a180a41bba1d50822df23fff0099e90b86638b89vboxsync return;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync }
a180a41bba1d50822df23fff0099e90b86638b89vboxsync }
a180a41bba1d50822df23fff0099e90b86638b89vboxsync}
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync/* used in uiports and rdp_main_loop, processes the rdp packets waiting */
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncRD_BOOL
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncrdp_loop(RD_BOOL * deactivated, uint32 * ext_disc_reason)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync{
a180a41bba1d50822df23fff0099e90b86638b89vboxsync uint8 type;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync RD_BOOL cont = True;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync STREAM s;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync while (cont)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync {
a180a41bba1d50822df23fff0099e90b86638b89vboxsync s = rdp_recv(&type);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync if (s == NULL)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync return False;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync switch (type)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync {
a180a41bba1d50822df23fff0099e90b86638b89vboxsync case RDP_PDU_DEMAND_ACTIVE:
a180a41bba1d50822df23fff0099e90b86638b89vboxsync process_demand_active(s);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync *deactivated = False;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync break;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync case RDP_PDU_DEACTIVATE:
a180a41bba1d50822df23fff0099e90b86638b89vboxsync DEBUG(("RDP_PDU_DEACTIVATE\n"));
a180a41bba1d50822df23fff0099e90b86638b89vboxsync *deactivated = True;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync break;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync case RDP_PDU_REDIRECT:
a180a41bba1d50822df23fff0099e90b86638b89vboxsync return process_redirect_pdu(s, False);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync break;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync case RDP_PDU_ENHANCED_REDIRECT:
a180a41bba1d50822df23fff0099e90b86638b89vboxsync return process_redirect_pdu(s, True);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync break;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync case RDP_PDU_DATA:
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* If we got a data PDU, we don't need to keep the password in memory
a180a41bba1d50822df23fff0099e90b86638b89vboxsync anymore and therefor we should clear it for security reasons. */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync if (g_password[0] != '\0')
a180a41bba1d50822df23fff0099e90b86638b89vboxsync memset(g_password, 0, sizeof(g_password));
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync process_data_pdu(s, ext_disc_reason);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync break;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync case 0:
a180a41bba1d50822df23fff0099e90b86638b89vboxsync break;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync default:
a180a41bba1d50822df23fff0099e90b86638b89vboxsync unimpl("PDU %d\n", type);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync }
a180a41bba1d50822df23fff0099e90b86638b89vboxsync cont = g_next_packet < s->end;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync }
a180a41bba1d50822df23fff0099e90b86638b89vboxsync return True;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync}
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync/* Establish a connection up to the RDP layer */
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncRD_BOOL
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncrdp_connect(char *server, uint32 flags, char *domain, char *password,
a180a41bba1d50822df23fff0099e90b86638b89vboxsync char *command, char *directory, RD_BOOL reconnect)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync{
a180a41bba1d50822df23fff0099e90b86638b89vboxsync RD_BOOL deactivated = False;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync uint32 ext_disc_reason = 0;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync if (!sec_connect(server, g_username, domain, password, reconnect))
a180a41bba1d50822df23fff0099e90b86638b89vboxsync return False;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync rdp_send_logon_info(flags, domain, g_username, password, command, directory);
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync /* run RDP loop until first licence demand active PDU */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync while (!g_rdp_shareid)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync {
a180a41bba1d50822df23fff0099e90b86638b89vboxsync if (g_network_error)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync return False;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync if (!rdp_loop(&deactivated, &ext_disc_reason))
a180a41bba1d50822df23fff0099e90b86638b89vboxsync return False;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync if (g_redirect)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync return True;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync }
a180a41bba1d50822df23fff0099e90b86638b89vboxsync return True;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync}
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync/* Called during redirection to reset the state to support redirection */
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncvoid
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncrdp_reset_state(void)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync{
a180a41bba1d50822df23fff0099e90b86638b89vboxsync g_next_packet = NULL; /* reset the packet information */
a180a41bba1d50822df23fff0099e90b86638b89vboxsync g_rdp_shareid = 0;
a180a41bba1d50822df23fff0099e90b86638b89vboxsync sec_reset_state();
a180a41bba1d50822df23fff0099e90b86638b89vboxsync}
a180a41bba1d50822df23fff0099e90b86638b89vboxsync
a180a41bba1d50822df23fff0099e90b86638b89vboxsync/* Disconnect from the RDP layer */
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncvoid
a180a41bba1d50822df23fff0099e90b86638b89vboxsyncrdp_disconnect(void)
a180a41bba1d50822df23fff0099e90b86638b89vboxsync{
a180a41bba1d50822df23fff0099e90b86638b89vboxsync sec_disconnect();
a180a41bba1d50822df23fff0099e90b86638b89vboxsync}