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 |
51 |
{ |
{ |
52 |
static STREAM rdp_s; |
static STREAM rdp_s; |
53 |
uint16 length, pdu_type; |
uint16 length, pdu_type; |
54 |
|
uint8 rdpver; |
55 |
|
|
56 |
if ((rdp_s == NULL) || (g_next_packet >= rdp_s->end)) |
if ((rdp_s == NULL) || (g_next_packet >= rdp_s->end)) |
57 |
{ |
{ |
58 |
rdp_s = sec_recv(); |
rdp_s = sec_recv(&rdpver); |
59 |
if (rdp_s == NULL) |
if (rdp_s == NULL) |
60 |
return NULL; |
return NULL; |
61 |
|
if (rdpver == 0xff) |
62 |
|
{ |
63 |
|
g_next_packet = rdp_s->end; |
64 |
|
*type = 0; |
65 |
|
return rdp_s; |
66 |
|
} |
67 |
|
else if (rdpver != 3) |
68 |
|
{ |
69 |
|
/* rdp5_process should move g_next_packet ok */ |
70 |
|
rdp5_process(rdp_s); |
71 |
|
*type = 0; |
72 |
|
return rdp_s; |
73 |
|
} |
74 |
|
|
75 |
g_next_packet = rdp_s->p; |
g_next_packet = rdp_s->p; |
76 |
} |
} |
416 |
out_uint32_le(s, flags); |
out_uint32_le(s, flags); |
417 |
|
|
418 |
/* list */ |
/* list */ |
419 |
out_uint8a(s, idlist + offset * sizeof(BITMAP_ID), |
out_uint8a(s, idlist + offset * sizeof(BITMAP_ID), count * sizeof(BITMAP_ID)); |
|
count * sizeof(BITMAP_ID)); |
|
420 |
|
|
421 |
s_mark_end(s); |
s_mark_end(s); |
422 |
rdp_send_data(s, 0x2b); |
rdp_send_data(s, 0x2b); |
566 |
{ |
{ |
567 |
out_uint32_le(s, BMPCACHE2_C2_CELLS); |
out_uint32_le(s, BMPCACHE2_C2_CELLS); |
568 |
} |
} |
569 |
out_uint8s(s, 20); /* other bitmap caches not used */ |
out_uint8s(s, 20); /* other bitmap caches not used */ |
570 |
} |
} |
571 |
|
|
572 |
/* Output control capability set */ |
/* Output control capability set */ |
657 |
|
|
658 |
/* Output unknown capability sets */ |
/* Output unknown capability sets */ |
659 |
static void |
static void |
660 |
rdp_out_unknown_caps(STREAM s, uint16 id, uint16 length, uint8 *caps) |
rdp_out_unknown_caps(STREAM s, uint16 id, uint16 length, uint8 * caps) |
661 |
{ |
{ |
662 |
out_uint16_le(s, id); |
out_uint16_le(s, id); |
663 |
out_uint16_le(s, length); |
out_uint16_le(s, length); |
677 |
RDP_CAPLEN_BMPCACHE + RDP_CAPLEN_COLCACHE + |
RDP_CAPLEN_BMPCACHE + RDP_CAPLEN_COLCACHE + |
678 |
RDP_CAPLEN_ACTIVATE + RDP_CAPLEN_CONTROL + |
RDP_CAPLEN_ACTIVATE + RDP_CAPLEN_CONTROL + |
679 |
RDP_CAPLEN_POINTER + RDP_CAPLEN_SHARE + |
RDP_CAPLEN_POINTER + RDP_CAPLEN_SHARE + |
680 |
0x58 + 0x08 + 0x08 + 0x34 /* unknown caps */ + |
0x58 + 0x08 + 0x08 + 0x34 /* unknown caps */ + |
681 |
4 /* w2k fix, why? */ ; |
4 /* w2k fix, why? */ ; |
682 |
|
|
683 |
s = sec_init(sec_flags, 6 + 14 + caplen + sizeof(RDP_SOURCE)); |
s = sec_init(sec_flags, 6 + 14 + caplen + sizeof(RDP_SOURCE)); |
705 |
rdp_out_pointer_caps(s); |
rdp_out_pointer_caps(s); |
706 |
rdp_out_share_caps(s); |
rdp_out_share_caps(s); |
707 |
|
|
708 |
rdp_out_unknown_caps(s, 0x0d, 0x58, caps_0x0d); /* international? */ |
rdp_out_unknown_caps(s, 0x0d, 0x58, caps_0x0d); /* international? */ |
709 |
rdp_out_unknown_caps(s, 0x0c, 0x08, caps_0x0c); |
rdp_out_unknown_caps(s, 0x0c, 0x08, caps_0x0c); |
710 |
rdp_out_unknown_caps(s, 0x0e, 0x08, caps_0x0e); |
rdp_out_unknown_caps(s, 0x0e, 0x08, caps_0x0e); |
711 |
rdp_out_unknown_caps(s, 0x10, 0x34, caps_0x10); /* glyph cache? */ |
rdp_out_unknown_caps(s, 0x10, 0x34, caps_0x10); /* glyph cache? */ |
712 |
|
|
713 |
s_mark_end(s); |
s_mark_end(s); |
714 |
sec_send(s, sec_flags); |
sec_send(s, sec_flags); |
715 |
} |
} |
753 |
if (g_width != width || g_height != height) |
if (g_width != width || g_height != height) |
754 |
{ |
{ |
755 |
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, |
756 |
width, height); |
width, height); |
757 |
g_width = width; |
g_width = width; |
758 |
g_height = height; |
g_height = height; |
759 |
ui_resize_window(); |
ui_resize_window(); |
1091 |
|
|
1092 |
if (ctype & RDP_MPPC_COMPRESSED) |
if (ctype & RDP_MPPC_COMPRESSED) |
1093 |
{ |
{ |
1094 |
|
if (len > RDP_MPPC_DICT_SIZE) |
1095 |
|
error("error decompressed packet size exceeds max\n"); |
1096 |
if (mppc_expand(s->p, clen, ctype, &roff, &rlen) == -1) |
if (mppc_expand(s->p, clen, ctype, &roff, &rlen) == -1) |
1097 |
error("error while decompressing packet\n"); |
error("error while decompressing packet\n"); |
1098 |
|
|
1149 |
} |
} |
1150 |
|
|
1151 |
/* Process incoming packets */ |
/* Process incoming packets */ |
1152 |
|
/* nevers gets out of here till app is done */ |
1153 |
void |
void |
1154 |
rdp_main_loop(BOOL * deactivated, uint32 * ext_disc_reason) |
rdp_main_loop(BOOL * deactivated, uint32 * ext_disc_reason) |
1155 |
{ |
{ |
1156 |
uint8 type; |
while (rdp_loop(deactivated, ext_disc_reason)) |
1157 |
BOOL disc = False; /* True when a disconnect PDU was received */ |
; |
|
STREAM s; |
|
|
|
|
|
while ((s = rdp_recv(&type)) != NULL) |
|
|
{ |
|
|
switch (type) |
|
|
{ |
|
|
case RDP_PDU_DEMAND_ACTIVE: |
|
|
process_demand_active(s); |
|
|
*deactivated = False; |
|
|
break; |
|
|
|
|
|
case RDP_PDU_DEACTIVATE: |
|
|
DEBUG(("RDP_PDU_DEACTIVATE\n")); |
|
|
*deactivated = True; |
|
|
break; |
|
|
|
|
|
case RDP_PDU_DATA: |
|
|
disc = process_data_pdu(s, ext_disc_reason); |
|
|
break; |
|
|
|
|
|
case 0: |
|
|
break; |
|
|
|
|
|
default: |
|
|
unimpl("PDU %d\n", type); |
|
|
} |
|
|
|
|
|
if (disc) |
|
|
{ |
|
|
return; |
|
|
} |
|
|
} |
|
|
return; |
|
1158 |
} |
} |
1159 |
|
|
1160 |
/* used in uiports, processes the rdp packets waiting */ |
/* used in uiports and rdp_main_loop, processes the rdp packets waiting */ |
1161 |
BOOL |
BOOL |
1162 |
rdp_loop(BOOL * deactivated, uint32 * ext_disc_reason) |
rdp_loop(BOOL * deactivated, uint32 * ext_disc_reason) |
1163 |
{ |
{ |