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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 340 - (show annotations)
Thu Mar 6 14:11:17 2003 UTC (21 years, 2 months ago) by forsberg
File MIME type: text/plain
File size: 17263 byte(s)
If WITH_DEBUG, print the number of the packet just received, which makes
it easier to follow the packet on the network.

1 /*
2 rdesktop: A Remote Desktop Protocol client.
3 Protocol services - RDP layer
4 Copyright (C) Matthew Chapman 1999-2002
5
6 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
11 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
16 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 #include "rdesktop.h"
22
23 extern uint16 mcs_userid;
24 extern char username[16];
25 extern BOOL bitmap_compression;
26 extern BOOL orders;
27 extern BOOL encryption;
28 extern BOOL desktop_save;
29
30 uint8 *next_packet;
31 uint32 rdp_shareid;
32
33 #if WITH_DEBUG
34 static uint32 packetno;
35 #endif
36
37 /* Initialise an RDP packet */
38 static STREAM
39 rdp_init(int maxlen)
40 {
41 STREAM s;
42
43 s = sec_init(encryption ? SEC_ENCRYPT : 0, maxlen + 6);
44 s_push_layer(s, rdp_hdr, 6);
45
46 return s;
47 }
48
49 /* Send an RDP packet */
50 static void
51 rdp_send(STREAM s, uint8 pdu_type)
52 {
53 uint16 length;
54
55 s_pop_layer(s, rdp_hdr);
56 length = s->end - s->p;
57
58 out_uint16_le(s, length);
59 out_uint16_le(s, (pdu_type | 0x10)); /* Version 1 */
60 out_uint16_le(s, (mcs_userid + 1001));
61
62 sec_send(s, encryption ? SEC_ENCRYPT : 0);
63 }
64
65 /* Receive an RDP packet */
66 static STREAM
67 rdp_recv(uint8 * type)
68 {
69 static STREAM rdp_s;
70 uint16 length, pdu_type;
71
72 if ((rdp_s == NULL) || (next_packet >= rdp_s->end))
73 {
74 rdp_s = sec_recv();
75 if (rdp_s == NULL)
76 return NULL;
77
78 next_packet = rdp_s->p;
79 }
80 else
81 {
82 rdp_s->p = next_packet;
83 }
84
85 in_uint16_le(rdp_s, length);
86 /* 32k packets are really 8, keepalive fix */
87 if (length == 0x8000)
88 {
89 next_packet += 8;
90 *type = 0;
91 return rdp_s;
92 }
93 in_uint16_le(rdp_s, pdu_type);
94 in_uint8s(rdp_s, 2); /* userid */
95 *type = pdu_type & 0xf;
96
97 #if WITH_DEBUG
98 DEBUG(("RDP packet #%d, (type %x):\n", ++packetno, *type));
99 hexdump(next_packet, length);
100 #endif /* */
101
102 next_packet += length;
103 return rdp_s;
104 }
105
106 /* Initialise an RDP data packet */
107 static STREAM
108 rdp_init_data(int maxlen)
109 {
110 STREAM s;
111
112 s = sec_init(encryption ? SEC_ENCRYPT : 0, maxlen + 18);
113 s_push_layer(s, rdp_hdr, 18);
114
115 return s;
116 }
117
118 /* Send an RDP data packet */
119 static void
120 rdp_send_data(STREAM s, uint8 data_pdu_type)
121 {
122 uint16 length;
123
124 s_pop_layer(s, rdp_hdr);
125 length = s->end - s->p;
126
127 out_uint16_le(s, length);
128 out_uint16_le(s, (RDP_PDU_DATA | 0x10));
129 out_uint16_le(s, (mcs_userid + 1001));
130
131 out_uint32_le(s, rdp_shareid);
132 out_uint8(s, 0); /* pad */
133 out_uint8(s, 1); /* streamid */
134 out_uint16_le(s, (length - 14));
135 out_uint8(s, data_pdu_type);
136 out_uint8(s, 0); /* compress_type */
137 out_uint16(s, 0); /* compress_len */
138
139 sec_send(s, encryption ? SEC_ENCRYPT : 0);
140 }
141
142 /* Output a string in Unicode */
143 void
144 rdp_out_unistr(STREAM s, char *string, int len)
145 {
146 int i = 0, j = 0;
147
148 len += 2;
149
150 while (i < len)
151 {
152 s->p[i++] = string[j++];
153 s->p[i++] = 0;
154 }
155
156 s->p += len;
157 }
158
159 /* Parse a logon info packet */
160 static void
161 rdp_send_logon_info(uint32 flags, char *domain, char *user,
162 char *password, char *program, char *directory)
163 {
164 int len_domain = 2 * strlen(domain);
165 int len_user = 2 * strlen(user);
166 int len_password = 2 * strlen(password);
167 int len_program = 2 * strlen(program);
168 int len_directory = 2 * strlen(directory);
169 uint32 sec_flags = encryption ? (SEC_LOGON_INFO | SEC_ENCRYPT) : SEC_LOGON_INFO;
170 STREAM s;
171
172 s = sec_init(sec_flags, 18 + len_domain + len_user + len_password
173 + len_program + len_directory + 10);
174
175 out_uint32(s, 0);
176 out_uint32_le(s, flags);
177 out_uint16_le(s, len_domain);
178 out_uint16_le(s, len_user);
179 out_uint16_le(s, len_password);
180 out_uint16_le(s, len_program);
181 out_uint16_le(s, len_directory);
182 rdp_out_unistr(s, domain, len_domain);
183 rdp_out_unistr(s, user, len_user);
184 rdp_out_unistr(s, password, len_password);
185 rdp_out_unistr(s, program, len_program);
186 rdp_out_unistr(s, directory, len_directory);
187
188 s_mark_end(s);
189 sec_send(s, sec_flags);
190 }
191
192 /* Send a control PDU */
193 static void
194 rdp_send_control(uint16 action)
195 {
196 STREAM s;
197
198 s = rdp_init_data(8);
199
200 out_uint16_le(s, action);
201 out_uint16(s, 0); /* userid */
202 out_uint32(s, 0); /* control id */
203
204 s_mark_end(s);
205 rdp_send_data(s, RDP_DATA_PDU_CONTROL);
206 }
207
208 /* Send a synchronisation PDU */
209 static void
210 rdp_send_synchronise(void)
211 {
212 STREAM s;
213
214 s = rdp_init_data(4);
215
216 out_uint16_le(s, 1); /* type */
217 out_uint16_le(s, 1002);
218
219 s_mark_end(s);
220 rdp_send_data(s, RDP_DATA_PDU_SYNCHRONISE);
221 }
222
223 /* Send a single input event */
224 void
225 rdp_send_input(uint32 time, uint16 message_type, uint16 device_flags, uint16 param1, uint16 param2)
226 {
227 STREAM s;
228
229 s = rdp_init_data(16);
230
231 out_uint16_le(s, 1); /* number of events */
232 out_uint16(s, 0); /* pad */
233
234 out_uint32_le(s, time);
235 out_uint16_le(s, message_type);
236 out_uint16_le(s, device_flags);
237 out_uint16_le(s, param1);
238 out_uint16_le(s, param2);
239
240 s_mark_end(s);
241 rdp_send_data(s, RDP_DATA_PDU_INPUT);
242 }
243
244 /* Send an (empty) font information PDU */
245 static void
246 rdp_send_fonts(uint16 seq)
247 {
248 STREAM s;
249
250 s = rdp_init_data(8);
251
252 out_uint16(s, 0); /* number of fonts */
253 out_uint16_le(s, 0x3e); /* unknown */
254 out_uint16_le(s, seq); /* unknown */
255 out_uint16_le(s, 0x32); /* entry size */
256
257 s_mark_end(s);
258 rdp_send_data(s, RDP_DATA_PDU_FONT2);
259 }
260
261 /* Output general capability set */
262 static void
263 rdp_out_general_caps(STREAM s)
264 {
265 out_uint16_le(s, RDP_CAPSET_GENERAL);
266 out_uint16_le(s, RDP_CAPLEN_GENERAL);
267
268 out_uint16_le(s, 1); /* OS major type */
269 out_uint16_le(s, 3); /* OS minor type */
270 out_uint16_le(s, 0x200); /* Protocol version */
271 out_uint16(s, 0); /* Pad */
272 out_uint16(s, 0); /* Compression types */
273 out_uint16(s, 0); /* Pad */
274 out_uint16(s, 0); /* Update capability */
275 out_uint16(s, 0); /* Remote unshare capability */
276 out_uint16(s, 0); /* Compression level */
277 out_uint16(s, 0); /* Pad */
278 }
279
280 /* Output bitmap capability set */
281 static void
282 rdp_out_bitmap_caps(STREAM s)
283 {
284 out_uint16_le(s, RDP_CAPSET_BITMAP);
285 out_uint16_le(s, RDP_CAPLEN_BITMAP);
286
287 out_uint16_le(s, 8); /* Preferred BPP */
288 out_uint16_le(s, 1); /* Receive 1 BPP */
289 out_uint16_le(s, 1); /* Receive 4 BPP */
290 out_uint16_le(s, 1); /* Receive 8 BPP */
291 out_uint16_le(s, 800); /* Desktop width */
292 out_uint16_le(s, 600); /* Desktop height */
293 out_uint16(s, 0); /* Pad */
294 out_uint16(s, 0); /* Allow resize */
295 out_uint16_le(s, bitmap_compression ? 1 : 0); /* Support compression */
296 out_uint16(s, 0); /* Unknown */
297 out_uint16_le(s, 1); /* Unknown */
298 out_uint16(s, 0); /* Pad */
299 }
300
301 /* Output order capability set */
302 static void
303 rdp_out_order_caps(STREAM s)
304 {
305 uint8 order_caps[32];
306
307
308 memset(order_caps, 0, 32);
309 order_caps[0] = 1; /* dest blt */
310 order_caps[1] = 1; /* pat blt */
311 order_caps[2] = 1; /* screen blt */
312 order_caps[3] = 1; /* required for memblt? */
313 order_caps[8] = 1; /* line */
314 order_caps[9] = 1; /* line */
315 order_caps[10] = 1; /* rect */
316 order_caps[11] = (desktop_save == False ? 0 : 1); /* desksave */
317 order_caps[13] = 1; /* memblt */
318 order_caps[14] = 1; /* triblt */
319 order_caps[22] = 1; /* polyline */
320 order_caps[27] = 1; /* text2 */
321 out_uint16_le(s, RDP_CAPSET_ORDER);
322 out_uint16_le(s, RDP_CAPLEN_ORDER);
323
324 out_uint8s(s, 20); /* Terminal desc, pad */
325 out_uint16_le(s, 1); /* Cache X granularity */
326 out_uint16_le(s, 20); /* Cache Y granularity */
327 out_uint16(s, 0); /* Pad */
328 out_uint16_le(s, 1); /* Max order level */
329 out_uint16_le(s, 0x147); /* Number of fonts */
330 out_uint16_le(s, 0x2a); /* Capability flags */
331 out_uint8p(s, order_caps, 32); /* Orders supported */
332 out_uint16_le(s, 0x6a1); /* Text capability flags */
333 out_uint8s(s, 6); /* Pad */
334 out_uint32_le(s, desktop_save == False ? 0 : 0x38400); /* Desktop cache size */
335 out_uint32(s, 0); /* Unknown */
336 out_uint32_le(s, 0x4e4); /* Unknown */
337 }
338
339 /* Output bitmap cache capability set */
340 static void
341 rdp_out_bmpcache_caps(STREAM s)
342 {
343 out_uint16_le(s, RDP_CAPSET_BMPCACHE);
344 out_uint16_le(s, RDP_CAPLEN_BMPCACHE);
345
346 out_uint8s(s, 24); /* unused */
347 out_uint16_le(s, 0x258); /* entries */
348 out_uint16_le(s, 0x100); /* max cell size */
349 out_uint16_le(s, 0x12c); /* entries */
350 out_uint16_le(s, 0x400); /* max cell size */
351 out_uint16_le(s, 0x106); /* entries */
352 out_uint16_le(s, 0x1000); /* max cell size */
353 }
354
355 /* Output control capability set */
356 static void
357 rdp_out_control_caps(STREAM s)
358 {
359 out_uint16_le(s, RDP_CAPSET_CONTROL);
360 out_uint16_le(s, RDP_CAPLEN_CONTROL);
361
362 out_uint16(s, 0); /* Control capabilities */
363 out_uint16(s, 0); /* Remote detach */
364 out_uint16_le(s, 2); /* Control interest */
365 out_uint16_le(s, 2); /* Detach interest */
366 }
367
368 /* Output activation capability set */
369 static void
370 rdp_out_activate_caps(STREAM s)
371 {
372 out_uint16_le(s, RDP_CAPSET_ACTIVATE);
373 out_uint16_le(s, RDP_CAPLEN_ACTIVATE);
374
375 out_uint16(s, 0); /* Help key */
376 out_uint16(s, 0); /* Help index key */
377 out_uint16(s, 0); /* Extended help key */
378 out_uint16(s, 0); /* Window activate */
379 }
380
381 /* Output pointer capability set */
382 static void
383 rdp_out_pointer_caps(STREAM s)
384 {
385 out_uint16_le(s, RDP_CAPSET_POINTER);
386 out_uint16_le(s, RDP_CAPLEN_POINTER);
387
388 out_uint16(s, 0); /* Colour pointer */
389 out_uint16_le(s, 20); /* Cache size */
390 }
391
392 /* Output share capability set */
393 static void
394 rdp_out_share_caps(STREAM s)
395 {
396 out_uint16_le(s, RDP_CAPSET_SHARE);
397 out_uint16_le(s, RDP_CAPLEN_SHARE);
398
399 out_uint16(s, 0); /* userid */
400 out_uint16(s, 0); /* pad */
401 }
402
403 /* Output colour cache capability set */
404 static void
405 rdp_out_colcache_caps(STREAM s)
406 {
407 out_uint16_le(s, RDP_CAPSET_COLCACHE);
408 out_uint16_le(s, RDP_CAPLEN_COLCACHE);
409
410 out_uint16_le(s, 6); /* cache size */
411 out_uint16(s, 0); /* pad */
412 }
413
414 static uint8 canned_caps[] = {
415 0x01, 0x00, 0x00, 0x00, 0x09, 0x04, 0x00, 0x00, 0x04,
416 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00,
417 0x00, 0x00, 0x00, 0x00, 0x00,
418 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
419 0x00, 0x00, 0x00, 0x00, 0x00,
420 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
421 0x00, 0x00, 0x00, 0x00, 0x00,
422 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
423 0x00, 0x00, 0x00, 0x00, 0x00,
424 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
425 0x0C, 0x00, 0x08, 0x00, 0x01,
426 0x00, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x00, 0x01, 0x00, 0x00, 0x00,
427 0x10, 0x00, 0x34, 0x00, 0xFE,
428 0x00, 0x04, 0x00, 0xFE, 0x00, 0x04, 0x00, 0xFE, 0x00, 0x08, 0x00,
429 0xFE, 0x00, 0x08, 0x00, 0xFE,
430 0x00, 0x10, 0x00, 0xFE, 0x00, 0x20, 0x00, 0xFE, 0x00, 0x40, 0x00,
431 0xFE, 0x00, 0x80, 0x00, 0xFE,
432 0x00, 0x00, 0x01, 0x40, 0x00, 0x00, 0x08, 0x00, 0x01, 0x00, 0x01,
433 0x02, 0x00, 0x00, 0x00
434 };
435
436 /* Output unknown capability set */
437 static void
438 rdp_out_unknown_caps(STREAM s)
439 {
440 out_uint16_le(s, RDP_CAPSET_UNKNOWN);
441 out_uint16_le(s, 0x58);
442
443 out_uint8p(s, canned_caps, RDP_CAPLEN_UNKNOWN - 4);
444 }
445
446 /* Send a confirm active PDU */
447 static void
448 rdp_send_confirm_active(void)
449 {
450 STREAM s;
451 uint16 caplen =
452 RDP_CAPLEN_GENERAL + RDP_CAPLEN_BITMAP + RDP_CAPLEN_ORDER +
453 RDP_CAPLEN_BMPCACHE + RDP_CAPLEN_COLCACHE +
454 RDP_CAPLEN_ACTIVATE + RDP_CAPLEN_CONTROL +
455 RDP_CAPLEN_POINTER + RDP_CAPLEN_SHARE + RDP_CAPLEN_UNKNOWN + 4 /* w2k fix, why? */ ;
456
457 s = rdp_init(14 + caplen + sizeof(RDP_SOURCE));
458
459 out_uint32_le(s, rdp_shareid);
460 out_uint16_le(s, 0x3ea); /* userid */
461 out_uint16_le(s, sizeof(RDP_SOURCE));
462 out_uint16_le(s, caplen);
463
464 out_uint8p(s, RDP_SOURCE, sizeof(RDP_SOURCE));
465 out_uint16_le(s, 0xd); /* num_caps */
466 out_uint8s(s, 2); /* pad */
467
468 rdp_out_general_caps(s);
469 rdp_out_bitmap_caps(s);
470 rdp_out_order_caps(s);
471 rdp_out_bmpcache_caps(s);
472 rdp_out_colcache_caps(s);
473 rdp_out_activate_caps(s);
474 rdp_out_control_caps(s);
475 rdp_out_pointer_caps(s);
476 rdp_out_share_caps(s);
477 rdp_out_unknown_caps(s);
478
479 s_mark_end(s);
480 rdp_send(s, RDP_PDU_CONFIRM_ACTIVE);
481 }
482
483 /* Respond to a demand active PDU */
484 static void
485 process_demand_active(STREAM s)
486 {
487 uint8 type;
488
489 in_uint32_le(s, rdp_shareid);
490
491 DEBUG(("DEMAND_ACTIVE(id=0x%x)\n", rdp_shareid));
492
493 rdp_send_confirm_active();
494 rdp_send_synchronise();
495 rdp_send_control(RDP_CTL_COOPERATE);
496 rdp_send_control(RDP_CTL_REQUEST_CONTROL);
497 rdp_recv(&type); /* RDP_PDU_SYNCHRONIZE */
498 rdp_recv(&type); /* RDP_CTL_COOPERATE */
499 rdp_recv(&type); /* RDP_CTL_GRANT_CONTROL */
500 rdp_send_input(0, RDP_INPUT_SYNCHRONIZE, 0, 0, 0);
501 rdp_send_fonts(1);
502 rdp_send_fonts(2);
503 rdp_recv(&type); /* RDP_PDU_UNKNOWN 0x28 */
504 reset_order_state();
505 }
506
507 /* Process a pointer PDU */
508 static void
509 process_pointer_pdu(STREAM s)
510 {
511 uint16 message_type;
512 uint16 x, y, width, height, cache_idx, masklen, datalen;
513 uint8 *mask, *data;
514 HCURSOR cursor;
515
516 in_uint16_le(s, message_type);
517 in_uint8s(s, 2); /* pad */
518
519 switch (message_type)
520 {
521 case RDP_POINTER_MOVE:
522 in_uint16_le(s, x);
523 in_uint16_le(s, y);
524 if (s_check(s))
525 ui_move_pointer(x, y);
526 break;
527
528 case RDP_POINTER_COLOR:
529 in_uint16_le(s, cache_idx);
530 in_uint16_le(s, x);
531 in_uint16_le(s, y);
532 in_uint16_le(s, width);
533 in_uint16_le(s, height);
534 in_uint16_le(s, masklen);
535 in_uint16_le(s, datalen);
536 in_uint8p(s, data, datalen);
537 in_uint8p(s, mask, masklen);
538 cursor = ui_create_cursor(x, y, width, height, mask, data);
539 ui_set_cursor(cursor);
540 cache_put_cursor(cache_idx, cursor);
541 break;
542
543 case RDP_POINTER_CACHED:
544 in_uint16_le(s, cache_idx);
545 ui_set_cursor(cache_get_cursor(cache_idx));
546 break;
547
548 default:
549 DEBUG(("Pointer message 0x%x\n", message_type));
550 }
551 }
552
553 /* Process bitmap updates */
554 static void
555 process_bitmap_updates(STREAM s)
556 {
557 uint16 num_updates;
558 uint16 left, top, right, bottom, width, height;
559 uint16 cx, cy, bpp, Bpp, compress, bufsize, size;
560 uint8 *data, *bmpdata;
561 int i;
562
563 in_uint16_le(s, num_updates);
564
565 for (i = 0; i < num_updates; i++)
566 {
567 in_uint16_le(s, left);
568 in_uint16_le(s, top);
569 in_uint16_le(s, right);
570 in_uint16_le(s, bottom);
571 in_uint16_le(s, width);
572 in_uint16_le(s, height);
573 in_uint16_le(s, bpp);
574 Bpp = (bpp + 7) / 8;
575 in_uint16_le(s, compress);
576 in_uint16_le(s, bufsize);
577
578 cx = right - left + 1;
579 cy = bottom - top + 1;
580
581 DEBUG(("UPDATE(l=%d,t=%d,r=%d,b=%d,w=%d,h=%d,cmp=%d)\n",
582 left, top, right, bottom, width, height, compress));
583
584 if (!compress)
585 {
586 int y;
587 bmpdata = xmalloc(width * height * Bpp);
588 for (y = 0; y < height; y++)
589 {
590 in_uint8a(s, &bmpdata[(height - y - 1) * (width * Bpp)],
591 width * Bpp);
592 }
593 ui_paint_bitmap(left, top, cx, cy, width, height, bmpdata);
594 xfree(bmpdata);
595 continue;
596 }
597
598 in_uint8s(s, 2); /* pad */
599 in_uint16_le(s, size);
600 in_uint8s(s, 4); /* line_size, final_size */
601 in_uint8p(s, data, size);
602 bmpdata = xmalloc(width * height * Bpp);
603 if (bitmap_decompress(bmpdata, width, height, data, size, Bpp))
604 {
605 ui_paint_bitmap(left, top, cx, cy, width, height, bmpdata);
606 }
607 xfree(bmpdata);
608 }
609 }
610
611 /* Process a palette update */
612 static void
613 process_palette(STREAM s)
614 {
615 COLOURENTRY *entry;
616 COLOURMAP map;
617 HCOLOURMAP hmap;
618 int i;
619
620 in_uint8s(s, 2); /* pad */
621 in_uint16_le(s, map.ncolours);
622 in_uint8s(s, 2); /* pad */
623
624 map.colours = xmalloc(3 * map.ncolours);
625
626 for (i = 0; i < map.ncolours; i++)
627 {
628 entry = &map.colours[i];
629 in_uint8(s, entry->red);
630 in_uint8(s, entry->green);
631 in_uint8(s, entry->blue);
632 }
633
634 hmap = ui_create_colourmap(&map);
635 ui_set_colourmap(hmap);
636
637 xfree(map.colours);
638 }
639
640 /* Process an update PDU */
641 static void
642 process_update_pdu(STREAM s)
643 {
644 uint16 update_type;
645
646 in_uint16_le(s, update_type);
647
648 switch (update_type)
649 {
650 case RDP_UPDATE_ORDERS:
651 process_orders(s);
652 break;
653
654 case RDP_UPDATE_BITMAP:
655 process_bitmap_updates(s);
656 break;
657
658 case RDP_UPDATE_PALETTE:
659 process_palette(s);
660 break;
661
662 case RDP_UPDATE_SYNCHRONIZE:
663 break;
664
665 default:
666 unimpl("update %d\n", update_type);
667 }
668
669 }
670
671 /* Process data PDU */
672 static void
673 process_data_pdu(STREAM s)
674 {
675 uint8 data_pdu_type;
676
677 in_uint8s(s, 8); /* shareid, pad, streamid, length */
678 in_uint8(s, data_pdu_type);
679 in_uint8s(s, 3); /* compress_type, compress_len */
680
681 switch (data_pdu_type)
682 {
683 case RDP_DATA_PDU_UPDATE:
684 process_update_pdu(s);
685 break;
686
687 case RDP_DATA_PDU_POINTER:
688 process_pointer_pdu(s);
689 break;
690
691 case RDP_DATA_PDU_BELL:
692 ui_bell();
693 break;
694
695 case RDP_DATA_PDU_LOGON:
696 /* User logged on */
697 break;
698
699 default:
700 unimpl("data PDU %d\n", data_pdu_type);
701 }
702 }
703
704 /* Process incoming packets */
705 void
706 rdp_main_loop(void)
707 {
708 uint8 type;
709 STREAM s;
710
711 while ((s = rdp_recv(&type)) != NULL)
712 {
713 switch (type)
714 {
715 case RDP_PDU_DEMAND_ACTIVE:
716 process_demand_active(s);
717 break;
718
719 case RDP_PDU_DEACTIVATE:
720 break;
721
722 case RDP_PDU_DATA:
723 process_data_pdu(s);
724 break;
725
726 case 0:
727 break;
728
729 default:
730 unimpl("PDU %d\n", type);
731 }
732 }
733 }
734
735 /* Establish a connection up to the RDP layer */
736 BOOL
737 rdp_connect(char *server, uint32 flags, char *domain, char *password,
738 char *command, char *directory)
739 {
740 if (!sec_connect(server))
741 return False;
742
743 rdp_send_logon_info(flags, domain, username, password, command, directory);
744 return True;
745 }
746
747 /* Disconnect from the RDP layer */
748 void
749 rdp_disconnect(void)
750 {
751 sec_disconnect();
752 }

  ViewVC Help
Powered by ViewVC 1.1.26