From d83f70bc322a031b0e771a93d397b85ad1cc280d Mon Sep 17 00:00:00 2001 From: akallabeth Date: Tue, 15 Nov 2022 15:04:13 +0100 Subject: [PATCH] [core,transport] event handle for transportIO With the latest client changes the internal event loop requires a handle to wait on. Add a new function to (re)set the newly added transport event handle. --- include/freerdp/transport_io.h | 2 ++ libfreerdp/core/connection.c | 4 ++-- libfreerdp/core/freerdp.c | 6 ++++++ libfreerdp/core/rdp.c | 7 +++++++ libfreerdp/core/rdp.h | 2 ++ libfreerdp/core/transport.c | 32 +++++++++++++++++++++++++++----- libfreerdp/core/transport.h | 2 ++ 7 files changed, 48 insertions(+), 7 deletions(-) diff --git a/include/freerdp/transport_io.h b/include/freerdp/transport_io.h index 1b12b7343..3e4f3733d 100644 --- a/include/freerdp/transport_io.h +++ b/include/freerdp/transport_io.h @@ -55,6 +55,8 @@ extern "C" }; typedef struct rdp_transport_io rdpTransportIo; + FREERDP_API BOOL freerdp_io_callback_set_event(rdpContext* context, BOOL reset); + FREERDP_API const rdpTransportIo* freerdp_get_io_callbacks(rdpContext* context); FREERDP_API BOOL freerdp_set_io_callbacks(rdpContext* context, const rdpTransportIo* io_callbacks); diff --git a/libfreerdp/core/connection.c b/libfreerdp/core/connection.c index 3d9b95ff8..d39d9af4a 100644 --- a/libfreerdp/core/connection.c +++ b/libfreerdp/core/connection.c @@ -393,8 +393,8 @@ BOOL rdp_client_connect(rdpRdp* rdp) for (; now < dueDate; now = GetTickCount64()) { - HANDLE events[MAXIMUM_WAIT_OBJECTS]; - DWORD status; + HANDLE events[MAXIMUM_WAIT_OBJECTS] = { 0 }; + DWORD status = 0; DWORD nevents = freerdp_get_event_handles(rdp->context, events, ARRAYSIZE(events)); if (!nevents) { diff --git a/libfreerdp/core/freerdp.c b/libfreerdp/core/freerdp.c index 85b880bd7..dc59b7105 100644 --- a/libfreerdp/core/freerdp.c +++ b/libfreerdp/core/freerdp.c @@ -1172,6 +1172,12 @@ const char* freerdp_nego_get_routing_token(rdpContext* context, DWORD* length) return (const char*)nego_get_routing_token(context->rdp->nego, length); } +BOOL freerdp_io_callback_set_event(rdpContext* context, BOOL set) +{ + WINPR_ASSERT(context); + return rdp_io_callback_set_event(context->rdp, set); +} + const rdpTransportIo* freerdp_get_io_callbacks(rdpContext* context) { WINPR_ASSERT(context); diff --git a/libfreerdp/core/rdp.c b/libfreerdp/core/rdp.c index b58a5ccb0..664a4d26b 100644 --- a/libfreerdp/core/rdp.c +++ b/libfreerdp/core/rdp.c @@ -2332,6 +2332,13 @@ void rdp_free(rdpRdp* rdp) } } +BOOL rdp_io_callback_set_event(rdpRdp* rdp, BOOL set) +{ + if (!rdp) + return FALSE; + return transport_io_callback_set_event(rdp->transport, set); +} + const rdpTransportIo* rdp_get_io_callbacks(rdpRdp* rdp) { if (!rdp) diff --git a/libfreerdp/core/rdp.h b/libfreerdp/core/rdp.h index df8f86244..937b917b1 100644 --- a/libfreerdp/core/rdp.h +++ b/libfreerdp/core/rdp.h @@ -254,6 +254,8 @@ FREERDP_LOCAL rdpRdp* rdp_new(rdpContext* context); FREERDP_LOCAL BOOL rdp_reset(rdpRdp* rdp); FREERDP_LOCAL void rdp_free(rdpRdp* rdp); +FREERDP_LOCAL BOOL rdp_io_callback_set_event(rdpRdp* rdp, BOOL reset); + FREERDP_LOCAL const rdpTransportIo* rdp_get_io_callbacks(rdpRdp* rdp); FREERDP_LOCAL BOOL rdp_set_io_callbacks(rdpRdp* rdp, const rdpTransportIo* io_callbacks); diff --git a/libfreerdp/core/transport.c b/libfreerdp/core/transport.c index 1327758b2..98495da6e 100644 --- a/libfreerdp/core/transport.c +++ b/libfreerdp/core/transport.c @@ -82,6 +82,7 @@ struct rdp_transport BOOL haveMoreBytesToRead; wLog* log; rdpTransportIo io; + HANDLE ioEvent; }; static void transport_ssl_cb(SSL* ssl, int where, int ret) @@ -988,7 +989,7 @@ fail: DWORD transport_get_event_handles(rdpTransport* transport, HANDLE* events, DWORD count) { - DWORD nCount = 1; /* always the reread Event */ + DWORD nCount = 0; /* always the reread Event */ DWORD tmp; WINPR_ASSERT(transport); @@ -1004,7 +1005,14 @@ DWORD transport_get_event_handles(rdpTransport* transport, HANDLE* events, DWORD return 0; } - events[0] = transport->rereadEvent; + events[nCount++] = transport->rereadEvent; + + if (transport->ioEvent) + { + if (count < 2) + return 0; + events[nCount++] = transport->ioEvent; + } } if (!transport->GatewayEnabled) @@ -1022,7 +1030,7 @@ DWORD transport_get_event_handles(rdpTransport* transport, HANDLE* events, DWORD if (transport->frontBio) { - if (BIO_get_event(transport->frontBio, &events[1]) != 1) + if (BIO_get_event(transport->frontBio, &events[nCount]) != 1) { WLog_Print(transport->log, WLOG_ERROR, "%s: error getting the frontBio handle", __FUNCTION__); @@ -1036,7 +1044,7 @@ DWORD transport_get_event_handles(rdpTransport* transport, HANDLE* events, DWORD { if (transport->rdg) { - tmp = rdg_get_event_handles(transport->rdg, &events[1], count - 1); + tmp = rdg_get_event_handles(transport->rdg, &events[nCount], count - nCount); if (tmp == 0) return 0; @@ -1045,7 +1053,7 @@ DWORD transport_get_event_handles(rdpTransport* transport, HANDLE* events, DWORD } else if (transport->tsg) { - tmp = tsg_get_event_handles(transport->tsg, &events[1], count - 1); + tmp = tsg_get_event_handles(transport->tsg, &events[nCount], count - nCount); if (tmp == 0) return 0; @@ -1313,6 +1321,11 @@ rdpTransport* transport_new(rdpContext* context) if (!transport->rereadEvent || transport->rereadEvent == INVALID_HANDLE_VALUE) goto fail; + transport->ioEvent = CreateEvent(NULL, TRUE, FALSE, NULL); + + if (!transport->ioEvent || transport->ioEvent == INVALID_HANDLE_VALUE) + goto fail; + transport->haveMoreBytesToRead = FALSE; transport->blocking = TRUE; transport->GatewayEnabled = FALSE; @@ -1344,6 +1357,7 @@ void transport_free(rdpTransport* transport) StreamPool_Free(transport->ReceivePool); CloseHandle(transport->connectedEvent); CloseHandle(transport->rereadEvent); + CloseHandle(transport->ioEvent); DeleteCriticalSection(&(transport->ReadLock)); DeleteCriticalSection(&(transport->WriteLock)); free(transport); @@ -1500,3 +1514,11 @@ HANDLE transport_get_front_bio(rdpTransport* transport) BIO_get_event(transport->frontBio, &hEvent); return hEvent; } + +BOOL transport_io_callback_set_event(rdpTransport* transport, BOOL set) +{ + WINPR_ASSERT(transport); + if (!set) + return ResetEvent(transport->ioEvent); + return SetEvent(transport->ioEvent); +} diff --git a/libfreerdp/core/transport.h b/libfreerdp/core/transport.h index 55218f98e..bab3abbca 100644 --- a/libfreerdp/core/transport.h +++ b/libfreerdp/core/transport.h @@ -87,6 +87,8 @@ FREERDP_LOCAL int transport_drain_output_buffer(rdpTransport* transport); FREERDP_LOCAL wStream* transport_receive_pool_take(rdpTransport* transport); FREERDP_LOCAL int transport_receive_pool_return(rdpTransport* transport, wStream* pdu); +FREERDP_LOCAL BOOL transport_io_callback_set_event(rdpTransport* transport, BOOL set); + FREERDP_LOCAL const rdpTransportIo* transport_get_io_callbacks(rdpTransport* transport); FREERDP_LOCAL BOOL transport_set_io_callbacks(rdpTransport* transport, const rdpTransportIo* io_callbacks);