Skip to content

Commit

Permalink
Merge pull request #168 from derfian/issue66-ts_fp_update_pdu
Browse files Browse the repository at this point in the history
Clarify capability sets and Fast-Path code
  • Loading branch information
hean01-cendio committed Oct 16, 2017
2 parents e669be6 + 12ee9eb commit 0e530e6
Show file tree
Hide file tree
Showing 5 changed files with 347 additions and 155 deletions.
118 changes: 116 additions & 2 deletions constants.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,40 @@
#define DEFAULT_CODEPAGE "UTF-8"
#define WINDOWS_CODEPAGE "UTF-16LE"

/* T-REC-T.123-200701, section 8 */
#define T123_HEADER_VERSION 0x3

/* [MS-RDPBCGR] 2.2.9.1.2 */
#define FASTPATH_OUTPUT_ACTION_FASTPATH 0x0
#define FASTPATH_OUTPUT_ACTION_X224 T123_HEADER_VERSION

#define FASTPATH_OUTPUT_SECURE_CHECKSUM 0x1
#define FASTPATH_OUTPUT_ENCRYPTED 0x2

#define IS_FASTPATH(hdr) ((hdr & 0x03) == FASTPATH_OUTPUT_ACTION_FASTPATH)
#define IS_SLOWPATH(hdr) ((hdr) == FASTPATH_OUTPUT_ACTION_X224)

/* [MS-RDPBCGR] 2.2.9.1.2.1 */
/* adjusted for position in updateHeader */
#define FASTPATH_UPDATETYPE_ORDERS 0x0
#define FASTPATH_UPDATETYPE_BITMAP 0x1
#define FASTPATH_UPDATETYPE_PALETTE 0x2
#define FASTPATH_UPDATETYPE_SYNCHRONIZE 0x3
#define FASTPATH_UPDATETYPE_SURFCMDS 0x4
#define FASTPATH_UPDATETYPE_PTR_NULL 0x5
#define FASTPATH_UPDATETYPE_PTR_DEFAULT 0x6
#define FASTPATH_UPDATETYPE_PTR_POSITION 0x8
#define FASTPATH_UPDATETYPE_COLOR 0x9
#define FASTPATH_UPDATETYPE_CACHED 0xA
#define FASTPATH_UPDATETYPE_POINTER 0xB

#define FASTPATH_FRAGMENT_SINGLE (0x0 << 4)
#define FASTPATH_FRAGMENT_LAST (0x1 << 4)
#define FASTPATH_FRAGMENT_FIRST (0x2 << 4)
#define FASTPATH_FRAGMENT_NEXT (0x3 << 4)

#define FASTPATH_OUTPUT_COMPRESSION_USED (0x2 << 6)

/* ISO PDU codes */
enum ISO_PDU_CODE
{
Expand Down Expand Up @@ -220,10 +254,11 @@ enum RDP_POINTER_PDU_TYPE
RDP_POINTER_NEW = 8
};

/* [MS-RDPBCGR] 2.2.9.1.1.4.3 */
enum RDP_SYSTEM_POINTER_TYPE
{
RDP_NULL_POINTER = 0,
RDP_DEFAULT_POINTER = 0x7F00
SYSPTR_NULL = 0x00000000,
SYSPTR_DEFAULT = 0x00007F00
};

enum RDP_INPUT_DEVICE
Expand Down Expand Up @@ -324,9 +359,21 @@ enum RDP_INPUT_DEVICE
#define RDP_CAPSET_COLCACHE 10
#define RDP_CAPLEN_COLCACHE 0x08

#define RDP_CAPSET_SOUND 12
#define RDP_CAPLEN_SOUND 8

#define RDP_CAPSET_INPUT 13
#define RDP_CAPLEN_INPUT 88

#define RDP_CAPSET_FONT 14
#define RDP_CAPLEN_FONT 8

#define RDP_CAPSET_BRUSHCACHE 15
#define RDP_CAPLEN_BRUSHCACHE 0x08

#define RDP_CAPSET_GLYPHCACHE 16
#define RDP_CAPLEN_GLYPHCACHE 52

#define RDP_CAPSET_BMPCACHE2 19
#define RDP_CAPLEN_BMPCACHE2 0x28
#define BMPCACHE2_FLAG_PERSIST ((uint32)1<<31)
Expand Down Expand Up @@ -626,3 +673,70 @@ enum RDP_PDU_REDIRECT_FLAGS
LB_REDIRECTION_GUID = 0x8000,
LB_TARGET_CERTIFICATE = 0x10000
};


/* [MS-RDPBCGR] 2.2.7.1.1 */
#define OSMAJORTYPE_WINDOWS 0x0001
#define OSMINORTYPE_WINDOWSNT 0x0003
#define TS_CAPS_PROTOCOLVERSION 0x0200

/* extraFlags, [MS-RDPBCGR] 2.2.7.1.1 */
#define FASTPATH_OUTPUT_SUPPORTED 0x0001
#define LONG_CREDENTIALS_SUPPORTED 0x0004
#define AUTORECONNECT_SUPPORTED 0x0008
#define ENC_SALTED_CHECKSUM 0x0010
#define NO_BITMAP_COMPRESSION_HDR 0x0400

/* orderFlags, [MS-RDPBCGR] 2.2.7.1.3 */
#define NEGOTIATEORDERSUPPORT 0x0002
#define ZEROBOUNDSDELTASSUPPORT 0x0008
#define COLORINDEXSUPPORT 0x0020
#define SOLIDPATTERNBRUSHONLY 0x0040
#define ORDERFLAGS_EXTRA_FLAGS 0x0080

