X-Git-Url: https://git.sesse.net/?p=rdpsrv;a=blobdiff_plain;f=rdpsrv.c;fp=rdpsrv.c;h=18c5b7a84af54daefa6397bb30d4ed78d54dfba8;hp=f5bea8a23d0998b7857205c3d5c44d1bbdbf119a;hb=2b90e41918be23158e9d56c60b9736ccf107ba52;hpb=a089728102db1602cb96b01049aee0222f077444 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); + } } }