/[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 725 - (hide annotations)
Sun Jun 27 17:51:54 2004 UTC (19 years, 11 months ago) by jsorg71
File MIME type: text/plain
File size: 28213 byte(s)
added persistant bitmap chaching from Jeroen Meijer, slightly modified

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

  ViewVC Help
Powered by ViewVC 1.1.26