/[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 738 - (hide annotations)
Mon Jul 12 21:07:39 2004 UTC (19 years, 10 months ago) by astrand
File MIME type: text/plain
File size: 27927 byte(s)
Indent fixes

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

  ViewVC Help
Powered by ViewVC 1.1.26