/* orderSupport index, [MS-RDPBCGR] 2.2.7.1.3 */
#define TS_NEG_DSTBLT_INDEX 0x00
#define TS_NEG_PATBLT_INDEX 0x01
#define TS_NEG_SCRBLT_INDEX 0x02
#define TS_NEG_MEMBLT_INDEX 0x03
#define TS_NEG_MEM3BLT_INDEX 0x04
#define TS_NEG_DRAWNINEGRID_INDEX 0x07
#define TS_NEG_LINETO_INDEX 0x08
#define TS_NEG_MULTI_DRAWNINEGRID_INDEX 0x09
#define TS_NEG_SAVEBITMAP_INDEX 0x0B
#define TS_NEG_MULTIDSTBLT_INDEX 0x0F
#define TS_NEG_MULTIPATBLT_INDEX 0x10
#define TS_NEG_MULTISCRBLT_INDEX 0x11
#define TS_NEG_MULTIOPAQUERECT_INDEX 0x12
#define TS_NEG_FAST_INDEX_INDEX 0x13
#define TS_NEG_POLYGON_SC_INDEX 0x14
#define TS_NEG_POLYGON_CB_INDEX 0x15
#define TS_NEG_POLYLINE_INDEX 0x16
#define TS_NEG_FAST_GLYPH_INDEX 0x18
#define TS_NEG_ELLIPSE_SC_INDEX 0x19
#define TS_NEG_ELLIPSE_CB_INDEX 0x1A
#define TS_NEG_INDEX_INDEX 0x1B

/* [MS-RDPBCGR] 2.2.7.1.6 */
#define INPUT_FLAG_SCANCODES 0x0001
#define INPUT_FLAG_MOUSEX 0x0004
#define INPUT_FLAG_FASTPATH_INPUT 0x0008
#define INPUT_FLAG_UNICODE 0x0010
#define INPUT_FLAG_FASTPATH_INPUT2 0x0020
#define INPUT_FLAG_UNUSED1 0x0040
#define INPUT_FLAG_UNUSED2 0x0080
#define TS_INPUT_FLAG_MOUSE_HWHEEL 0x0100
#define TS_INPUT_FLAG_QOE_TIMESTAMPS 0x0200

/* [MS-RDPBCGR] 2.2.7.1.8 */
#define GLYPH_SUPPORT_NONE 0x0000
#define GLYPH_SUPPORT_PARTIAL 0x0001
#define GLYPH_SUPPORT_FULL 0x0002
#define GLYPH_SUPPORT_ENCODE 0x0003

/* [MS-RDPBCGR] 2.2.7.1.11 */
#define SOUND_BEEPS_FLAG 0x0001

/* [MS-RDPBCGR] 2.2.7.2.5 */
#define FONTSUPPORT_FONTLIST 0x0001

15 changes: 8 additions & 7 deletions iso.c
Original file line number Diff line number Diff line change
Expand Up @@ -110,16 +110,17 @@ iso_recv_msg(uint8 * code, uint8 * rdpver)
in_uint8(s, version);
if (rdpver != NULL)
*rdpver = version;
if (version == 3)
if (IS_SLOWPATH(version))
{
in_uint8s(s, 1); /* pad */
in_uint16_be(s, length);
in_uint8s(s, 1); /* reserved */
in_uint16_be(s, length); /* length */
}
else
{
in_uint8(s, length);
in_uint8(s, length); /* length1 */
if (length & 0x80)
{
/* length2 is only present if the most significant bit of length1 is set */
length &= ~0x80;
next_be(s, length);
}
Expand All @@ -132,7 +133,7 @@ iso_recv_msg(uint8 * code, uint8 * rdpver)
s = tcp_recv(s, length - 4);
if (s == NULL)
return NULL;
if (version != 3)
if (IS_FASTPATH(version))
return s;
in_uint8s(s, 1); /* hdrlen */
in_uint8(s, *code);
Expand Down Expand Up @@ -166,7 +167,7 @@ iso_send(STREAM s)
s_pop_layer(s, iso_hdr);
length = s->end - s->p;

out_uint8(s, 3); /* version */
out_uint8(s, T123_HEADER_VERSION); /* version */
out_uint8(s, 0); /* reserved */
out_uint16_be(s, length);

Expand All @@ -188,7 +189,7 @@ iso_recv(uint8 * rdpver)
if (s == NULL)
return NULL;
if (rdpver != NULL)
if (*rdpver != 3)
if (IS_FASTPATH(*rdpver))
return s;
if (code != ISO_PDU_DT)
{
Expand Down
3 changes: 2 additions & 1 deletion proto.h
Original file line number Diff line number Diff line change
Expand Up @@ -144,7 +144,7 @@ int rd_write_file(int fd, void *ptr, int len);
int rd_lseek_file(int fd, int offset);
RD_BOOL rd_lock_file(int fd, int start, int len);
/* rdp5.c */
void rdp5_process(STREAM s);
void process_ts_fp_updates(STREAM s);
/* rdp.c */
void rdp_in_unistr(STREAM s, int in_len, char **string, uint32 * str_size);
void rdp_send_input(uint32 time, uint16 message_type, uint16 device_flags, uint16 param1,
Expand All @@ -154,6 +154,7 @@ void process_colour_pointer_pdu(STREAM s);
void process_new_pointer_pdu(STREAM s);
void process_cached_pointer_pdu(STREAM s);
void process_system_pointer_pdu(STREAM s);
void set_system_pointer(uint32 ptr);
void process_bitmap_updates(STREAM s);
void process_palette(STREAM s);
void process_disconnect_pdu(STREAM s, uint32 * ext_disc_reason);
Expand Down
Loading

0 comments on commit 0e530e6

Please sign in to comment.