From 99f5925cce8a003fc05c8d28f278591f637ce0fd Mon Sep 17 00:00:00 2001 From: Karl Mikaelsson Date: Mon, 16 Oct 2017 12:54:17 +0200 Subject: [PATCH] Enable support for large pointers The cursor-handling code already handles larger pointer sizes. This advertises that rdesktop has the capability to handle large cursors and adjusts the maximum size of fragmented packets to suit the large cursor requirements. Solves issue #173. --- constants.h | 7 ++++++- rdp.c | 23 +++++++++++++++++------ 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/constants.h b/constants.h index eb0820e..6b1128d 100644 --- a/constants.h +++ b/constants.h @@ -57,7 +57,7 @@ #define FASTPATH_OUTPUT_COMPRESSION_USED (0x2 << 6) -#define RDESKTOP_FASTPATH_MULTIFRAGMENT_MAX_SIZE 32767 +#define RDESKTOP_FASTPATH_MULTIFRAGMENT_MAX_SIZE 65535 /* ISO PDU codes */ enum ISO_PDU_CODE @@ -383,6 +383,9 @@ enum RDP_INPUT_DEVICE #define RDP_CAPSET_MULTIFRAGMENTUPDATE 26 #define RDP_CAPLEN_MULTIFRAGMENTUPDATE 8 +#define RDP_CAPSET_LARGE_POINTER 27 +#define RDP_CAPLEN_LARGE_POINTER 6 + #define RDP_SOURCE "MSTSC" /* Logon flags */ @@ -745,3 +748,5 @@ enum RDP_PDU_REDIRECT_FLAGS /* [MS-RDPBCGR] 2.2.7.2.5 */ #define FONTSUPPORT_FONTLIST 0x0001 +/* [MS-RDPBCGR] 2.2.7.2.7 */ +#define LARGE_POINTER_FLAG_96x96 1 diff --git a/rdp.c b/rdp.c index 39c7f1a..21788f3 100644 --- a/rdp.c +++ b/rdp.c @@ -941,6 +941,16 @@ rdp_out_ts_multifragmentupdate_capabilityset(STREAM s) out_uint32_le(s, RDESKTOP_FASTPATH_MULTIFRAGMENT_MAX_SIZE); /* MaxRequestSize */ } +static void +rdp_out_ts_large_pointer_capabilityset(STREAM s) +{ + uint16 flags = LARGE_POINTER_FLAG_96x96; + + out_uint16_le(s, RDP_CAPSET_LARGE_POINTER); + out_uint16_le(s, RDP_CAPLEN_LARGE_POINTER); + out_uint16_le(s, flags); /* largePointerSupportFlags */ +} + #define RDP5_FLAG 0x0030 /* Send a confirm active PDU */ static void @@ -962,6 +972,7 @@ rdp_send_confirm_active(void) RDP_CAPLEN_SOUND + RDP_CAPLEN_GLYPHCACHE + RDP_CAPLEN_MULTIFRAGMENTUPDATE + + RDP_CAPLEN_LARGE_POINTER + 4 /* w2k fix, sessionid */ ; if (g_rdp_version >= RDP_V5) @@ -987,7 +998,7 @@ rdp_send_confirm_active(void) out_uint16_le(s, caplen); out_uint8p(s, RDP_SOURCE, sizeof(RDP_SOURCE)); - out_uint16_le(s, 15); /* num_caps */ + out_uint16_le(s, 16); /* num_caps */ out_uint8s(s, 2); /* pad */ rdp_out_ts_general_capabilityset(s); @@ -1014,6 +1025,7 @@ rdp_send_confirm_active(void) rdp_out_ts_font_capabilityset(s); rdp_out_ts_glyphcache_capabilityset(s); rdp_out_ts_multifragmentupdate_capabilityset(s); + rdp_out_ts_large_pointer_capabilityset(s); s_mark_end(s); sec_send(s, sec_flags); @@ -1171,11 +1183,10 @@ process_colour_pointer_common(STREAM s, int bpp) in_uint16_le(s, datalen); in_uint8p(s, data, datalen); in_uint8p(s, mask, masklen); - if ((width != 32) || (height != 32)) - { - logger(Protocol, Warning, "process_colour_pointer_common(), width %d height %d", - width, height); - } + + logger(Protocol, Debug, + "process_colour_pointer_common(), new pointer %d with width %d and height %d", + cache_idx, width, height); /* keep hotspot within cursor bounding box */ x = MIN(x, width - 1);