BOOL rdg_tunnel_connect(rdpRdg* rdg) { BOOL status; DWORD nCount; HANDLE events[8]; rdg_send_handshake(rdg); nCount = rdg_get_event_handles(rdg, events, 8); if (nCount == 0) return FALSE; while (rdg->state < RDG_CLIENT_STATE_OPENED) { WaitForMultipleObjects(nCount, events, FALSE, 100); status = rdg_check_event_handles(rdg); if (!status) { rdg->context->rdp->transport->layer = TRANSPORT_LAYER_CLOSED; return FALSE; } } return TRUE; }
DWORD transport_get_event_handles(rdpTransport* transport, HANDLE* events, DWORD count) { DWORD nCount = 0; DWORD tmp; if (!transport->GatewayEnabled) { if (events && (nCount < count)) { if (BIO_get_event(transport->frontBio, &events[nCount]) != 1) return 0; nCount++; } } else { if (transport->rdg) { tmp = rdg_get_event_handles(transport->rdg, events, nCount - count); if (tmp == 0) return 0; nCount = tmp; } else if (transport->tsg) { tmp = tsg_get_event_handles(transport->tsg, events, nCount - count); if (tmp == 0) return 0; nCount = tmp; } } return nCount; }
BOOL rdg_in_channel_connect(rdpRdg* rdg, const char* hostname, UINT16 port, int timeout) { BOOL status; DWORD nCount; HANDLE events[8]; assert(hostname != NULL); status = rdg_tls_in_connect(rdg, hostname, port, timeout); if (!status) return FALSE; status = rdg_send_in_channel_request(rdg); if (!status) return FALSE; nCount = rdg_get_event_handles(rdg, events, 8); if (nCount == 0) return FALSE; while (rdg->state <= RDG_CLIENT_STATE_IN_CHANNEL_AUTHORIZE) { WaitForMultipleObjects(nCount, events, FALSE, 100); status = rdg_check_event_handles(rdg); if (!status) { rdg->context->rdp->transport->layer = TRANSPORT_LAYER_CLOSED; return FALSE; } } return TRUE; }
DWORD transport_get_event_handles(rdpTransport* transport, HANDLE* events, DWORD count) { DWORD nCount = 1; /* always the reread Event */ DWORD tmp; if (events) { if (count < 1) { WLog_Print(transport->log, WLOG_ERROR, "%s: provided handles array is too small", __FUNCTION__); return 0; } events[0] = transport->rereadEvent; } if (!transport->GatewayEnabled) { nCount++; if (events) { if (nCount > count) { WLog_Print(transport->log, WLOG_ERROR, "%s: provided handles array is too small (count=%"PRIu32" nCount=%"PRIu32")", __FUNCTION__, count, nCount); return 0; } if (BIO_get_event(transport->frontBio, &events[1]) != 1) { WLog_Print(transport->log, WLOG_ERROR, "%s: error getting the frontBio handle", __FUNCTION__); return 0; } } } else { if (transport->rdg) { tmp = rdg_get_event_handles(transport->rdg, &events[1], count - 1); if (tmp == 0) return 0; nCount += tmp; } else if (transport->tsg) { tmp = tsg_get_event_handles(transport->tsg, &events[1], count - 1); if (tmp == 0) return 0; nCount += tmp; } } return nCount; }