📄 rdp.c
字号:
/* Output pointer capability set */static voidrdp_out_pointer_caps(STREAM s){ out_uint16_le(s, RDP_CAPSET_POINTER); out_uint16_le(s, RDP_CAPLEN_POINTER); out_uint16(s, 0); /* Colour pointer */ out_uint16_le(s, 20); /* Cache size */}/* Output share capability set */static voidrdp_out_share_caps(STREAM s){ out_uint16_le(s, RDP_CAPSET_SHARE); out_uint16_le(s, RDP_CAPLEN_SHARE); out_uint16(s, 0); /* userid */ out_uint16(s, 0); /* pad */}/* Output colour cache capability set */static voidrdp_out_colcache_caps(STREAM s){ out_uint16_le(s, RDP_CAPSET_COLCACHE); out_uint16_le(s, RDP_CAPLEN_COLCACHE); out_uint16_le(s, 6); /* cache size */ out_uint16(s, 0); /* pad */}static uint8 canned_caps[] = { 0x01, 0x00, 0x00, 0x00, 0x09, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x08, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x08, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x34, 0x00, 0xFE, 0x00, 0x04, 0x00, 0xFE, 0x00, 0x04, 0x00, 0xFE, 0x00, 0x08, 0x00, 0xFE, 0x00, 0x08, 0x00, 0xFE, 0x00, 0x10, 0x00, 0xFE, 0x00, 0x20, 0x00, 0xFE, 0x00, 0x40, 0x00, 0xFE, 0x00, 0x80, 0x00, 0xFE, 0x00, 0x00, 0x01, 0x40, 0x00, 0x00, 0x08, 0x00, 0x01, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00};/* Output unknown capability set */static voidrdp_out_unknown_caps(STREAM s){ out_uint16_le(s, RDP_CAPSET_UNKNOWN); out_uint16_le(s, 0x58); out_uint8p(s, canned_caps, RDP_CAPLEN_UNKNOWN - 4);}/* Send a confirm active PDU */static voidrdp_send_confirm_active(void){ STREAM s; uint16 caplen = RDP_CAPLEN_GENERAL + RDP_CAPLEN_BITMAP + RDP_CAPLEN_ORDER + RDP_CAPLEN_BMPCACHE + RDP_CAPLEN_COLCACHE + RDP_CAPLEN_ACTIVATE + RDP_CAPLEN_CONTROL + RDP_CAPLEN_POINTER + RDP_CAPLEN_SHARE + RDP_CAPLEN_UNKNOWN + 4 /* w2k fix, why? */ ; s = rdp_init(14 + caplen + sizeof(RDP_SOURCE)); out_uint32_le(s, rdp_shareid); out_uint16_le(s, 0x3ea); /* userid */ out_uint16_le(s, sizeof(RDP_SOURCE)); out_uint16_le(s, caplen); out_uint8p(s, RDP_SOURCE, sizeof(RDP_SOURCE)); out_uint16_le(s, 0xd); /* num_caps */ out_uint8s(s, 2); /* pad */ rdp_out_general_caps(s); rdp_out_bitmap_caps(s); rdp_out_order_caps(s); rdp_out_bmpcache_caps(s); rdp_out_colcache_caps(s); rdp_out_activate_caps(s); rdp_out_control_caps(s); rdp_out_pointer_caps(s); rdp_out_share_caps(s); rdp_out_unknown_caps(s); s_mark_end(s); rdp_send(s, RDP_PDU_CONFIRM_ACTIVE);}/* Respond to a demand active PDU */static voidprocess_demand_active(STREAM s){ uint8 type; in_uint32_le(s, rdp_shareid); DEBUG(("DEMAND_ACTIVE(id=0x%x)\n", rdp_shareid)); rdp_send_confirm_active(); rdp_send_synchronise(); rdp_send_control(RDP_CTL_COOPERATE); rdp_send_control(RDP_CTL_REQUEST_CONTROL); rdp_recv(&type); /* RDP_PDU_SYNCHRONIZE */ rdp_recv(&type); /* RDP_CTL_COOPERATE */ rdp_recv(&type); /* RDP_CTL_GRANT_CONTROL */ rdp_send_input(0, RDP_INPUT_SYNCHRONIZE, 0, 0, 0); rdp_send_fonts(1); rdp_send_fonts(2); rdp_recv(&type); /* RDP_PDU_UNKNOWN 0x28 */ reset_order_state();}/* Process a pointer PDU */static voidprocess_pointer_pdu(STREAM s){ uint16 message_type; uint16 x, y, width, height, cache_idx, masklen, datalen; uint8 *mask, *data; HCURSOR cursor; in_uint16_le(s, message_type); in_uint8s(s, 2); /* pad */ switch (message_type) { case RDP_POINTER_MOVE: in_uint16_le(s, x); in_uint16_le(s, y); if (s_check(s)) ui_move_pointer(x, y); break; case RDP_POINTER_COLOR: in_uint16_le(s, cache_idx); in_uint16_le(s, x); in_uint16_le(s, y); in_uint16_le(s, width); in_uint16_le(s, height); in_uint16_le(s, masklen); in_uint16_le(s, datalen); in_uint8p(s, data, datalen); in_uint8p(s, mask, masklen); cursor = ui_create_cursor(x, y, width, height, mask, data); ui_set_cursor(cursor); cache_put_cursor(cache_idx, cursor); break; case RDP_POINTER_CACHED: in_uint16_le(s, cache_idx); ui_set_cursor(cache_get_cursor(cache_idx)); break; default: DEBUG(("Pointer message 0x%x\n", message_type)); }}/* Process bitmap updates */static voidprocess_bitmap_updates(STREAM s){ uint16 num_updates; uint16 left, top, right, bottom, width, height; uint16 cx, cy, bpp, compress, bufsize, size; uint8 *data, *bmpdata; int i; in_uint16_le(s, num_updates); for (i = 0; i < num_updates; i++) { in_uint16_le(s, left); in_uint16_le(s, top); in_uint16_le(s, right); in_uint16_le(s, bottom); in_uint16_le(s, width); in_uint16_le(s, height); in_uint16_le(s, bpp); in_uint16_le(s, compress); in_uint16_le(s, bufsize); cx = right - left + 1; cy = bottom - top + 1; DEBUG(("UPDATE(l=%d,t=%d,r=%d,b=%d,w=%d,h=%d,cmp=%d)\n", left, top, right, bottom, width, height, compress)); if (!compress) { int y; bmpdata = xmalloc(width * height); for (y = 0; y < height; y++) { in_uint8a(s, &bmpdata[(height - y - 1) * width], width); } ui_paint_bitmap(left, top, cx, cy, width, height, bmpdata); xfree(bmpdata); continue; } in_uint8s(s, 2); /* pad */ in_uint16_le(s, size); in_uint8s(s, 4); /* line_size, final_size */ in_uint8p(s, data, size); bmpdata = xmalloc(width * height); if (bitmap_decompress(bmpdata, width, height, data, size)) { ui_paint_bitmap(left, top, cx, cy, width, height, bmpdata); } xfree(bmpdata); }}/* Process a palette update */static voidprocess_palette(STREAM s){ COLOURENTRY *entry; COLOURMAP map; HCOLOURMAP hmap; int i; in_uint8s(s, 2); /* pad */ in_uint16_le(s, map.ncolours); in_uint8s(s, 2); /* pad */ map.colours = xmalloc(3 * map.ncolours); for (i = 0; i < map.ncolours; i++) { entry = &map.colours[i]; in_uint8(s, entry->red); in_uint8(s, entry->green); in_uint8(s, entry->blue); } hmap = ui_create_colourmap(&map); ui_set_colourmap(hmap); xfree(map.colours);}/* Process an update PDU */static voidprocess_update_pdu(STREAM s){ uint16 update_type; in_uint16_le(s, update_type); switch (update_type) { case RDP_UPDATE_ORDERS: process_orders(s); break; case RDP_UPDATE_BITMAP: process_bitmap_updates(s); break; case RDP_UPDATE_PALETTE: process_palette(s); break; case RDP_UPDATE_SYNCHRONIZE: break; default: unimpl("update %d\n", update_type); }}/* Process data PDU */static voidprocess_data_pdu(STREAM s){ uint8 data_pdu_type; 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_UPDATE: process_update_pdu(s); break; case RDP_DATA_PDU_POINTER: process_pointer_pdu(s); break; case RDP_DATA_PDU_BELL: ui_bell(); break; case RDP_DATA_PDU_LOGON: /* User logged on */ break; default: unimpl("data PDU %d\n", data_pdu_type); }}/* Process incoming packets */voidrdp_main_loop(void){ uint8 type; STREAM s; while ((s = rdp_recv(&type)) != NULL) { switch (type) { case RDP_PDU_DEMAND_ACTIVE: process_demand_active(s); break; case RDP_PDU_DEACTIVATE: break; case RDP_PDU_DATA: process_data_pdu(s); break; case 0: break; default: unimpl("PDU %d\n", type); } }}/* Establish a connection up to the RDP layer */BOOLrdp_connect(char *server, uint32 flags, char *domain, char *password, char *command, char *directory){ if (!sec_connect(server)) return False; rdp_send_logon_info(flags, domain, username, password, command, directory); return True;}/* Disconnect from the RDP layer */voidrdp_disconnect(void){ sec_disconnect();}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -