34 |
extern int g_width; |
extern int g_width; |
35 |
extern int g_height; |
extern int g_height; |
36 |
extern BOOL g_bitmap_cache; |
extern BOOL g_bitmap_cache; |
37 |
|
extern BOOL g_bitmap_cache_persist_enable; |
38 |
|
|
39 |
uint8 *g_next_packet; |
uint8 *g_next_packet; |
40 |
uint32 g_rdp_shareid; |
uint32 g_rdp_shareid; |
367 |
rdp_send_data(s, RDP_DATA_PDU_INPUT); |
rdp_send_data(s, RDP_DATA_PDU_INPUT); |
368 |
} |
} |
369 |
|
|
370 |
|
/* 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 |
/* Send an (empty) font information PDU */ |
/* Send an (empty) font information PDU */ |
416 |
static void |
static void |
417 |
rdp_send_fonts(uint16 seq) |
rdp_send_fonts(uint16 seq) |
532 |
out_uint16_le(s, 0x1000 * Bpp); /* max cell size */ |
out_uint16_le(s, 0x1000 * Bpp); /* max cell size */ |
533 |
} |
} |
534 |
|
|
535 |
|
/* 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 |
/* Output control capability set */ |
/* Output control capability set */ |
560 |
static void |
static void |
561 |
rdp_out_control_caps(STREAM s) |
rdp_out_control_caps(STREAM s) |
615 |
out_uint16(s, 0); /* pad */ |
out_uint16(s, 0); /* pad */ |
616 |
} |
} |
617 |
|
|
618 |
static uint8 canned_caps[] = { |
static uint8 caps_0x0d[] = { |
619 |
0x01, 0x00, 0x00, 0x00, 0x09, 0x04, 0x00, 0x00, 0x04, |
0x01, 0x00, 0x00, 0x00, 0x09, 0x04, 0x00, 0x00, |
620 |
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, |
0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
621 |
0x00, 0x00, 0x00, 0x00, 0x00, |
0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
622 |
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
623 |
0x00, 0x00, 0x00, 0x00, 0x00, |
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
624 |
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
625 |
0x00, 0x00, 0x00, 0x00, 0x00, |
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
626 |
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
627 |
0x00, 0x00, 0x00, 0x00, 0x00, |
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
628 |
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
629 |
0x0C, 0x00, 0x08, 0x00, 0x01, |
0x00, 0x00, 0x00, 0x00 |
|
0x00, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x00, 0x01, 0x00, 0x00, 0x00, |
|
|
0x10, 0x00, 0x34, 0x00, 0xFE, |
|
|
0x00, 0x04, 0x00, 0xFE, 0x00, 0x04, 0x00, 0xFE, 0x00, 0x08, 0x00, |
|
|
0xFE, 0x00, 0x08, 0x00, 0xFE, |
|
|
0x00, 0x10, 0x00, 0xFE, 0x00, 0x20, 0x00, 0xFE, 0x00, 0x40, 0x00, |
|
|
0xFE, 0x00, 0x80, 0x00, 0xFE, |
|
|
0x00, 0x00, 0x01, 0x40, 0x00, 0x00, 0x08, 0x00, 0x01, 0x00, 0x01, |
|
|
0x02, 0x00, 0x00, 0x00 |
|
630 |
}; |
}; |
631 |
|
|
632 |
/* Output unknown capability sets (number 13, 12, 14 and 16) */ |
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 |
static void |
static void |
647 |
rdp_out_unknown_caps(STREAM s) |
rdp_out_unknown_caps(STREAM s, uint16 id, uint16 length, uint8 *caps) |
648 |
{ |
{ |
649 |
out_uint16_le(s, RDP_CAPSET_UNKNOWN); |
out_uint16_le(s, id); |
650 |
out_uint16_le(s, 0x58); |
out_uint16_le(s, length); |
651 |
|
|
652 |
out_uint8p(s, canned_caps, RDP_CAPLEN_UNKNOWN - 4); |
out_uint8p(s, caps, length - 4); |
653 |
} |
} |
654 |
|
|
655 |
#define RDP5_FLAG 0x0030 |
#define RDP5_FLAG 0x0030 |
663 |
RDP_CAPLEN_GENERAL + RDP_CAPLEN_BITMAP + RDP_CAPLEN_ORDER + |
RDP_CAPLEN_GENERAL + RDP_CAPLEN_BITMAP + RDP_CAPLEN_ORDER + |
664 |
RDP_CAPLEN_BMPCACHE + RDP_CAPLEN_COLCACHE + |
RDP_CAPLEN_BMPCACHE + RDP_CAPLEN_COLCACHE + |
665 |
RDP_CAPLEN_ACTIVATE + RDP_CAPLEN_CONTROL + |
RDP_CAPLEN_ACTIVATE + RDP_CAPLEN_CONTROL + |
666 |
RDP_CAPLEN_POINTER + RDP_CAPLEN_SHARE + RDP_CAPLEN_UNKNOWN + 4 /* w2k fix, why? */ ; |
RDP_CAPLEN_POINTER + RDP_CAPLEN_SHARE + |
667 |
|
0x58 + 0x08 + 0x08 + 0x34 /* unknown caps */ + |
668 |
|
4 /* w2k fix, why? */ ; |
669 |
|
|
670 |
s = sec_init(sec_flags, 6 + 14 + caplen + sizeof(RDP_SOURCE)); |
s = sec_init(sec_flags, 6 + 14 + caplen + sizeof(RDP_SOURCE)); |
671 |
|
|
685 |
rdp_out_general_caps(s); |
rdp_out_general_caps(s); |
686 |
rdp_out_bitmap_caps(s); |
rdp_out_bitmap_caps(s); |
687 |
rdp_out_order_caps(s); |
rdp_out_order_caps(s); |
688 |
rdp_out_bmpcache_caps(s); |
g_use_rdp5 ? rdp_out_bmpcache2_caps(s) : rdp_out_bmpcache_caps(s); |
689 |
rdp_out_colcache_caps(s); |
rdp_out_colcache_caps(s); |
690 |
rdp_out_activate_caps(s); |
rdp_out_activate_caps(s); |
691 |
rdp_out_control_caps(s); |
rdp_out_control_caps(s); |
692 |
rdp_out_pointer_caps(s); |
rdp_out_pointer_caps(s); |
693 |
rdp_out_share_caps(s); |
rdp_out_share_caps(s); |
|
rdp_out_unknown_caps(s); |
|
694 |
|
|
695 |
|
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 |
s_mark_end(s); |
s_mark_end(s); |
701 |
sec_send(s, sec_flags); |
sec_send(s, sec_flags); |
702 |
} |
} |
740 |
if (g_width != width || g_height != height) |
if (g_width != width || g_height != height) |
741 |
{ |
{ |
742 |
warning("screen size changed from %dx%d to %dx%d\n", g_width, g_height, |
warning("screen size changed from %dx%d to %dx%d\n", g_width, g_height, |
743 |
width, height); |
width, height); |
744 |
g_width = width; |
g_width = width; |
745 |
g_height = height; |
g_height = height; |
746 |
ui_resize_window(); |
ui_resize_window(); |
747 |
} |
} |
748 |
} |
} |
749 |
|
|
750 |
/* Respond to a demand active PDU */ |
/* Process server capabilities */ |
751 |
static void |
void |
752 |
process_demand_active(STREAM s) |
rdp_process_server_caps(STREAM s, uint16 length) |
753 |
{ |
{ |
754 |
int n; |
int n; |
755 |
uint8 type, *next; |
uint8 *next, *start; |
756 |
uint16 len_src_descriptor, len_combined_caps, num_capsets, capset_type, capset_length; |
uint16 ncapsets, capset_type, capset_length; |
757 |
|
|
758 |
in_uint32_le(s, g_rdp_shareid); |
start = s->p; |
|
in_uint16_le(s, len_src_descriptor); |
|
|
in_uint16_le(s, len_combined_caps); |
|
|
in_uint8s(s, len_src_descriptor); |
|
759 |
|
|
760 |
in_uint16_le(s, num_capsets); |
in_uint16_le(s, ncapsets); |
761 |
in_uint8s(s, 2); /* pad */ |
in_uint8s(s, 2); /* pad */ |
762 |
|
|
763 |
DEBUG(("DEMAND_ACTIVE(id=0x%x,num_caps=%d)\n", g_rdp_shareid, num_capsets)); |
for (n = 0; n < ncapsets; n++) |
|
|
|
|
for (n = 0; n < num_capsets; n++) |
|
764 |
{ |
{ |
765 |
|
if (s->p > start + length) |
766 |
|
return; |
767 |
|
|
768 |
in_uint16_le(s, capset_type); |
in_uint16_le(s, capset_type); |
769 |
in_uint16_le(s, capset_length); |
in_uint16_le(s, capset_length); |
770 |
|
|
783 |
|
|
784 |
s->p = next; |
s->p = next; |
785 |
} |
} |
786 |
|
} |
787 |
|
|
788 |
|
/* 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 |
rdp_send_confirm_active(); |
rdp_send_confirm_active(); |
804 |
rdp_send_synchronise(); |
rdp_send_synchronise(); |
811 |
|
|
812 |
if (g_use_rdp5) |
if (g_use_rdp5) |
813 |
{ |
{ |
814 |
|
rdp_enum_bmpcache2(); |
815 |
rdp_send_fonts(3); |
rdp_send_fonts(3); |
816 |
} |
} |
817 |
else |
else |