From 697dcbb24dba5435bde75efc0caa44c2744a9938 Mon Sep 17 00:00:00 2001 From: matt335672 <30179339+matt335672@users.noreply.github.com> Date: Mon, 11 Mar 2024 11:00:53 +0000 Subject: [PATCH] Start the drdynvc channel within xrdp_wm The responsibility for starting the drdynvc channel is moved out of libxrdp into the application. This will make it easier to allow the application to check the channel is enabled before starting it. --- libxrdp/libxrdp.c | 17 ++++++++++ libxrdp/libxrdpinc.h | 2 ++ libxrdp/xrdp_channel.c | 75 +++++++++++++++++++++++------------------- libxrdp/xrdp_rdp.c | 1 - xrdp/xrdp_wm.c | 1 + 5 files changed, 61 insertions(+), 35 deletions(-) diff --git a/libxrdp/libxrdp.c b/libxrdp/libxrdp.c index f9009162..72bcf845 100644 --- a/libxrdp/libxrdp.c +++ b/libxrdp/libxrdp.c @@ -1406,6 +1406,23 @@ libxrdp_disable_channel(struct xrdp_session *session, int channel_id, return 1; } +/*****************************************************************************/ +int +libxrdp_drdynvc_start(struct xrdp_session *session) +{ + struct xrdp_rdp *rdp; + struct xrdp_sec *sec; + struct xrdp_channel *chan; + + LOG_DEVEL(LOG_LEVEL_TRACE, "libxrdp_drdynvc_start:"); + + rdp = (struct xrdp_rdp *) (session->rdp); + sec = rdp->sec_layer; + chan = sec->chan_layer; + return xrdp_channel_drdynvc_start(chan); +} + + /*****************************************************************************/ int libxrdp_drdynvc_open(struct xrdp_session *session, const char *name, diff --git a/libxrdp/libxrdpinc.h b/libxrdp/libxrdpinc.h index 69de7801..e026843c 100644 --- a/libxrdp/libxrdpinc.h +++ b/libxrdp/libxrdpinc.h @@ -241,6 +241,8 @@ int libxrdp_disable_channel(struct xrdp_session *session, int channel_id, int is_disabled); int +libxrdp_drdynvc_start(struct xrdp_session *session); +int libxrdp_drdynvc_open(struct xrdp_session *session, const char *name, int flags, struct xrdp_drdynvc_procs *procs, int *chan_id); diff --git a/libxrdp/xrdp_channel.c b/libxrdp/xrdp_channel.c index f43804d7..513dd2c8 100644 --- a/libxrdp/xrdp_channel.c +++ b/libxrdp/xrdp_channel.c @@ -752,46 +752,53 @@ xrdp_channel_drdynvc_send_capability_request(struct xrdp_channel *self) int xrdp_channel_drdynvc_start(struct xrdp_channel *self) { - int index; - int count; - struct mcs_channel_item *ci; - struct mcs_channel_item *dci; - - LOG_DEVEL(LOG_LEVEL_INFO, "xrdp_channel_drdynvc_start: drdynvc_channel_id %d", self->drdynvc_channel_id); + int rv = 0; + LOG_DEVEL(LOG_LEVEL_INFO, + "xrdp_channel_drdynvc_start: drdynvc_channel_id %d", + self->drdynvc_channel_id); if (self->drdynvc_channel_id != -1) { - LOG_DEVEL(LOG_LEVEL_INFO, "xrdp_channel_drdynvc_start: already started"); - return 0; - } - dci = NULL; - count = self->mcs_layer->channel_list->count; - for (index = 0; index < count; index++) - { - ci = (struct mcs_channel_item *) - list_get_item(self->mcs_layer->channel_list, index); - if (ci != NULL) - { - if (g_strcasecmp(ci->name, "drdynvc") == 0) - { - dci = ci; - } - } - } - if (dci != NULL) - { - self->drdynvc_channel_id = (dci->chanid - MCS_GLOBAL_CHANNEL) - 1; - LOG_DEVEL(LOG_LEVEL_DEBUG, - "Initializing Dynamic Virtual Channel with channel id %d", - self->drdynvc_channel_id); - xrdp_channel_drdynvc_send_capability_request(self); + LOG_DEVEL(LOG_LEVEL_INFO, + "xrdp_channel_drdynvc_start: already started"); } else { - LOG(LOG_LEVEL_WARNING, - "Dynamic Virtual Channel named 'drdynvc' not found, " - "channel not initialized"); + int index; + int count; + struct mcs_channel_item *ci; + struct mcs_channel_item *dci; + dci = NULL; + count = self->mcs_layer->channel_list->count; + for (index = 0; index < count; index++) + { + ci = (struct mcs_channel_item *) + list_get_item(self->mcs_layer->channel_list, index); + if (ci != NULL) + { + if (g_strcasecmp(ci->name, DRDYNVC_SVC_CHANNEL_NAME) == 0) + { + dci = ci; + break; + } + } + } + if (dci != NULL) + { + self->drdynvc_channel_id = (dci->chanid - MCS_GLOBAL_CHANNEL) - 1; + LOG_DEVEL(LOG_LEVEL_DEBUG, DRDYNVC_SVC_CHANNEL_NAME + "Initializing Dynamic Virtual Channel with channel id %d", + self->drdynvc_channel_id); + xrdp_channel_drdynvc_send_capability_request(self); + } + else + { + LOG(LOG_LEVEL_WARNING, + "Static channel '%s' not found. " + "Channel not initialized", DRDYNVC_SVC_CHANNEL_NAME); + rv = -1; + } } - return 0; + return rv; } /*****************************************************************************/ diff --git a/libxrdp/xrdp_rdp.c b/libxrdp/xrdp_rdp.c index 6be1ff6e..deefd7a1 100644 --- a/libxrdp/xrdp_rdp.c +++ b/libxrdp/xrdp_rdp.c @@ -1323,7 +1323,6 @@ xrdp_rdp_process_data_font(struct xrdp_rdp *self, struct stream *s) self->session->callback(self->session->id, 0x555a, 0, 0, 0, 0); } - xrdp_channel_drdynvc_start(self->sec_layer->chan_layer); } else { diff --git a/xrdp/xrdp_wm.c b/xrdp/xrdp_wm.c index fcf59e55..4b1f3bd8 100644 --- a/xrdp/xrdp_wm.c +++ b/xrdp/xrdp_wm.c @@ -2031,6 +2031,7 @@ callback(intptr_t id, int msg, intptr_t param1, intptr_t param2, LOWORD(param3), HIWORD(param3)); case 0x555a: // "yeah, up_and_running" + libxrdp_drdynvc_start(wm->session); xrdp_mm_up_and_running(wm->mm); break; }