--- sourceforge.net/trunk/rdesktop/rdp5.c 2003/10/22 10:55:11 508 +++ sourceforge.net/trunk/rdesktop/rdp5.c 2005/03/06 21:11:18 828 @@ -1,19 +1,19 @@ /* -*- c-basic-offset: 8 -*- rdesktop: A Remote Desktop Protocol client. Protocol services - Multipoint Communications Service - Copyright (C) Matthew Chapman 1999-2002 + Copyright (C) Matthew Chapman 1999-2005 Copyright (C) Erik Forsberg 2003 - + This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. - + This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - + You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. @@ -23,30 +23,63 @@ extern uint8 *g_next_packet; +extern RDPCOMP g_mppc_dict; + void -rdp5_process(STREAM s, BOOL encryption) +rdp5_process(STREAM s) { uint16 length, count, x, y; - uint8 type; + uint8 type, ctype; uint8 *next; - if (encryption) - { - in_uint8s(s, 8); /* signature */ - sec_decrypt(s->p, s->end - s->p); - } + uint32 roff, rlen; + struct stream *ns = &(g_mppc_dict.ns); + struct stream *ts; #if 0 printf("RDP5 data:\n"); hexdump(s->p, s->end - s->p); #endif + ui_begin_update(); while (s->p < s->end) { in_uint8(s, type); - in_uint16_le(s, length); + if (type & RDP_COMPRESSION) + { + in_uint8(s, ctype); + in_uint16_le(s, length); + type ^= RDP_COMPRESSION; + } + else + { + ctype = 0; + in_uint16_le(s, length); + } g_next_packet = next = s->p + length; + if (ctype & RDP_MPPC_COMPRESSED) + { + if (length > RDP_MPPC_DICT_SIZE) + error("error decompressed packet size exceeds max\n"); + if (mppc_expand(s->p, length, ctype, &roff, &rlen) == -1) + error("error while decompressing packet\n"); + + /* allocate memory and copy the uncompressed data into the temporary stream */ + ns->data = (uint8 *) xrealloc(ns->data, rlen); + + memcpy((ns->data), (unsigned char *) (g_mppc_dict.hist + roff), rlen); + + ns->size = rlen; + ns->end = (ns->data + ns->size); + ns->p = ns->data; + ns->rdp_hdr = ns->p; + + ts = ns; + } + else + ts = s; + switch (type) { /* Thanks to Jeroen Meijer p = next; } + ui_end_update(); }