diff --git a/src/protocols/rdp/guac_rdpdr/rdpdr_messages.c b/src/protocols/rdp/guac_rdpdr/rdpdr_messages.c index 406ad8fe..f36335aa 100644 --- a/src/protocols/rdp/guac_rdpdr/rdpdr_messages.c +++ b/src/protocols/rdp/guac_rdpdr/rdpdr_messages.c @@ -97,30 +97,34 @@ static void guac_rdpdr_send_client_capability(guac_rdpdrPlugin* rdpdr) { stream_write_uint16(output_stream, RDPDR_CTYP_CORE); stream_write_uint16(output_stream, PAKID_CORE_CLIENT_CAPABILITY); - /* Write content */ + /* Capability count + padding */ stream_write_uint16(output_stream, 2); stream_write_uint16(output_stream, 0); /* Padding */ - /* General capability */ - stream_write_uint16(output_stream, 1 /* CAP_GENERAL_TYPE */); + /* General capability header */ + stream_write_uint16(output_stream, CAP_GENERAL_TYPE); stream_write_uint16(output_stream, 44); - stream_write_uint32(output_stream, 2 /* GENERAL_CAPABILITY_VERSION_02 */); + stream_write_uint32(output_stream, GENERAL_CAPABILITY_VERSION_02); - stream_write_uint32(output_stream, *((uint32_t*) "GUAC")); /* osType - required to be ignored */ + /* General capability data */ + stream_write_uint32(output_stream, GUAC_OS_TYPE); /* osType - required to be ignored */ stream_write_uint32(output_stream, 0); /* osVersion */ - stream_write_uint16(output_stream, 1); /* protocolMajor */ - stream_write_uint16(output_stream, 0xA); /* protocolMinor */ + stream_write_uint16(output_stream, RDP_CLIENT_MAJOR_ALL); /* protocolMajor */ + stream_write_uint16(output_stream, RDP_CLIENT_MINOR_5_2); /* protocolMinor */ stream_write_uint32(output_stream, 0xFFFF); /* ioCode1 */ stream_write_uint32(output_stream, 0); /* ioCode2 */ - stream_write_uint32(output_stream, 7); /* extendedPDU */ - stream_write_uint32(output_stream, 0); /* extraFlags1 */ - stream_write_uint32(output_stream, 0); /* extraFlags2 */ - stream_write_uint32(output_stream, 0); /* SpecialTypeDeviceCap */ + stream_write_uint32(output_stream, + RDPDR_DEVICE_REMOVE_PDUS + | RDPDR_CLIENT_DISPLAY_NAME + | RDPDR_USER_LOGGEDON_PDU); /* extendedPDU */ + stream_write_uint32(output_stream, 0); /* extraFlags1 */ + stream_write_uint32(output_stream, 0); /* extraFlags2 */ + stream_write_uint32(output_stream, 0); /* SpecialTypeDeviceCap */ - /* Printer support */ - stream_write_uint16(output_stream, 2 /* CAP_PRINTER_TYPE */); + /* Printer support header */ + stream_write_uint16(output_stream, CAP_PRINTER_TYPE); stream_write_uint16(output_stream, 8); - stream_write_uint32(output_stream, 1 /* PRINT_CAPABILITY_VERSION_01 */); + stream_write_uint32(output_stream, PRINT_CAPABILITY_VERSION_01); svc_plugin_send((rdpSvcPlugin*) rdpdr, output_stream); guac_client_log_info(rdpdr->client, "Capabilities sent."); diff --git a/src/protocols/rdp/guac_rdpdr/rdpdr_messages.h b/src/protocols/rdp/guac_rdpdr/rdpdr_messages.h index 8743431e..536e37ab 100644 --- a/src/protocols/rdp/guac_rdpdr/rdpdr_messages.h +++ b/src/protocols/rdp/guac_rdpdr/rdpdr_messages.h @@ -68,6 +68,59 @@ #define PAKID_CORE_USER_LOGGEDON 0x554C #define PAKID_PRN_USING_XPS 0x5543 +/** + * A 32-bit arbitrary value for the osType field of certain requests. As this + * value is defined as completely arbitrary and required to be ignored by the + * server, we send "GUAC" as an integer. + */ +#define GUAC_OS_TYPE (*((uint32_t*) "GUAC")) + +/* + * Capability types + */ + +#define CAP_GENERAL_TYPE 1 +#define CAP_PRINTER_TYPE 2 +#define CAP_PORT_TYPE 3 +#define CAP_DRIVE_TYPE 4 +#define CAP_SMARTCARD_TYPE 5 + +/* + * General capability header versions. + */ + +#define GENERAL_CAPABILITY_VERSION_01 1 +#define GENERAL_CAPABILITY_VERSION_02 2 + +/* + * Print capability header versions. + */ + +#define PRINT_CAPABILITY_VERSION_01 1 + +/* + * Legal client major version numbers. + */ + +#define RDP_CLIENT_MAJOR_ALL 1 + +/* + * Legal client minor version numbers. + */ + +#define RDP_CLIENT_MINOR_6_1 0xC +#define RDP_CLIENT_MINOR_5_2 0xA +#define RDP_CLIENT_MINOR_5_1 0x5 +#define RDP_CLIENT_MINOR_5_0 0x2 + +/* + * PDU flags used by the extendedPDU field. + */ + +#define RDPDR_DEVICE_REMOVE_PDUS 0x1 +#define RDPDR_CLIENT_DISPLAY_NAME 0x2 +#define RDPDR_USER_LOGGEDON_PDU 0x4 + /* * Message handlers. */