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");
+ }
+}
+
+void
+handle_font2_pdu(STREAM s)
+{
+ printf("FONT2 PDU, responding with magic\n");
+
+ s = rdp_init_data(8);
+ out_uint16_le(s, 0);
+ out_uint16_le(s, 0);
+ out_uint16_le(s, 3);
+ out_uint16_le(s, 4);
+ s_mark_end(s);
+ rdp_send_data(s, 0x28);
+}
+
struct ServerInitialization {
unsigned short width;
unsigned short height;
for ( ;; ) {
uint8 type, data_pdu_type;
+ uint16 id;
STREAM s;
fd_set readfs;
// 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:
+ in_uint16_le(s, id);
+ printf("Synchronise, id=%u\n", id);
+ rdp_send_synchronise(id);
+ break;
+ case RDP_DATA_PDU_FONT2:
+ handle_font2_pdu(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);
+ }
}
}
- printf("LISTEN_ON_VNC=%u\n", listen_on_vnc);
-
// activity on VNC socket?
if (FD_ISSET(vnc_sock, &readfs) && listen_on_vnc) {
unsigned char buf[256];