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.
This commit is contained in:
Karl Mikaelsson 2017-10-16 12:54:17 +02:00
parent 276ea5e16b
commit 99f5925cce
2 changed files with 23 additions and 7 deletions

View File

@ -57,7 +57,7 @@
#define FASTPATH_OUTPUT_COMPRESSION_USED (0x2 << 6) #define FASTPATH_OUTPUT_COMPRESSION_USED (0x2 << 6)
#define RDESKTOP_FASTPATH_MULTIFRAGMENT_MAX_SIZE 32767 #define RDESKTOP_FASTPATH_MULTIFRAGMENT_MAX_SIZE 65535
/* ISO PDU codes */ /* ISO PDU codes */
enum ISO_PDU_CODE enum ISO_PDU_CODE
@ -383,6 +383,9 @@ enum RDP_INPUT_DEVICE
#define RDP_CAPSET_MULTIFRAGMENTUPDATE 26 #define RDP_CAPSET_MULTIFRAGMENTUPDATE 26
#define RDP_CAPLEN_MULTIFRAGMENTUPDATE 8 #define RDP_CAPLEN_MULTIFRAGMENTUPDATE 8
#define RDP_CAPSET_LARGE_POINTER 27
#define RDP_CAPLEN_LARGE_POINTER 6
#define RDP_SOURCE "MSTSC" #define RDP_SOURCE "MSTSC"
/* Logon flags */ /* Logon flags */
@ -745,3 +748,5 @@ enum RDP_PDU_REDIRECT_FLAGS
/* [MS-RDPBCGR] 2.2.7.2.5 */ /* [MS-RDPBCGR] 2.2.7.2.5 */
#define FONTSUPPORT_FONTLIST 0x0001 #define FONTSUPPORT_FONTLIST 0x0001
/* [MS-RDPBCGR] 2.2.7.2.7 */
#define LARGE_POINTER_FLAG_96x96 1

23
rdp.c
View File

@ -941,6 +941,16 @@ rdp_out_ts_multifragmentupdate_capabilityset(STREAM s)
out_uint32_le(s, RDESKTOP_FASTPATH_MULTIFRAGMENT_MAX_SIZE); /* MaxRequestSize */ 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 #define RDP5_FLAG 0x0030
/* Send a confirm active PDU */ /* Send a confirm active PDU */
static void static void
@ -962,6 +972,7 @@ rdp_send_confirm_active(void)
RDP_CAPLEN_SOUND + RDP_CAPLEN_SOUND +
RDP_CAPLEN_GLYPHCACHE + RDP_CAPLEN_GLYPHCACHE +
RDP_CAPLEN_MULTIFRAGMENTUPDATE + RDP_CAPLEN_MULTIFRAGMENTUPDATE +
RDP_CAPLEN_LARGE_POINTER +
4 /* w2k fix, sessionid */ ; 4 /* w2k fix, sessionid */ ;
if (g_rdp_version >= RDP_V5) if (g_rdp_version >= RDP_V5)
@ -987,7 +998,7 @@ rdp_send_confirm_active(void)
out_uint16_le(s, caplen); out_uint16_le(s, caplen);
out_uint8p(s, RDP_SOURCE, sizeof(RDP_SOURCE)); 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 */ out_uint8s(s, 2); /* pad */
rdp_out_ts_general_capabilityset(s); rdp_out_ts_general_capabilityset(s);
@ -1014,6 +1025,7 @@ rdp_send_confirm_active(void)
rdp_out_ts_font_capabilityset(s); rdp_out_ts_font_capabilityset(s);
rdp_out_ts_glyphcache_capabilityset(s); rdp_out_ts_glyphcache_capabilityset(s);
rdp_out_ts_multifragmentupdate_capabilityset(s); rdp_out_ts_multifragmentupdate_capabilityset(s);
rdp_out_ts_large_pointer_capabilityset(s);
s_mark_end(s); s_mark_end(s);
sec_send(s, sec_flags); sec_send(s, sec_flags);
@ -1171,11 +1183,10 @@ process_colour_pointer_common(STREAM s, int bpp)
in_uint16_le(s, datalen); in_uint16_le(s, datalen);
in_uint8p(s, data, datalen); in_uint8p(s, data, datalen);
in_uint8p(s, mask, masklen); in_uint8p(s, mask, masklen);
if ((width != 32) || (height != 32))
{ logger(Protocol, Debug,
logger(Protocol, Warning, "process_colour_pointer_common(), width %d height %d", "process_colour_pointer_common(), new pointer %d with width %d and height %d",
width, height); cache_idx, width, height);
}
/* keep hotspot within cursor bounding box */ /* keep hotspot within cursor bounding box */
x = MIN(x, width - 1); x = MIN(x, width - 1);