/[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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 848 - (hide annotations)
Sun Mar 13 03:29:19 2005 UTC (19 years, 2 months ago) by jsorg71
File MIME type: text/plain
File size: 28435 byte(s)
added var for new polygon and ellipse orders

1 forsberg 351 /* -*- c-basic-offset: 8 -*-
2 matty 3 rdesktop: A Remote Desktop Protocol client.
3     Protocol services - RDP layer
4 stargo 828 Copyright (C) Matthew Chapman 1999-2005
5 jsorg71 433
6 matty 3 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
8     the Free Software Foundation; either version 2 of the License, or
9     (at your option) any later version.
10 jsorg71 433
11 matty 3 This program is distributed in the hope that it will be useful,
12     but WITHOUT ANY WARRANTY; without even the implied warranty of
13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14     GNU General Public License for more details.
15 jsorg71 433
16 matty 3 You should have received a copy of the GNU General Public License
17     along with this program; if not, write to the Free Software
18     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19     */
20    
21 stargo 562 #include <time.h>
22 matty 10 #include "rdesktop.h"
23 matty 3
24 jsorg71 381 extern uint16 g_mcs_userid;
25 jsorg71 437 extern char g_username[16];
26     extern BOOL g_bitmap_compression;
27     extern BOOL g_orders;
28     extern BOOL g_encryption;
29 jsorg71 438 extern BOOL g_desktop_save;
30 jsorg71 848 extern BOOL g_polygon_ellipse_orders;
31 jsorg71 438 extern BOOL g_use_rdp5;
32     extern uint16 g_server_rdp_version;
33 stargo 637 extern uint32 g_rdp5_performanceflags;
34 jsorg71 438 extern int g_server_bpp;
35 n-ki 677 extern int g_width;
36     extern int g_height;
37 jsorg71 678 extern BOOL g_bitmap_cache;
38 jsorg71 725 extern BOOL g_bitmap_cache_persist_enable;
39 matty 3
40 jsorg71 438 uint8 *g_next_packet;
41     uint32 g_rdp_shareid;
42 matty 3
43 n-ki 687 extern RDPCOMP g_mppc_dict;
44 n-ki 683
45 forsberg 340 #if WITH_DEBUG
46 jsorg71 438 static uint32 g_packetno;
47 forsberg 351 #endif
48 forsberg 340
49 matty 10 /* Receive an RDP packet */
50 matty 25 static STREAM
51 astrand 64 rdp_recv(uint8 * type)
52 matty 3 {
53 matty 10 static STREAM rdp_s;
54     uint16 length, pdu_type;
55 jsorg71 733 uint8 rdpver;
56 matty 3
57 jsorg71 438 if ((rdp_s == NULL) || (g_next_packet >= rdp_s->end))
58 matty 10 {
59 jsorg71 733 rdp_s = sec_recv(&rdpver);
60 matty 10 if (rdp_s == NULL)
61     return NULL;
62 jsorg71 779 if (rdpver == 0xff)
63 jsorg71 733 {
64 jsorg71 779 g_next_packet = rdp_s->end;
65     *type = 0;
66     return rdp_s;
67     }
68     else if (rdpver != 3)
69     {
70 jsorg71 733 /* rdp5_process should move g_next_packet ok */
71     rdp5_process(rdp_s);
72     *type = 0;
73     return rdp_s;
74     }
75 matty 3
76 jsorg71 438 g_next_packet = rdp_s->p;
77 matty 10 }
78     else
79 matty 7 {
80 jsorg71 438 rdp_s->p = g_next_packet;
81 matty 7 }
82    
83 matty 10 in_uint16_le(rdp_s, length);
84 jsorg71 283 /* 32k packets are really 8, keepalive fix */
85     if (length == 0x8000)
86     {
87 jsorg71 438 g_next_packet += 8;
88 jsorg71 283 *type = 0;
89     return rdp_s;
90     }
91 matty 10 in_uint16_le(rdp_s, pdu_type);
92 matty 24 in_uint8s(rdp_s, 2); /* userid */
93 matty 10 *type = pdu_type & 0xf;
94 matty 7
95 matty 30 #if WITH_DEBUG
96 jsorg71 438 DEBUG(("RDP packet #%d, (type %x)\n", ++g_packetno, *type));
97 matthewc 513 hexdump(g_next_packet, length);
98 matty 28 #endif /* */
99 matty 7
100 jsorg71 438 g_next_packet += length;
101 matty 10 return rdp_s;
102 matty 3 }
103    
104 matty 10 /* Initialise an RDP data packet */
105 matty 25 static STREAM
106     rdp_init_data(int maxlen)
107 matty 3 {
108 matty 10 STREAM s;
109 matty 3
110 jsorg71 437 s = sec_init(g_encryption ? SEC_ENCRYPT : 0, maxlen + 18);
111 matty 10 s_push_layer(s, rdp_hdr, 18);
112    
113     return s;
114 matty 3 }
115    
116 matty 10 /* Send an RDP data packet */
117 matty 25 static void
118     rdp_send_data(STREAM s, uint8 data_pdu_type)
119 matty 9 {
120 matty 10 uint16 length;
121 matty 9
122 matty 10 s_pop_layer(s, rdp_hdr);
123     length = s->end - s->p;
124 matty 9
125 matty 10 out_uint16_le(s, length);
126     out_uint16_le(s, (RDP_PDU_DATA | 0x10));
127 jsorg71 381 out_uint16_le(s, (g_mcs_userid + 1001));
128 matty 9
129 jsorg71 438 out_uint32_le(s, g_rdp_shareid);
130 matty 24 out_uint8(s, 0); /* pad */
131     out_uint8(s, 1); /* streamid */
132 n-ki 176 out_uint16_le(s, (length - 14));
133 matty 10 out_uint8(s, data_pdu_type);
134 matty 24 out_uint8(s, 0); /* compress_type */
135     out_uint16(s, 0); /* compress_len */
136 matty 3
137 jsorg71 437 sec_send(s, g_encryption ? SEC_ENCRYPT : 0);
138 matty 3 }
139    
140 matty 10 /* Output a string in Unicode */
141 matty 25 void
142     rdp_out_unistr(STREAM s, char *string, int len)
143 matty 3 {
144 matty 10 int i = 0, j = 0;
145 matty 9
146 matty 10 len += 2;
147 matty 9
148 matty 10 while (i < len)
149 matty 9 {
150 matty 10 s->p[i++] = string[j++];
151     s->p[i++] = 0;
152 matty 9 }
153    
154 matty 10 s->p += len;
155 matty 3 }
156    
157 n-ki 569 /* Input a string in Unicode
158     *
159     * Returns str_len of string
160     */
161     int
162     rdp_in_unistr(STREAM s, char *string, int uni_len)
163     {
164     int i = 0;
165    
166     while (i < uni_len / 2)
167     {
168     in_uint8a(s, &string[i++], 1);
169     in_uint8s(s, 1);
170     }
171    
172     return i - 1;
173     }
174    
175    
176 matty 10 /* Parse a logon info packet */
177 matty 25 static void
178     rdp_send_logon_info(uint32 flags, char *domain, char *user,
179     char *password, char *program, char *directory)
180 matty 3 {
181 n-ki 624 char *ipaddr = tcp_get_address();
182 matty 24 int len_domain = 2 * strlen(domain);
183     int len_user = 2 * strlen(user);
184     int len_password = 2 * strlen(password);
185     int len_program = 2 * strlen(program);
186 matty 10 int len_directory = 2 * strlen(directory);
187 n-ki 624 int len_ip = 2 * strlen(ipaddr);
188 forsberg 371 int len_dll = 2 * strlen("C:\\WINNT\\System32\\mstscax.dll");
189     int packetlen = 0;
190 jsorg71 437 uint32 sec_flags = g_encryption ? (SEC_LOGON_INFO | SEC_ENCRYPT) : SEC_LOGON_INFO;
191 matty 10 STREAM s;
192 stargo 562 time_t t = time(NULL);
193     time_t tzone;
194 matty 3
195 n-ki 687 #if 0
196     /* enable rdp compression */
197     /* some problems still exist with rdp5 */
198     flags |= RDP_COMPRESSION;
199     #endif
200    
201 jsorg71 438 if (!g_use_rdp5 || 1 == g_server_rdp_version)
202 forsberg 351 {
203     DEBUG_RDP5(("Sending RDP4-style Logon packet\n"));
204 matty 3
205 forsberg 351 s = sec_init(sec_flags, 18 + len_domain + len_user + len_password
206     + len_program + len_directory + 10);
207 matty 3
208 forsberg 351 out_uint32(s, 0);
209     out_uint32_le(s, flags);
210     out_uint16_le(s, len_domain);
211     out_uint16_le(s, len_user);
212     out_uint16_le(s, len_password);
213     out_uint16_le(s, len_program);
214     out_uint16_le(s, len_directory);
215     rdp_out_unistr(s, domain, len_domain);
216     rdp_out_unistr(s, user, len_user);
217     rdp_out_unistr(s, password, len_password);
218     rdp_out_unistr(s, program, len_program);
219     rdp_out_unistr(s, directory, len_directory);
220     }
221     else
222     {
223 n-ki 683
224 forsberg 371 flags |= RDP_LOGON_BLOB;
225 forsberg 351 DEBUG_RDP5(("Sending RDP5-style Logon packet\n"));
226 astrand 540 packetlen = 4 + /* Unknown uint32 */
227     4 + /* flags */
228     2 + /* len_domain */
229     2 + /* len_user */
230     (flags & RDP_LOGON_AUTO ? 2 : 0) + /* len_password */
231     (flags & RDP_LOGON_BLOB ? 2 : 0) + /* Length of BLOB */
232     2 + /* len_program */
233     2 + /* len_directory */
234     (0 < len_domain ? len_domain : 2) + /* domain */
235     len_user + (flags & RDP_LOGON_AUTO ? len_password : 0) + 0 + /* We have no 512 byte BLOB. Perhaps we must? */
236     (flags & RDP_LOGON_BLOB && !(flags & RDP_LOGON_AUTO) ? 2 : 0) + /* After the BLOB is a unknown int16. If there is a BLOB, that is. */
237     (0 < len_program ? len_program : 2) + (0 < len_directory ? len_directory : 2) + 2 + /* Unknown (2) */
238     2 + /* Client ip length */
239     len_ip + /* Client ip */
240     2 + /* DLL string length */
241     len_dll + /* DLL string */
242     2 + /* Unknown */
243     2 + /* Unknown */
244     64 + /* Time zone #0 */
245     2 + /* Unknown */
246     64 + /* Time zone #1 */
247     32; /* Unknown */
248 forsberg 410
249     s = sec_init(sec_flags, packetlen);
250 forsberg 371 DEBUG_RDP5(("Called sec_init with packetlen %d\n", packetlen));
251 forsberg 351
252 astrand 540 out_uint32(s, 0); /* Unknown */
253 forsberg 351 out_uint32_le(s, flags);
254     out_uint16_le(s, len_domain);
255     out_uint16_le(s, len_user);
256     if (flags & RDP_LOGON_AUTO)
257     {
258     out_uint16_le(s, len_password);
259 forsberg 371
260 forsberg 351 }
261 forsberg 410 if (flags & RDP_LOGON_BLOB && !(flags & RDP_LOGON_AUTO))
262     {
263 forsberg 371 out_uint16_le(s, 0);
264     }
265 forsberg 351 out_uint16_le(s, len_program);
266     out_uint16_le(s, len_directory);
267 forsberg 371 if (0 < len_domain)
268     rdp_out_unistr(s, domain, len_domain);
269 forsberg 410 else
270 forsberg 371 out_uint16_le(s, 0);
271     rdp_out_unistr(s, user, len_user);
272 forsberg 351 if (flags & RDP_LOGON_AUTO)
273     {
274     rdp_out_unistr(s, password, len_password);
275     }
276 forsberg 410 if (flags & RDP_LOGON_BLOB && !(flags & RDP_LOGON_AUTO))
277     {
278 forsberg 371 out_uint16_le(s, 0);
279     }
280 forsberg 410 if (0 < len_program)
281     {
282 forsberg 351 rdp_out_unistr(s, program, len_program);
283 forsberg 410
284     }
285     else
286     {
287 forsberg 371 out_uint16_le(s, 0);
288     }
289 forsberg 410 if (0 < len_directory)
290     {
291 forsberg 351 rdp_out_unistr(s, directory, len_directory);
292 forsberg 410 }
293     else
294     {
295 forsberg 371 out_uint16_le(s, 0);
296 jsorg71 376 }
297 forsberg 371 out_uint16_le(s, 2);
298 astrand 540 out_uint16_le(s, len_ip + 2); /* Length of client ip */
299 n-ki 624 rdp_out_unistr(s, ipaddr, len_ip);
300 forsberg 410 out_uint16_le(s, len_dll + 2);
301 forsberg 371 rdp_out_unistr(s, "C:\\WINNT\\System32\\mstscax.dll", len_dll);
302 stargo 562
303 stargo 604 tzone = (mktime(gmtime(&t)) - mktime(localtime(&t))) / 60;
304     out_uint32_le(s, tzone);
305 stargo 559
306 forsberg 410 rdp_out_unistr(s, "GTB, normaltid", 2 * strlen("GTB, normaltid"));
307     out_uint8s(s, 62 - 2 * strlen("GTB, normaltid"));
308 forsberg 351
309     out_uint32_le(s, 0x0a0000);
310     out_uint32_le(s, 0x050000);
311 forsberg 371 out_uint32_le(s, 3);
312     out_uint32_le(s, 0);
313     out_uint32_le(s, 0);
314 forsberg 351
315 forsberg 410 rdp_out_unistr(s, "GTB, sommartid", 2 * strlen("GTB, sommartid"));
316     out_uint8s(s, 62 - 2 * strlen("GTB, sommartid"));
317    
318 forsberg 371 out_uint32_le(s, 0x30000);
319 forsberg 351 out_uint32_le(s, 0x050000);
320     out_uint32_le(s, 2);
321 matthewc 365 out_uint32(s, 0);
322 forsberg 351 out_uint32_le(s, 0xffffffc4);
323     out_uint32_le(s, 0xfffffffe);
324 stargo 637 out_uint32_le(s, g_rdp5_performanceflags);
325 matthewc 365 out_uint32(s, 0);
326 forsberg 351
327 forsberg 371
328 forsberg 351 }
329 matty 10 s_mark_end(s);
330     sec_send(s, sec_flags);
331 matty 3 }
332    
333 matty 10 /* Send a control PDU */
334 matty 25 static void
335     rdp_send_control(uint16 action)
336 matty 3 {
337 matty 10 STREAM s;
338 matty 9
339 matty 10 s = rdp_init_data(8);
340 matty 9
341 matty 10 out_uint16_le(s, action);
342 matty 24 out_uint16(s, 0); /* userid */
343     out_uint32(s, 0); /* control id */
344 matty 9
345 matty 10 s_mark_end(s);
346     rdp_send_data(s, RDP_DATA_PDU_CONTROL);
347 matty 3 }
348    
349 matty 10 /* Send a synchronisation PDU */
350 matty 25 static void
351 matthewc 192 rdp_send_synchronise(void)
352 matty 3 {
353 matty 10 STREAM s;
354 matty 9
355 matty 10 s = rdp_init_data(4);
356 matty 9
357 matty 24 out_uint16_le(s, 1); /* type */
358 matty 10 out_uint16_le(s, 1002);
359 matty 9
360 matty 10 s_mark_end(s);
361     rdp_send_data(s, RDP_DATA_PDU_SYNCHRONISE);
362 matty 3 }
363    
364 matty 10 /* Send a single input event */
365 matty 25 void
366 astrand 82 rdp_send_input(uint32 time, uint16 message_type, uint16 device_flags, uint16 param1, uint16 param2)
367 matty 3 {
368 matty 10 STREAM s;
369 matty 9
370 matty 10 s = rdp_init_data(16);
371 matty 9
372 matty 24 out_uint16_le(s, 1); /* number of events */
373     out_uint16(s, 0); /* pad */
374 matty 9
375 matty 10 out_uint32_le(s, time);
376     out_uint16_le(s, message_type);
377     out_uint16_le(s, device_flags);
378     out_uint16_le(s, param1);
379     out_uint16_le(s, param2);
380 matty 9
381 matty 10 s_mark_end(s);
382     rdp_send_data(s, RDP_DATA_PDU_INPUT);
383 matty 3 }
384    
385 jsorg71 725 /* Inform the server on the contents of the persistent bitmap cache */
386     static void
387     rdp_enum_bmpcache2(void)
388     {
389     STREAM s;
390 jdmeijer 830 HASH_KEY keylist[BMPCACHE2_NUM_PSTCELLS];
391     uint32 num_keys, offset, count, flags;
392 jsorg71 725
393     offset = 0;
394 jdmeijer 830 num_keys = pstcache_enumerate(2, keylist);
395 jsorg71 725
396 jdmeijer 830 while (offset < num_keys)
397 jsorg71 725 {
398 jdmeijer 830 count = MIN(num_keys - offset, 169);
399 jsorg71 725
400 jdmeijer 830 s = rdp_init_data(24 + count * sizeof(HASH_KEY));
401 jsorg71 725
402     flags = 0;
403     if (offset == 0)
404     flags |= PDU_FLAG_FIRST;
405 jdmeijer 830 if (num_keys - offset <= 169)
406 jsorg71 725 flags |= PDU_FLAG_LAST;
407    
408     /* header */
409     out_uint32_le(s, 0);
410     out_uint16_le(s, count);
411     out_uint16_le(s, 0);
412     out_uint16_le(s, 0);
413     out_uint16_le(s, 0);
414     out_uint16_le(s, 0);
415 jdmeijer 830 out_uint16_le(s, num_keys);
416 jsorg71 725 out_uint32_le(s, 0);
417     out_uint32_le(s, flags);
418    
419     /* list */
420 jdmeijer 830 out_uint8a(s, keylist[offset], count * sizeof(HASH_KEY));
421 jsorg71 725
422     s_mark_end(s);
423     rdp_send_data(s, 0x2b);
424    
425     offset += 169;
426     }
427     }
428    
429 matty 10 /* Send an (empty) font information PDU */
430 matty 25 static void
431     rdp_send_fonts(uint16 seq)
432 matty 3 {
433 matty 10 STREAM s;
434 matty 3
435 matty 10 s = rdp_init_data(8);
436 matty 9
437 matty 10 out_uint16(s, 0); /* number of fonts */
438 n-ki 677 out_uint16_le(s, 0); /* pad? */
439 matty 10 out_uint16_le(s, seq); /* unknown */
440     out_uint16_le(s, 0x32); /* entry size */
441 matty 9
442 matty 10 s_mark_end(s);
443     rdp_send_data(s, RDP_DATA_PDU_FONT2);
444 matty 3 }
445    
446 matty 10 /* Output general capability set */
447 matty 25 static void
448     rdp_out_general_caps(STREAM s)
449 matty 3 {
450 matty 10 out_uint16_le(s, RDP_CAPSET_GENERAL);
451     out_uint16_le(s, RDP_CAPLEN_GENERAL);
452 matty 3
453 matty 10 out_uint16_le(s, 1); /* OS major type */
454     out_uint16_le(s, 3); /* OS minor type */
455 matty 24 out_uint16_le(s, 0x200); /* Protocol version */
456 matty 10 out_uint16(s, 0); /* Pad */
457     out_uint16(s, 0); /* Compression types */
458 jsorg71 438 out_uint16_le(s, g_use_rdp5 ? 0x40d : 0);
459 forsberg 351 /* Pad, according to T.128. 0x40d seems to
460     trigger
461     the server to start sending RDP5 packets.
462     However, the value is 0x1d04 with W2KTSK and
463     NT4MS. Hmm.. Anyway, thankyou, Microsoft,
464     for sending such information in a padding
465     field.. */
466 matty 10 out_uint16(s, 0); /* Update capability */
467     out_uint16(s, 0); /* Remote unshare capability */
468     out_uint16(s, 0); /* Compression level */
469     out_uint16(s, 0); /* Pad */
470 matty 3 }
471    
472 matty 10 /* Output bitmap capability set */
473 matty 25 static void
474     rdp_out_bitmap_caps(STREAM s)
475 matty 9 {
476 matty 10 out_uint16_le(s, RDP_CAPSET_BITMAP);
477     out_uint16_le(s, RDP_CAPLEN_BITMAP);
478 matty 9
479 jsorg71 654 out_uint16_le(s, g_server_bpp); /* Preferred BPP */
480 n-ki 176 out_uint16_le(s, 1); /* Receive 1 BPP */
481     out_uint16_le(s, 1); /* Receive 4 BPP */
482 matty 10 out_uint16_le(s, 1); /* Receive 8 BPP */
483     out_uint16_le(s, 800); /* Desktop width */
484     out_uint16_le(s, 600); /* Desktop height */
485     out_uint16(s, 0); /* Pad */
486 n-ki 677 out_uint16(s, 1); /* Allow resize */
487 jsorg71 437 out_uint16_le(s, g_bitmap_compression ? 1 : 0); /* Support compression */
488 matty 10 out_uint16(s, 0); /* Unknown */
489     out_uint16_le(s, 1); /* Unknown */
490     out_uint16(s, 0); /* Pad */
491 matty 9 }
492    
493 matty 10 /* Output order capability set */
494 matty 25 static void
495     rdp_out_order_caps(STREAM s)
496 matty 3 {
497 matty 10 uint8 order_caps[32];
498 matty 3
499 matty 28 memset(order_caps, 0, 32);
500     order_caps[0] = 1; /* dest blt */
501     order_caps[1] = 1; /* pat blt */
502     order_caps[2] = 1; /* screen blt */
503 n-ki 683 order_caps[3] = (g_bitmap_cache ? 1 : 0); /* memblt */
504 jdmeijer 831 order_caps[4] = 0; /* triblt */
505 matty 28 order_caps[8] = 1; /* line */
506     order_caps[9] = 1; /* line */
507     order_caps[10] = 1; /* rect */
508 jsorg71 848 order_caps[11] = (g_desktop_save ? 1 : 0); /* desksave */
509 matty 28 order_caps[13] = 1; /* memblt */
510     order_caps[14] = 1; /* triblt */
511 jsorg71 848 order_caps[20] = (g_polygon_ellipse_orders ? 1 : 0); /* polygon */
512     order_caps[21] = (g_polygon_ellipse_orders ? 1 : 0); /* polygon2 */
513 matty 28 order_caps[22] = 1; /* polyline */
514 jsorg71 848 order_caps[25] = (g_polygon_ellipse_orders ? 1 : 0); /* ellipse */
515     order_caps[26] = (g_polygon_ellipse_orders ? 1 : 0); /* ellipse2 */
516 matty 28 order_caps[27] = 1; /* text2 */
517 matty 10 out_uint16_le(s, RDP_CAPSET_ORDER);
518     out_uint16_le(s, RDP_CAPLEN_ORDER);
519 matty 9
520 matty 10 out_uint8s(s, 20); /* Terminal desc, pad */
521     out_uint16_le(s, 1); /* Cache X granularity */
522     out_uint16_le(s, 20); /* Cache Y granularity */
523     out_uint16(s, 0); /* Pad */
524     out_uint16_le(s, 1); /* Max order level */
525     out_uint16_le(s, 0x147); /* Number of fonts */
526 matty 24 out_uint16_le(s, 0x2a); /* Capability flags */
527 matty 10 out_uint8p(s, order_caps, 32); /* Orders supported */
528     out_uint16_le(s, 0x6a1); /* Text capability flags */
529     out_uint8s(s, 6); /* Pad */
530 jsorg71 438 out_uint32_le(s, g_desktop_save == False ? 0 : 0x38400); /* Desktop cache size */
531 matty 10 out_uint32(s, 0); /* Unknown */
532 n-ki 176 out_uint32_le(s, 0x4e4); /* Unknown */
533 matty 9 }
534    
535 matty 10 /* Output bitmap cache capability set */
536 matty 25 static void
537     rdp_out_bmpcache_caps(STREAM s)
538 matty 9 {
539 jsorg71 433 int Bpp;
540 matty 10 out_uint16_le(s, RDP_CAPSET_BMPCACHE);
541     out_uint16_le(s, RDP_CAPLEN_BMPCACHE);
542 matty 3
543 jsorg71 438 Bpp = (g_server_bpp + 7) / 8;
544 matty 24 out_uint8s(s, 24); /* unused */
545     out_uint16_le(s, 0x258); /* entries */
546 jsorg71 433 out_uint16_le(s, 0x100 * Bpp); /* max cell size */
547 matty 24 out_uint16_le(s, 0x12c); /* entries */
548 jsorg71 433 out_uint16_le(s, 0x400 * Bpp); /* max cell size */
549 matty 24 out_uint16_le(s, 0x106); /* entries */
550 jsorg71 433 out_uint16_le(s, 0x1000 * Bpp); /* max cell size */
551 matty 9 }
552    
553 jsorg71 725 /* Output bitmap cache v2 capability set */
554     static void
555     rdp_out_bmpcache2_caps(STREAM s)
556     {
557     out_uint16_le(s, RDP_CAPSET_BMPCACHE2);
558     out_uint16_le(s, RDP_CAPLEN_BMPCACHE2);
559    
560 jsorg71 730 out_uint16_le(s, g_bitmap_cache_persist_enable ? 2 : 0); /* version */
561 jsorg71 725
562     out_uint16_le(s, 0x0300); /* flags? number of caches? */
563    
564     out_uint32_le(s, BMPCACHE2_C0_CELLS);
565     out_uint32_le(s, BMPCACHE2_C1_CELLS);
566     if (pstcache_init(2))
567     {
568     out_uint32_le(s, BMPCACHE2_NUM_PSTCELLS | BMPCACHE2_FLAG_PERSIST);
569     }
570     else
571     {
572     out_uint32_le(s, BMPCACHE2_C2_CELLS);
573     }
574 astrand 738 out_uint8s(s, 20); /* other bitmap caches not used */
575 jsorg71 725 }
576    
577 matty 10 /* Output control capability set */
578 matty 25 static void
579     rdp_out_control_caps(STREAM s)
580 matty 9 {
581 matty 10 out_uint16_le(s, RDP_CAPSET_CONTROL);
582     out_uint16_le(s, RDP_CAPLEN_CONTROL);
583 matty 9
584 matty 10 out_uint16(s, 0); /* Control capabilities */
585     out_uint16(s, 0); /* Remote detach */
586     out_uint16_le(s, 2); /* Control interest */
587     out_uint16_le(s, 2); /* Detach interest */
588 matty 9 }
589    
590 matty 10 /* Output activation capability set */
591 matty 25 static void
592     rdp_out_activate_caps(STREAM s)
593 matty 9 {
594 matty 10 out_uint16_le(s, RDP_CAPSET_ACTIVATE);
595     out_uint16_le(s, RDP_CAPLEN_ACTIVATE);
596 matty 9
597 matty 10 out_uint16(s, 0); /* Help key */
598     out_uint16(s, 0); /* Help index key */
599     out_uint16(s, 0); /* Extended help key */
600     out_uint16(s, 0); /* Window activate */
601 matty 9 }
602    
603 matty 10 /* Output pointer capability set */
604 matty 25 static void
605     rdp_out_pointer_caps(STREAM s)
606 matty 9 {
607 matty 10 out_uint16_le(s, RDP_CAPSET_POINTER);
608     out_uint16_le(s, RDP_CAPLEN_POINTER);
609 matty 9
610 matty 10 out_uint16(s, 0); /* Colour pointer */
611     out_uint16_le(s, 20); /* Cache size */
612 matty 9 }
613    
614 matty 10 /* Output share capability set */
615 matty 25 static void
616     rdp_out_share_caps(STREAM s)
617 matty 3 {
618 matty 10 out_uint16_le(s, RDP_CAPSET_SHARE);
619     out_uint16_le(s, RDP_CAPLEN_SHARE);
620 matty 3
621 matty 10 out_uint16(s, 0); /* userid */
622     out_uint16(s, 0); /* pad */
623 matty 9 }
624 matty 3
625 matty 10 /* Output colour cache capability set */
626 matty 25 static void
627     rdp_out_colcache_caps(STREAM s)
628 matty 9 {
629 matty 10 out_uint16_le(s, RDP_CAPSET_COLCACHE);
630     out_uint16_le(s, RDP_CAPLEN_COLCACHE);
631 matty 3
632 matty 10 out_uint16_le(s, 6); /* cache size */
633     out_uint16(s, 0); /* pad */
634 matty 3 }
635    
636 jsorg71 725 static uint8 caps_0x0d[] = {
637     0x01, 0x00, 0x00, 0x00, 0x09, 0x04, 0x00, 0x00,
638     0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
639     0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
640     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
641     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
642     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
643     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
644     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
645     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
646     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
647     0x00, 0x00, 0x00, 0x00
648 matty 10 };
649 matty 3
650 jsorg71 725 static uint8 caps_0x0c[] = { 0x01, 0x00, 0x00, 0x00 };
651    
652     static uint8 caps_0x0e[] = { 0x01, 0x00, 0x00, 0x00 };
653    
654     static uint8 caps_0x10[] = {
655     0xFE, 0x00, 0x04, 0x00, 0xFE, 0x00, 0x04, 0x00,
656     0xFE, 0x00, 0x08, 0x00, 0xFE, 0x00, 0x08, 0x00,
657     0xFE, 0x00, 0x10, 0x00, 0xFE, 0x00, 0x20, 0x00,
658     0xFE, 0x00, 0x40, 0x00, 0xFE, 0x00, 0x80, 0x00,
659     0xFE, 0x00, 0x00, 0x01, 0x40, 0x00, 0x00, 0x08,
660     0x00, 0x01, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00
661     };
662    
663     /* Output unknown capability sets */
664 matty 25 static void
665 astrand 738 rdp_out_unknown_caps(STREAM s, uint16 id, uint16 length, uint8 * caps)
666 matty 3 {
667 jsorg71 725 out_uint16_le(s, id);
668     out_uint16_le(s, length);
669 matty 24
670 jsorg71 725 out_uint8p(s, caps, length - 4);
671 matty 3 }
672    
673 forsberg 351 #define RDP5_FLAG 0x0030
674 matty 10 /* Send a confirm active PDU */
675 matty 25 static void
676 matthewc 192 rdp_send_confirm_active(void)
677 matty 7 {
678 matty 10 STREAM s;
679 jsorg71 437 uint32 sec_flags = g_encryption ? (RDP5_FLAG | SEC_ENCRYPT) : RDP5_FLAG;
680 matty 24 uint16 caplen =
681     RDP_CAPLEN_GENERAL + RDP_CAPLEN_BITMAP + RDP_CAPLEN_ORDER +
682     RDP_CAPLEN_BMPCACHE + RDP_CAPLEN_COLCACHE +
683     RDP_CAPLEN_ACTIVATE + RDP_CAPLEN_CONTROL +
684 jsorg71 725 RDP_CAPLEN_POINTER + RDP_CAPLEN_SHARE +
685 astrand 738 0x58 + 0x08 + 0x08 + 0x34 /* unknown caps */ +
686 jsorg71 725 4 /* w2k fix, why? */ ;
687 matty 7
688 forsberg 351 s = sec_init(sec_flags, 6 + 14 + caplen + sizeof(RDP_SOURCE));
689 matty 9
690 forsberg 351 out_uint16_le(s, 2 + 14 + caplen + sizeof(RDP_SOURCE));
691     out_uint16_le(s, (RDP_PDU_CONFIRM_ACTIVE | 0x10)); /* Version 1 */
692 jsorg71 381 out_uint16_le(s, (g_mcs_userid + 1001));
693 forsberg 351
694 jsorg71 438 out_uint32_le(s, g_rdp_shareid);
695 matty 24 out_uint16_le(s, 0x3ea); /* userid */
696 matty 10 out_uint16_le(s, sizeof(RDP_SOURCE));
697     out_uint16_le(s, caplen);
698 matty 9
699 matty 10 out_uint8p(s, RDP_SOURCE, sizeof(RDP_SOURCE));
700 matty 24 out_uint16_le(s, 0xd); /* num_caps */
701     out_uint8s(s, 2); /* pad */
702 matty 9
703 matty 10 rdp_out_general_caps(s);
704     rdp_out_bitmap_caps(s);
705     rdp_out_order_caps(s);
706 jsorg71 725 g_use_rdp5 ? rdp_out_bmpcache2_caps(s) : rdp_out_bmpcache_caps(s);
707 matty 10 rdp_out_colcache_caps(s);
708     rdp_out_activate_caps(s);
709     rdp_out_control_caps(s);
710     rdp_out_pointer_caps(s);
711     rdp_out_share_caps(s);
712 matty 9
713 astrand 738 rdp_out_unknown_caps(s, 0x0d, 0x58, caps_0x0d); /* international? */
714 jsorg71 725 rdp_out_unknown_caps(s, 0x0c, 0x08, caps_0x0c);
715     rdp_out_unknown_caps(s, 0x0e, 0x08, caps_0x0e);
716 astrand 738 rdp_out_unknown_caps(s, 0x10, 0x34, caps_0x10); /* glyph cache? */
717    
718 matty 10 s_mark_end(s);
719 forsberg 351 sec_send(s, sec_flags);
720 matty 9 }
721    
722 n-ki 677 /* Process a general capability set */
723     static void
724     rdp_process_general_caps(STREAM s)
725     {
726     uint16 pad2octetsB; /* rdp5 flags? */
727    
728     in_uint8s(s, 10);
729     in_uint16_le(s, pad2octetsB);
730    
731     if (!pad2octetsB)
732     g_use_rdp5 = False;
733     }
734    
735     /* Process a bitmap capability set */
736     static void
737     rdp_process_bitmap_caps(STREAM s)
738     {
739     uint16 width, height, bpp;
740    
741     in_uint16_le(s, bpp);
742     in_uint8s(s, 6);
743    
744     in_uint16_le(s, width);
745     in_uint16_le(s, height);
746    
747     DEBUG(("setting desktop size and bpp to: %dx%dx%d\n", width, height, bpp));
748    
749     /*
750     * The server may limit bpp and change the size of the desktop (for
751     * example when shadowing another session).
752     */
753 jsorg71 708 if (g_server_bpp != bpp)
754     {
755     warning("colour depth changed from %d to %d\n", g_server_bpp, bpp);
756     g_server_bpp = bpp;
757     }
758     if (g_width != width || g_height != height)
759     {
760     warning("screen size changed from %dx%d to %dx%d\n", g_width, g_height,
761 astrand 738 width, height);
762 jsorg71 708 g_width = width;
763     g_height = height;
764     ui_resize_window();
765     }
766 n-ki 677 }
767    
768 jsorg71 725 /* Process server capabilities */
769     void
770     rdp_process_server_caps(STREAM s, uint16 length)
771 matty 9 {
772 n-ki 677 int n;
773 jsorg71 725 uint8 *next, *start;
774     uint16 ncapsets, capset_type, capset_length;
775 matty 9
776 jsorg71 725 start = s->p;
777 matty 9
778 jsorg71 725 in_uint16_le(s, ncapsets);
779 n-ki 677 in_uint8s(s, 2); /* pad */
780    
781 jsorg71 725 for (n = 0; n < ncapsets; n++)
782     {
783     if (s->p > start + length)
784     return;
785 n-ki 677
786     in_uint16_le(s, capset_type);
787     in_uint16_le(s, capset_length);
788    
789     next = s->p + capset_length - 4;
790    
791     switch (capset_type)
792 jsorg71 654 {
793 n-ki 677 case RDP_CAPSET_GENERAL:
794     rdp_process_general_caps(s);
795     break;
796    
797     case RDP_CAPSET_BITMAP:
798     rdp_process_bitmap_caps(s);
799     break;
800 jsorg71 654 }
801 n-ki 677
802     s->p = next;
803 jsorg71 654 }
804 jsorg71 725 }
805 jsorg71 654
806 jsorg71 725 /* Respond to a demand active PDU */
807     static void
808     process_demand_active(STREAM s)
809     {
810     uint8 type;
811     uint16 len_src_descriptor, len_combined_caps;
812    
813     in_uint32_le(s, g_rdp_shareid);
814     in_uint16_le(s, len_src_descriptor);
815     in_uint16_le(s, len_combined_caps);
816     in_uint8s(s, len_src_descriptor);
817    
818     DEBUG(("DEMAND_ACTIVE(id=0x%x)\n", g_rdp_shareid));
819     rdp_process_server_caps(s, len_combined_caps);
820    
821 matty 10 rdp_send_confirm_active();
822     rdp_send_synchronise();
823     rdp_send_control(RDP_CTL_COOPERATE);
824     rdp_send_control(RDP_CTL_REQUEST_CONTROL);
825 matty 28 rdp_recv(&type); /* RDP_PDU_SYNCHRONIZE */
826     rdp_recv(&type); /* RDP_CTL_COOPERATE */
827     rdp_recv(&type); /* RDP_CTL_GRANT_CONTROL */
828 astrand 543 rdp_send_input(0, RDP_INPUT_SYNCHRONIZE, 0, ui_get_numlock_state(read_keyboard_state()), 0);
829 n-ki 677
830     if (g_use_rdp5)
831     {
832 jsorg71 725 rdp_enum_bmpcache2();
833 n-ki 677 rdp_send_fonts(3);
834     }
835     else
836     {
837     rdp_send_fonts(1);
838     rdp_send_fonts(2);
839     }
840    
841     rdp_recv(&type); /* RDP_PDU_UNKNOWN 0x28 (Fonts?) */
842 matty 10 reset_order_state();
843 matty 9 }
844    
845 forsberg 351 /* Process a colour pointer PDU */
846     void
847     process_colour_pointer_pdu(STREAM s)
848     {
849     uint16 x, y, width, height, cache_idx, masklen, datalen;
850     uint8 *mask, *data;
851     HCURSOR cursor;
852    
853     in_uint16_le(s, cache_idx);
854     in_uint16_le(s, x);
855     in_uint16_le(s, y);
856     in_uint16_le(s, width);
857     in_uint16_le(s, height);
858     in_uint16_le(s, masklen);
859     in_uint16_le(s, datalen);
860     in_uint8p(s, data, datalen);
861     in_uint8p(s, mask, masklen);
862     cursor = ui_create_cursor(x, y, width, height, mask, data);
863     ui_set_cursor(cursor);
864     cache_put_cursor(cache_idx, cursor);
865     }
866    
867     /* Process a cached pointer PDU */
868     void
869     process_cached_pointer_pdu(STREAM s)
870     {
871     uint16 cache_idx;
872    
873     in_uint16_le(s, cache_idx);
874     ui_set_cursor(cache_get_cursor(cache_idx));
875     }
876    
877 astrand 508 /* Process a system pointer PDU */
878     void
879     process_system_pointer_pdu(STREAM s)
880     {
881     uint16 system_pointer_type;
882 forsberg 351
883 astrand 508 in_uint16(s, system_pointer_type);
884     switch (system_pointer_type)
885     {
886     case RDP_NULL_POINTER:
887     ui_set_null_cursor();
888     break;
889    
890     default:
891     unimpl("System pointer message 0x%x\n", system_pointer_type);
892     }
893     }
894    
895 matty 10 /* Process a pointer PDU */
896 matty 25 static void
897     process_pointer_pdu(STREAM s)
898 matty 9 {
899 matty 10 uint16 message_type;
900 forsberg 351 uint16 x, y;
901 matty 9
902 matty 10 in_uint16_le(s, message_type);
903 matty 24 in_uint8s(s, 2); /* pad */
904 matty 9
905 matty 10 switch (message_type)
906 matty 7 {
907 matty 10 case RDP_POINTER_MOVE:
908     in_uint16_le(s, x);
909     in_uint16_le(s, y);
910     if (s_check(s))
911     ui_move_pointer(x, y);
912     break;
913 matty 9
914 matty 28 case RDP_POINTER_COLOR:
915 forsberg 351 process_colour_pointer_pdu(s);
916 matty 28 break;
917    
918     case RDP_POINTER_CACHED:
919 forsberg 351 process_cached_pointer_pdu(s);
920 matty 28 break;
921    
922 astrand 508 case RDP_POINTER_SYSTEM:
923     process_system_pointer_pdu(s);
924     break;
925    
926 matty 10 default:
927 astrand 508 unimpl("Pointer message 0x%x\n", message_type);
928 matty 7 }
929 matty 9 }
930    
931 matty 10 /* Process bitmap updates */
932 forsberg 351 void
933 matty 25 process_bitmap_updates(STREAM s)
934 matty 9 {
935 matty 10 uint16 num_updates;
936     uint16 left, top, right, bottom, width, height;
937 jsorg71 314 uint16 cx, cy, bpp, Bpp, compress, bufsize, size;
938 matty 28 uint8 *data, *bmpdata;
939 matty 9 int i;
940    
941 matty 10 in_uint16_le(s, num_updates);
942 matty 9
943 matty 10 for (i = 0; i < num_updates; i++)
944 matty 9 {
945 matty 10 in_uint16_le(s, left);
946     in_uint16_le(s, top);
947     in_uint16_le(s, right);
948     in_uint16_le(s, bottom);
949     in_uint16_le(s, width);
950     in_uint16_le(s, height);
951     in_uint16_le(s, bpp);
952 jsorg71 314 Bpp = (bpp + 7) / 8;
953 matty 10 in_uint16_le(s, compress);
954     in_uint16_le(s, bufsize);
955 matty 9
956 matty 10 cx = right - left + 1;
957     cy = bottom - top + 1;
958 matty 7
959 forsberg 351 DEBUG(("BITMAP_UPDATE(l=%d,t=%d,r=%d,b=%d,w=%d,h=%d,Bpp=%d,cmp=%d)\n",
960     left, top, right, bottom, width, height, Bpp, compress));
961 matty 9
962 matty 10 if (!compress)
963     {
964 matty 28 int y;
965 forsberg 410 bmpdata = (uint8 *) xmalloc(width * height * Bpp);
966 matty 28 for (y = 0; y < height; y++)
967     {
968 astrand 318 in_uint8a(s, &bmpdata[(height - y - 1) * (width * Bpp)],
969     width * Bpp);
970 matty 28 }
971 astrand 82 ui_paint_bitmap(left, top, cx, cy, width, height, bmpdata);
972 matty 28 xfree(bmpdata);
973     continue;
974 matty 10 }
975 matty 9
976 forsberg 351
977     if (compress & 0x400)
978     {
979     size = bufsize;
980     }
981     else
982     {
983     in_uint8s(s, 2); /* pad */
984     in_uint16_le(s, size);
985     in_uint8s(s, 4); /* line_size, final_size */
986     }
987 matty 10 in_uint8p(s, data, size);
988 forsberg 410 bmpdata = (uint8 *) xmalloc(width * height * Bpp);
989 jsorg71 314 if (bitmap_decompress(bmpdata, width, height, data, size, Bpp))
990 matty 9 {
991 astrand 82 ui_paint_bitmap(left, top, cx, cy, width, height, bmpdata);
992 matty 9 }
993 forsberg 351 else
994     {
995     DEBUG_RDP5(("Failed to decompress data\n"));
996     }
997    
998 matty 28 xfree(bmpdata);
999 matty 10 }
1000 matty 9 }
1001    
1002 matty 10 /* Process a palette update */
1003 forsberg 351 void
1004 matty 25 process_palette(STREAM s)
1005 matty 9 {
1006 matthewc 254 COLOURENTRY *entry;
1007     COLOURMAP map;
1008 matty 10 HCOLOURMAP hmap;
1009 matthewc 254 int i;
1010 matty 9
1011 matty 24 in_uint8s(s, 2); /* pad */
1012     in_uint16_le(s, map.ncolours);
1013     in_uint8s(s, 2); /* pad */
1014 matty 3
1015 jsorg71 436 map.colours = (COLOURENTRY *) xmalloc(sizeof(COLOURENTRY) * map.ncolours);
1016 matthewc 254
1017 forsberg 351 DEBUG(("PALETTE(c=%d)\n", map.ncolours));
1018    
1019 matthewc 254 for (i = 0; i < map.ncolours; i++)
1020     {
1021     entry = &map.colours[i];
1022     in_uint8(s, entry->red);
1023     in_uint8(s, entry->green);
1024     in_uint8(s, entry->blue);
1025 astrand 260 }
1026 matthewc 254
1027 matty 10 hmap = ui_create_colourmap(&map);
1028     ui_set_colourmap(hmap);
1029 matthewc 254
1030     xfree(map.colours);
1031 matty 3 }
1032    
1033 matty 10 /* Process an update PDU */
1034 matty 25 static void
1035     process_update_pdu(STREAM s)
1036 matty 9 {
1037 forsberg 351 uint16 update_type, count;
1038 matty 9
1039 matty 10 in_uint16_le(s, update_type);
1040 matty 3
1041 jsorg71 713 ui_begin_update();
1042 matty 10 switch (update_type)
1043 matty 3 {
1044 matty 10 case RDP_UPDATE_ORDERS:
1045 forsberg 351 in_uint8s(s, 2); /* pad */
1046     in_uint16_le(s, count);
1047     in_uint8s(s, 2); /* pad */
1048     process_orders(s, count);
1049 matty 10 break;
1050 matty 3
1051 matty 10 case RDP_UPDATE_BITMAP:
1052     process_bitmap_updates(s);
1053     break;
1054 matty 3
1055 matty 10 case RDP_UPDATE_PALETTE:
1056     process_palette(s);
1057     break;
1058 matty 3
1059 matty 10 case RDP_UPDATE_SYNCHRONIZE:
1060     break;
1061 matty 9
1062 matty 10 default:
1063 matty 30 unimpl("update %d\n", update_type);
1064 matty 3 }
1065 jsorg71 713 ui_end_update();
1066 matty 3 }
1067    
1068 astrand 676 /* Process a disconnect PDU */
1069     void
1070     process_disconnect_pdu(STREAM s, uint32 * ext_disc_reason)
1071     {
1072     in_uint32_le(s, *ext_disc_reason);
1073    
1074     DEBUG(("Received disconnect PDU\n"));
1075     }
1076    
1077 matty 10 /* Process data PDU */
1078 astrand 676 static BOOL
1079     process_data_pdu(STREAM s, uint32 * ext_disc_reason)
1080 matty 9 {
1081 matty 10 uint8 data_pdu_type;
1082 n-ki 624 uint8 ctype;
1083     uint16 clen;
1084 n-ki 683 uint32 len;
1085 matty 9
1086 n-ki 683 uint32 roff, rlen;
1087    
1088 n-ki 687 struct stream *ns = &(g_mppc_dict.ns);
1089 n-ki 683
1090 n-ki 624 in_uint8s(s, 6); /* shareid, pad, streamid */
1091     in_uint16(s, len);
1092 matty 10 in_uint8(s, data_pdu_type);
1093 n-ki 624 in_uint8(s, ctype);
1094     in_uint16(s, clen);
1095     clen -= 18;
1096 matty 3
1097 n-ki 683 if (ctype & RDP_MPPC_COMPRESSED)
1098 n-ki 624 {
1099 jsorg71 773 if (len > RDP_MPPC_DICT_SIZE)
1100 astrand 782 error("error decompressed packet size exceeds max\n");
1101 n-ki 683 if (mppc_expand(s->p, clen, ctype, &roff, &rlen) == -1)
1102     error("error while decompressing packet\n");
1103 n-ki 624
1104 n-ki 687 //len -= 18;
1105 n-ki 624
1106 n-ki 683 /* allocate memory and copy the uncompressed data into the temporary stream */
1107 jsorg71 711 ns->data = (uint8 *) xrealloc(ns->data, rlen);
1108 n-ki 624
1109 n-ki 687 memcpy((ns->data), (unsigned char *) (g_mppc_dict.hist + roff), rlen);
1110 n-ki 624
1111 n-ki 687 ns->size = rlen;
1112 n-ki 683 ns->end = (ns->data + ns->size);
1113     ns->p = ns->data;
1114     ns->rdp_hdr = ns->p;
1115    
1116     s = ns;
1117 n-ki 624 }
1118    
1119 matty 10 switch (data_pdu_type)
1120 matty 3 {
1121 matty 10 case RDP_DATA_PDU_UPDATE:
1122     process_update_pdu(s);
1123     break;
1124 matty 3
1125 astrand 676 case RDP_DATA_PDU_CONTROL:
1126     DEBUG(("Received Control PDU\n"));
1127     break;
1128    
1129     case RDP_DATA_PDU_SYNCHRONISE:
1130     DEBUG(("Received Sync PDU\n"));
1131     break;
1132    
1133 matty 10 case RDP_DATA_PDU_POINTER:
1134     process_pointer_pdu(s);
1135     break;
1136 matty 3
1137 matty 10 case RDP_DATA_PDU_BELL:
1138     ui_bell();
1139     break;
1140 matty 3
1141 matty 10 case RDP_DATA_PDU_LOGON:
1142 forsberg 351 DEBUG(("Received Logon PDU\n"));
1143 matty 10 /* User logged on */
1144     break;
1145 matty 3
1146 matthewc 522 case RDP_DATA_PDU_DISCONNECT:
1147 astrand 676 process_disconnect_pdu(s, ext_disc_reason);
1148     return True;
1149 matthewc 522
1150 matty 10 default:
1151 matty 30 unimpl("data PDU %d\n", data_pdu_type);
1152 matty 3 }
1153 astrand 676 return False;
1154 matty 3 }
1155    
1156 matty 10 /* Process incoming packets */
1157 jsorg71 733 /* nevers gets out of here till app is done */
1158 astrand 676 void
1159     rdp_main_loop(BOOL * deactivated, uint32 * ext_disc_reason)
1160 matty 9 {
1161 jsorg71 733 while (rdp_loop(deactivated, ext_disc_reason))
1162     ;
1163 matty 3 }
1164    
1165 jsorg71 733 /* used in uiports and rdp_main_loop, processes the rdp packets waiting */
1166 jsorg71 713 BOOL
1167     rdp_loop(BOOL * deactivated, uint32 * ext_disc_reason)
1168     {
1169     uint8 type;
1170     BOOL disc = False; /* True when a disconnect PDU was received */
1171     BOOL cont = True;
1172     STREAM s;
1173    
1174 astrand 717 while (cont)
1175 jsorg71 713 {
1176     s = rdp_recv(&type);
1177     if (s == NULL)
1178     return False;
1179     switch (type)
1180     {
1181     case RDP_PDU_DEMAND_ACTIVE:
1182     process_demand_active(s);
1183     *deactivated = False;
1184     break;
1185     case RDP_PDU_DEACTIVATE:
1186     DEBUG(("RDP_PDU_DEACTIVATE\n"));
1187     *deactivated = True;
1188     break;
1189     case RDP_PDU_DATA:
1190     disc = process_data_pdu(s, ext_disc_reason);
1191     break;
1192     case 0:
1193     break;
1194     default:
1195     unimpl("PDU %d\n", type);
1196     }
1197     if (disc)
1198     return False;
1199     cont = g_next_packet < s->end;
1200     }
1201     return True;
1202     }
1203    
1204 matty 10 /* Establish a connection up to the RDP layer */
1205 matty 25 BOOL
1206     rdp_connect(char *server, uint32 flags, char *domain, char *password,
1207     char *command, char *directory)
1208 matty 9 {
1209 jsorg71 437 if (!sec_connect(server, g_username))
1210 matty 3 return False;
1211    
1212 jsorg71 437 rdp_send_logon_info(flags, domain, g_username, password, command, directory);
1213 matty 10 return True;
1214 matty 3 }
1215    
1216 matty 10 /* Disconnect from the RDP layer */
1217 matty 25 void
1218 matthewc 192 rdp_disconnect(void)
1219 matty 9 {
1220 matty 10 sec_disconnect();
1221 matty 9 }

  ViewVC Help
Powered by ViewVC 1.1.26