X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;ds=sidebyside;f=rdpsrv.c;h=43bf2a42d449faf1d11d2149355d92356e4134e6;hb=8620fedb9b11c67f5eab4b07cbac9dce189f5858;hp=c5b4169403f7ef271fa7f237e52257bae1925f28;hpb=f78d8ca1c22e0fcfabb9383928bc2cf6c93473cd;p=rdpsrv diff --git a/rdpsrv.c b/rdpsrv.c index c5b4169..43bf2a4 100644 --- a/rdpsrv.c +++ b/rdpsrv.c @@ -58,19 +58,125 @@ int create_server_socket() return server_sock; } +void handle_input_pdu(STREAM s) +{ + uint32 time; + uint16 message_type, device_flags, param1, param2; + uint16 num_events; + int i; + + in_uint16_le(s, num_events); // number of events + in_uint8s(s, 2); // pad + + for (i = 0; i < num_events; ++i) { + rdp_recv_input(s, &time, &message_type, &device_flags, ¶m1, ¶m2); + printf("Input event at time %u\n", time); + + switch (message_type) { + case RDP_INPUT_SYNCHRONIZE: + printf("- Type: Synchronize (ignored)\n"); + break; + case RDP_INPUT_CODEPOINT: + printf("- Type: Codepoint (ignored)\n"); + break; + case RDP_INPUT_VIRTKEY: + printf("- Type: Virtual key (ignored)\n"); + break; + case RDP_INPUT_SCANCODE: + printf("- Type: Scancode (ignored)\n"); + break; + case RDP_INPUT_MOUSE: + printf("- Type: Mouse\n"); + printf("- Device flags: %x\n", device_flags); + printf("- Position: (%u,%u)\n", param1, param2); + + // debug + rdp_send_bitmap_update(param1, param2); + + break; + default: + printf("- Unknown type %x\n", message_type); + break; + } + printf("\n"); + } +} + +struct ServerInitialization { + unsigned short width; + unsigned short height; + unsigned char pixelformat[16]; // FIXME + unsigned int name_len; +}; + +int vnc_init() +{ + char buf[256]; + int vnc_sock = tcp_connect("127.0.0.1", 5901); + struct ServerInitialization si; + + // get handshake + if (read(vnc_sock, buf, 12) != 12) + error("short read on handshake\n"); + write(vnc_sock, "RFB 003.003\n", 12); + + // get auth + if (read(vnc_sock, buf, 4) != 4) + error("short read on auth\n"); + + if (buf[3] != 1) + error("auth needed or connection failed\n"); + + // send shared flag + buf[0] = 1; + write(vnc_sock, buf, 1); + + // read the server initialization + if (read(vnc_sock, &si, sizeof(struct ServerInitialization)) != sizeof(struct ServerInitialization)) + error("short read on SI"); + + printf("Server is %u x %u\n", ntohs(si.width), ntohs(si.height)); + + if (read(vnc_sock, buf, si.name_len) != si.name_len) + error("short read on server name"); + + printf("Server name is '%*s'\n", si.name_len, buf); + + printf("Connected to VNC!\n"); + + return vnc_sock; +} int serve_client() { + int vnc_sock = vnc_init(); + if (!mcs_recv_connect_initial()) error("MCS_CONNECT_INITIAL recv failed"); mcs_send_connect_response(); - + for ( ;; ) { - short channel; - - /* receive ISO packets */ - mcs_recv(&channel); + uint8 type, data_pdu_type; + STREAM s; - printf("Packet on ch %u\n", channel); + while ((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: + printf("Input PDU\n"); + handle_input_pdu(s); + break; + default: + printf("Unknown data PDU type %u\n", data_pdu_type); + }; + } } }