Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

parse monitor/display info #1692

Open
wants to merge 1 commit into
base: devel
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions common/ms-rdpbcgr.h
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@
#define SEC_TAG_CLI_CHANNELS 0xc003 /* CS_CHANNELS? */
#define SEC_TAG_CLI_4 0xc004 /* CS_CLUSTER? */
#define SEC_TAG_CLI_MONITOR 0xc005 /* CS_MONITOR */
#define SEC_TAG_CLI_MONITOR_EX 0xc008 /* CS_MONITOR_EX */

/* Client Core Data: colorDepth, postBeta2ColorDepth (2.2.1.3.2) */
#define RNS_UD_COLOR_4BPP 0xCA00
Expand Down
14 changes: 14 additions & 0 deletions common/xrdp_client_info.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,13 +23,21 @@
#if !defined(XRDP_CLIENT_INFO_H)
#define XRDP_CLIENT_INFO_H

/* 2.2.1.3.6.1 Monitor Definition (TS_MONITOR_DEF)
* 2.2.1.3.9.1 Monitor Attributes (TS_MONITOR_ATTRIBUTES)
*/
struct monitor_info
{
int left;
int top;
int right;
int bottom;
int is_primary;
int physical_width;
int physical_height;
int orientation;
int desktop_scale_factor;
int device_scale_factor;
};

struct xrdp_client_info
Expand Down Expand Up @@ -162,6 +170,12 @@ struct xrdp_client_info

int enable_token_login;
char domain_user_separator[16];

int physical_width;
int physical_height;
int orientation;
int desktop_scale_factor;
int device_scale_factor;
};

#endif
98 changes: 94 additions & 4 deletions libxrdp/xrdp_sec.c
Original file line number Diff line number Diff line change
Expand Up @@ -1744,19 +1744,31 @@ xrdp_sec_process_mcs_data_CS_CORE(struct xrdp_sec* self, struct stream* s)
{
return 0;
}
in_uint8s(s, 4); /* desktopPhysicalWidth */
in_uint32_le(s, self->rdp_layer->client_info.physical_width); /* desktopPhysicalWidth */

if (!s_check_rem(s, 4))
{
return 0;
}
in_uint8s(s, 4); /* desktopPhysicalHeight */
in_uint32_le(s, self->rdp_layer->client_info.physical_height); /* desktopPhysicalHeight */

if (!s_check_rem(s, 2))
{
return 0;
}
in_uint8s(s, 2); /* reserved */
in_uint16_le(s, self->rdp_layer->client_info.orientation); /* desktopOrientation */

if (!s_check_rem(s, 4))
{
return 0;
}
in_uint32_le(s, self->rdp_layer->client_info.desktop_scale_factor);

if (!s_check_rem(s, 4))
{
return 0;
}
in_uint32_le(s, self->rdp_layer->client_info.device_scale_factor);

return 0;
}
Expand Down Expand Up @@ -2046,6 +2058,79 @@ xrdp_sec_process_mcs_data_monitors(struct xrdp_sec *self, struct stream *s)
return 0;
}

static int
xrdp_sec_process_msc_data_monitorex(struct xrdp_sec *self, struct stream* s)
{
uint32_t flags;
uint32_t size;
uint32_t count;
uint32_t index;
struct xrdp_client_info *client_info = &self->rdp_layer->client_info;

if (client_info->multimon != 1) {
LLOGLN(0, ("[INFO] xrdp_sec_process_msc_data_monitorex: multimon is not "
"allowed, skipping"));
return 0;
}
in_uint32_le(s, flags);
if (flags != 0) {
LLOGLN(0, ("[ERROR] xrdp_sec_process_msc_data_monitorex: flags MUST be "
"zero, detected: 0x%x", flags));
return 1;
}
in_uint32_le(s, size);
if (size != 20) {
LLOGLN(0, ("[ERROR] xrdp_sec_process_msc_data_monitorex: monitorAttributeSize MUST be "
"20, detected: %u", size));
return 1;
}
in_uint32_le(s, count);
if (count > 16)
{
LLOGLN(0, ("[ERROR] xrdp_sec_process_msc_data_monitorex: max allowed "
"monitors is 16, detected: %d", count));
return 1;
}

for (index = 0; index < count; index++)
{
in_uint32_le(s, client_info->minfo[index].physical_width);
if (client_info->minfo[index].physical_width < 10 ||
client_info->minfo[index].physical_width > 10000) {
LLOGLN(0, ("[INFO] xrdp_sec_process_msc_data_monitorex: ignore "
"invalid physical_width: %d",
client_info->minfo[index].physical_width));
client_info->minfo[index].physical_width = 0;
}
in_uint32_le(s, client_info->minfo[index].physical_height);
if (client_info->minfo[index].physical_height < 10 ||
client_info->minfo[index].physical_height > 10000) {
LLOGLN(0, ("[INFO] xrdp_sec_process_msc_data_monitorex: ignore "
"invalid physical_height: %d",
client_info->minfo[index].physical_height));
client_info->minfo[index].physical_height = 0;
}
in_uint32_le(s, client_info->minfo[index].orientation);
switch (client_info->minfo[index].orientation) {
case 0:
case 90:
case 180:
case 270:
break;
default:
LLOGLN(0, ("[INFO] xrdp_sec_process_msc_data_monitorex: ignore "
"invalid orientation: %d",
client_info->minfo[index].orientation));
client_info->minfo[index].orientation = 0;
break;
}
in_uint32_le(s, client_info->minfo[index].desktop_scale_factor);
in_uint32_le(s, client_info->minfo[index].device_scale_factor);
}

return 0;
}

/*****************************************************************************/
/* process client mcs data, we need some things in here to create the server
mcs data */
Expand Down Expand Up @@ -2108,9 +2193,14 @@ xrdp_sec_process_mcs_data(struct xrdp_sec *self)
{
return 1;
}
break;
case SEC_TAG_CLI_MONITOR_EX:
if (xrdp_sec_process_msc_data_monitorex(self, s) != 0)
{
return 1;
}
break;
/* CS_MCS_MSGCHANNEL 0xC006
CS_MONITOR_EX 0xC008
CS_MULTITRANSPORT 0xC00A
SC_CORE 0x0C01
SC_SECURITY 0x0C02
Expand Down