From: Steinar H. Gunderson Date: Sun, 6 Feb 2005 14:07:27 +0000 (+0000) Subject: Handle some control PDUs. X-Git-Url: https://git.sesse.net/?p=rdpsrv;a=commitdiff_plain;h=2b90e41918be23158e9d56c60b9736ccf107ba52 Handle some control PDUs. --- diff --git a/rdp.c b/rdp.c index bcb1bd8..49ff6a9 100644 --- a/rdp.c +++ b/rdp.c @@ -287,7 +287,7 @@ rdp_get_logon_info(STREAM s) } /* Send a control PDU */ -static void +void rdp_send_control(uint16 action) { STREAM s; @@ -303,7 +303,7 @@ rdp_send_control(uint16 action) } /* Send a synchronisation PDU */ -static void +void rdp_send_synchronise(void) { STREAM s; diff --git a/rdpsrv.c b/rdpsrv.c index f5bea8a..18c5b7a 100644 --- a/rdpsrv.c +++ b/rdpsrv.c @@ -174,6 +174,31 @@ void handle_input_pdu(STREAM s, int vnc_sock) write(vnc_sock, buf, 10); } +void handle_control_pdu(STREAM s) +{ + uint16 action, userid; + uint32 control_id; + + in_uint16_le(s, action); + in_uint16_le(s, userid); + in_uint32(s, control_id); + + printf("Control PDU: action=%hu userid=%hu control_id=%u\n", action, userid, control_id); + + switch (action) { + case RDP_CTL_COOPERATE: + printf("Cooperate\n"); + rdp_send_control(RDP_CTL_COOPERATE); + break; + case RDP_CTL_REQUEST_CONTROL: + printf("Client requesting control; granting\n"); + rdp_send_control(RDP_CTL_GRANT_CONTROL); + break; + default: + printf("Unhandled\n"); + } +} + struct ServerInitialization { unsigned short width; unsigned short height; @@ -344,23 +369,33 @@ int serve_client() // activity on RDP socket? if (FD_ISSET(tcp_get_socket(), &readfs)) { if ((s = rdp_recv(&type)) != NULL) { - if (type != RDP_PDU_DATA) { - printf("Unknown RDP packet of type %u\n", type); - continue; - } - - in_uint8s(s, 8); /* shareid, pad, streamid, length */ - in_uint8(s, data_pdu_type); - in_uint8s(s, 3); /* compress_type, compress_len */ - - switch (data_pdu_type) { - case RDP_DATA_PDU_INPUT: - handle_input_pdu(s, vnc_sock); - listen_on_vnc = 1; + switch (type) { + case RDP_PDU_DATA: + in_uint8s(s, 8); /* shareid, pad, streamid, length */ + in_uint8(s, data_pdu_type); + in_uint8s(s, 3); /* compress_type, compress_len */ + + switch (data_pdu_type) { + case RDP_DATA_PDU_INPUT: + handle_input_pdu(s, vnc_sock); + listen_on_vnc = 1; + break; + case RDP_DATA_PDU_CONTROL: + handle_control_pdu(s); + break; + case RDP_DATA_PDU_SYNCHRONISE: + rdp_send_synchronise(s); + break; + default: + printf("Unknown data PDU type %u\n", data_pdu_type); + }; + break; + case RDP_PDU_CONFIRM_ACTIVE: + printf("Client confirms activity\n"); break; default: - printf("Unknown data PDU type %u\n", data_pdu_type); - }; + printf("Unknown RDP PDU type %u\n", type); + } } }