/[rdesktop]/sourceforge.net/trunk/rdesktop/rdp.c
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Diff of /sourceforge.net/trunk/rdesktop/rdp.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 733 by jsorg71, Mon Jul 5 19:09:07 2004 UTC revision 848 by jsorg71, Sun Mar 13 03:29:19 2005 UTC
# Line 1  Line 1 
1  /* -*- c-basic-offset: 8 -*-  /* -*- c-basic-offset: 8 -*-
2     rdesktop: A Remote Desktop Protocol client.     rdesktop: A Remote Desktop Protocol client.
3     Protocol services - RDP layer     Protocol services - RDP layer
4     Copyright (C) Matthew Chapman 1999-2002     Copyright (C) Matthew Chapman 1999-2005
5    
6     This program is free software; you can redistribute it and/or modify     This program is free software; you can redistribute it and/or modify
7     it under the terms of the GNU General Public License as published by     it under the terms of the GNU General Public License as published by
# Line 27  extern BOOL g_bitmap_compression; Line 27  extern BOOL g_bitmap_compression;
27  extern BOOL g_orders;  extern BOOL g_orders;
28  extern BOOL g_encryption;  extern BOOL g_encryption;
29  extern BOOL g_desktop_save;  extern BOOL g_desktop_save;
30    extern BOOL g_polygon_ellipse_orders;
31  extern BOOL g_use_rdp5;  extern BOOL g_use_rdp5;
32  extern uint16 g_server_rdp_version;  extern uint16 g_server_rdp_version;
33  extern uint32 g_rdp5_performanceflags;  extern uint32 g_rdp5_performanceflags;
# Line 58  rdp_recv(uint8 * type) Line 59  rdp_recv(uint8 * type)
59                  rdp_s = sec_recv(&rdpver);                  rdp_s = sec_recv(&rdpver);
60                  if (rdp_s == NULL)                  if (rdp_s == NULL)
61                          return NULL;                          return NULL;
62                  if (rdpver != 3)                  if (rdpver == 0xff)
63                    {
64                            g_next_packet = rdp_s->end;
65                            *type = 0;
66                            return rdp_s;
67                    }
68                    else if (rdpver != 3)
69                  {                  {
70                          /* rdp5_process should move g_next_packet ok */                          /* rdp5_process should move g_next_packet ok */
71                          rdp5_process(rdp_s);                          rdp5_process(rdp_s);
# Line 380  static void Line 387  static void
387  rdp_enum_bmpcache2(void)  rdp_enum_bmpcache2(void)
388  {  {
389          STREAM s;          STREAM s;
390          uint8 idlist[BMPCACHE2_NUM_PSTCELLS * sizeof(BITMAP_ID)];          HASH_KEY keylist[BMPCACHE2_NUM_PSTCELLS];
391          uint32 nids, offset, count, flags;          uint32 num_keys, offset, count, flags;
392    
393          offset = 0;          offset = 0;
394          nids = pstcache_enumerate(2, idlist);          num_keys = pstcache_enumerate(2, keylist);
395    
396          while (offset < nids)          while (offset < num_keys)
397          {          {
398                  count = MIN(nids - offset, 169);                  count = MIN(num_keys - offset, 169);
399    
400                  s = rdp_init_data(24 + count * sizeof(BITMAP_ID));                  s = rdp_init_data(24 + count * sizeof(HASH_KEY));
401    
402                  flags = 0;                  flags = 0;
403                  if (offset == 0)                  if (offset == 0)
404                          flags |= PDU_FLAG_FIRST;                          flags |= PDU_FLAG_FIRST;
405                  if (nids - offset <= 169)                  if (num_keys - offset <= 169)
406                          flags |= PDU_FLAG_LAST;                          flags |= PDU_FLAG_LAST;
407    
408                  /* header */                  /* header */
# Line 405  rdp_enum_bmpcache2(void) Line 412  rdp_enum_bmpcache2(void)
412                  out_uint16_le(s, 0);                  out_uint16_le(s, 0);
413                  out_uint16_le(s, 0);                  out_uint16_le(s, 0);
414                  out_uint16_le(s, 0);                  out_uint16_le(s, 0);
415                  out_uint16_le(s, nids);                  out_uint16_le(s, num_keys);
416                  out_uint32_le(s, 0);                  out_uint32_le(s, 0);
417                  out_uint32_le(s, flags);                  out_uint32_le(s, flags);
418    
419                  /* list */                  /* list */
420                  out_uint8a(s, idlist + offset * sizeof(BITMAP_ID),                  out_uint8a(s, keylist[offset], count * sizeof(HASH_KEY));
                                 count * sizeof(BITMAP_ID));  
421    
422                  s_mark_end(s);                  s_mark_end(s);
423                  rdp_send_data(s, 0x2b);                  rdp_send_data(s, 0x2b);
# Line 490  rdp_out_order_caps(STREAM s) Line 496  rdp_out_order_caps(STREAM s)
496  {  {
497          uint8 order_caps[32];          uint8 order_caps[32];
498    
   
499          memset(order_caps, 0, 32);          memset(order_caps, 0, 32);
500          order_caps[0] = 1;      /* dest blt */          order_caps[0] = 1;      /* dest blt */
501          order_caps[1] = 1;      /* pat blt */          order_caps[1] = 1;      /* pat blt */
502          order_caps[2] = 1;      /* screen blt */          order_caps[2] = 1;      /* screen blt */
503          order_caps[3] = (g_bitmap_cache ? 1 : 0);       /* memblt */          order_caps[3] = (g_bitmap_cache ? 1 : 0);       /* memblt */
504            order_caps[4] = 0;      /* triblt */
505          order_caps[8] = 1;      /* line */          order_caps[8] = 1;      /* line */
506          order_caps[9] = 1;      /* line */          order_caps[9] = 1;      /* line */
507          order_caps[10] = 1;     /* rect */          order_caps[10] = 1;     /* rect */
508          order_caps[11] = (g_desktop_save == False ? 0 : 1);     /* desksave */          order_caps[11] = (g_desktop_save ? 1 : 0);      /* desksave */
509          order_caps[13] = 1;     /* memblt */          order_caps[13] = 1;     /* memblt */
510          order_caps[14] = 1;     /* triblt */          order_caps[14] = 1;     /* triblt */
511            order_caps[20] = (g_polygon_ellipse_orders ? 1 : 0);    /* polygon */
512            order_caps[21] = (g_polygon_ellipse_orders ? 1 : 0);    /* polygon2 */
513          order_caps[22] = 1;     /* polyline */          order_caps[22] = 1;     /* polyline */
514            order_caps[25] = (g_polygon_ellipse_orders ? 1 : 0);    /* ellipse */
515            order_caps[26] = (g_polygon_ellipse_orders ? 1 : 0);    /* ellipse2 */
516          order_caps[27] = 1;     /* text2 */          order_caps[27] = 1;     /* text2 */
517          out_uint16_le(s, RDP_CAPSET_ORDER);          out_uint16_le(s, RDP_CAPSET_ORDER);
518          out_uint16_le(s, RDP_CAPLEN_ORDER);          out_uint16_le(s, RDP_CAPLEN_ORDER);
# Line 561  rdp_out_bmpcache2_caps(STREAM s) Line 571  rdp_out_bmpcache2_caps(STREAM s)
571          {          {
572                  out_uint32_le(s, BMPCACHE2_C2_CELLS);                  out_uint32_le(s, BMPCACHE2_C2_CELLS);
573          }          }
574          out_uint8s(s, 20);              /* other bitmap caches not used */          out_uint8s(s, 20);      /* other bitmap caches not used */
575  }  }
576    
577  /* Output control capability set */  /* Output control capability set */
# Line 652  static uint8 caps_0x10[] = { Line 662  static uint8 caps_0x10[] = {
662    
663  /* Output unknown capability sets */  /* Output unknown capability sets */
664  static void  static void
665  rdp_out_unknown_caps(STREAM s, uint16 id, uint16 length, uint8 *caps)  rdp_out_unknown_caps(STREAM s, uint16 id, uint16 length, uint8 * caps)
666  {  {
667          out_uint16_le(s, id);          out_uint16_le(s, id);
668          out_uint16_le(s, length);          out_uint16_le(s, length);
# Line 672  rdp_send_confirm_active(void) Line 682  rdp_send_confirm_active(void)
682                  RDP_CAPLEN_BMPCACHE + RDP_CAPLEN_COLCACHE +                  RDP_CAPLEN_BMPCACHE + RDP_CAPLEN_COLCACHE +
683                  RDP_CAPLEN_ACTIVATE + RDP_CAPLEN_CONTROL +                  RDP_CAPLEN_ACTIVATE + RDP_CAPLEN_CONTROL +
684                  RDP_CAPLEN_POINTER + RDP_CAPLEN_SHARE +                  RDP_CAPLEN_POINTER + RDP_CAPLEN_SHARE +
685                  0x58 + 0x08 + 0x08 + 0x34 /* unknown caps */ +                  0x58 + 0x08 + 0x08 + 0x34 /* unknown caps */  +
686                  4 /* w2k fix, why? */ ;                  4 /* w2k fix, why? */ ;
687    
688          s = sec_init(sec_flags, 6 + 14 + caplen + sizeof(RDP_SOURCE));          s = sec_init(sec_flags, 6 + 14 + caplen + sizeof(RDP_SOURCE));
# Line 700  rdp_send_confirm_active(void) Line 710  rdp_send_confirm_active(void)
710          rdp_out_pointer_caps(s);          rdp_out_pointer_caps(s);
711          rdp_out_share_caps(s);          rdp_out_share_caps(s);
712    
713          rdp_out_unknown_caps(s, 0x0d, 0x58, caps_0x0d); /* international? */          rdp_out_unknown_caps(s, 0x0d, 0x58, caps_0x0d); /* international? */
714          rdp_out_unknown_caps(s, 0x0c, 0x08, caps_0x0c);          rdp_out_unknown_caps(s, 0x0c, 0x08, caps_0x0c);
715          rdp_out_unknown_caps(s, 0x0e, 0x08, caps_0x0e);          rdp_out_unknown_caps(s, 0x0e, 0x08, caps_0x0e);
716          rdp_out_unknown_caps(s, 0x10, 0x34, caps_0x10); /* glyph cache? */          rdp_out_unknown_caps(s, 0x10, 0x34, caps_0x10); /* glyph cache? */
717                                    
718          s_mark_end(s);          s_mark_end(s);
719          sec_send(s, sec_flags);          sec_send(s, sec_flags);
720  }  }
# Line 748  rdp_process_bitmap_caps(STREAM s) Line 758  rdp_process_bitmap_caps(STREAM s)
758          if (g_width != width || g_height != height)          if (g_width != width || g_height != height)
759          {          {
760                  warning("screen size changed from %dx%d to %dx%d\n", g_width, g_height,                  warning("screen size changed from %dx%d to %dx%d\n", g_width, g_height,
761                                  width, height);                          width, height);
762                  g_width = width;                  g_width = width;
763                  g_height = height;                  g_height = height;
764                  ui_resize_window();                  ui_resize_window();
# Line 1086  process_data_pdu(STREAM s, uint32 * ext_ Line 1096  process_data_pdu(STREAM s, uint32 * ext_
1096    
1097          if (ctype & RDP_MPPC_COMPRESSED)          if (ctype & RDP_MPPC_COMPRESSED)
1098          {          {
1099                    if (len > RDP_MPPC_DICT_SIZE)
1100                            error("error decompressed packet size exceeds max\n");
1101                  if (mppc_expand(s->p, clen, ctype, &roff, &rlen) == -1)                  if (mppc_expand(s->p, clen, ctype, &roff, &rlen) == -1)
1102                          error("error while decompressing packet\n");                          error("error while decompressing packet\n");
1103    

Legend:
Removed from v.733  
changed lines
  Added in v.848

  ViewVC Help
Powered by ViewVC 1.1.26