/[rdesktop]/jpeg/rdesktop/trunk/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 /jpeg/rdesktop/trunk/rdp.c

Parent Directory Parent Directory | Revision Log Revision Log


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

  ViewVC Help
Powered by ViewVC 1.1.26