38 |
uint8 *g_next_packet; |
uint8 *g_next_packet; |
39 |
uint32 g_rdp_shareid; |
uint32 g_rdp_shareid; |
40 |
|
|
41 |
extern RDPCOMP mppc_dict; |
extern RDPCOMP g_mppc_dict; |
42 |
|
|
43 |
#if WITH_DEBUG |
#if WITH_DEBUG |
44 |
static uint32 g_packetno; |
static uint32 g_packetno; |
176 |
time_t t = time(NULL); |
time_t t = time(NULL); |
177 |
time_t tzone; |
time_t tzone; |
178 |
|
|
179 |
|
#if 0 |
180 |
|
/* enable rdp compression */ |
181 |
|
/* some problems still exist with rdp5 */ |
182 |
|
flags |= RDP_COMPRESSION; |
183 |
|
#endif |
184 |
|
|
185 |
if (!g_use_rdp5 || 1 == g_server_rdp_version) |
if (!g_use_rdp5 || 1 == g_server_rdp_version) |
186 |
{ |
{ |
187 |
DEBUG_RDP5(("Sending RDP4-style Logon packet\n")); |
DEBUG_RDP5(("Sending RDP4-style Logon packet\n")); |
188 |
|
|
|
#if 0 |
|
|
/* enable rdp compression */ |
|
|
/* decompression also works with rdp5 */ |
|
|
/* but there are some unknown opcodes */ |
|
|
flags |= RDP_COMPRESSION; |
|
|
#endif |
|
189 |
s = sec_init(sec_flags, 18 + len_domain + len_user + len_password |
s = sec_init(sec_flags, 18 + len_domain + len_user + len_password |
190 |
+ len_program + len_directory + 10); |
+ len_program + len_directory + 10); |
191 |
|
|
651 |
* The server may limit bpp and change the size of the desktop (for |
* The server may limit bpp and change the size of the desktop (for |
652 |
* example when shadowing another session). |
* example when shadowing another session). |
653 |
*/ |
*/ |
654 |
g_server_bpp = bpp; |
if (g_server_bpp != bpp) |
655 |
g_width = width; |
{ |
656 |
g_height = height; |
warning("colour depth changed from %d to %d\n", g_server_bpp, bpp); |
657 |
|
g_server_bpp = bpp; |
658 |
ui_resize_window(); |
} |
659 |
|
if (g_width != width || g_height != height) |
660 |
|
{ |
661 |
|
warning("screen size changed from %dx%d to %dx%d\n", g_width, g_height, |
662 |
|
width, height); |
663 |
|
g_width = width; |
664 |
|
g_height = height; |
665 |
|
ui_resize_window(); |
666 |
|
} |
667 |
} |
} |
668 |
|
|
669 |
/* Respond to a demand active PDU */ |
/* Respond to a demand active PDU */ |
924 |
|
|
925 |
in_uint16_le(s, update_type); |
in_uint16_le(s, update_type); |
926 |
|
|
927 |
|
ui_begin_update(); |
928 |
switch (update_type) |
switch (update_type) |
929 |
{ |
{ |
930 |
case RDP_UPDATE_ORDERS: |
case RDP_UPDATE_ORDERS: |
948 |
default: |
default: |
949 |
unimpl("update %d\n", update_type); |
unimpl("update %d\n", update_type); |
950 |
} |
} |
951 |
|
ui_end_update(); |
952 |
} |
} |
953 |
|
|
954 |
/* Process a disconnect PDU */ |
/* Process a disconnect PDU */ |
971 |
|
|
972 |
uint32 roff, rlen; |
uint32 roff, rlen; |
973 |
|
|
974 |
struct stream *ns = &(mppc_dict.ns); |
struct stream *ns = &(g_mppc_dict.ns); |
|
uint8 *dict = (mppc_dict.hist); |
|
975 |
|
|
976 |
in_uint8s(s, 6); /* shareid, pad, streamid */ |
in_uint8s(s, 6); /* shareid, pad, streamid */ |
977 |
in_uint16(s, len); |
in_uint16(s, len); |
986 |
if (mppc_expand(s->p, clen, ctype, &roff, &rlen) == -1) |
if (mppc_expand(s->p, clen, ctype, &roff, &rlen) == -1) |
987 |
error("error while decompressing packet\n"); |
error("error while decompressing packet\n"); |
988 |
|
|
989 |
len -= 18; |
//len -= 18; |
|
|
|
|
/* this should never happen */ |
|
|
if (len != rlen) |
|
|
error("decompression error len != rlen\n"); |
|
990 |
|
|
991 |
/* allocate memory and copy the uncompressed data into the temporary stream */ |
/* allocate memory and copy the uncompressed data into the temporary stream */ |
992 |
ns->data = xrealloc(ns->data, len); |
ns->data = (uint8 *) xrealloc(ns->data, rlen); |
993 |
|
|
994 |
memcpy((ns->data), (unsigned char *) (mppc_dict.hist + roff), len); |
memcpy((ns->data), (unsigned char *) (g_mppc_dict.hist + roff), rlen); |
995 |
|
|
996 |
ns->size = len; |
ns->size = rlen; |
997 |
ns->end = (ns->data + ns->size); |
ns->end = (ns->data + ns->size); |
998 |
ns->p = ns->data; |
ns->p = ns->data; |
999 |
ns->rdp_hdr = ns->p; |
ns->rdp_hdr = ns->p; |
1079 |
return; |
return; |
1080 |
} |
} |
1081 |
|
|
1082 |
|
/* used in uiports, processes the rdp packets waiting */ |
1083 |
|
BOOL |
1084 |
|
rdp_loop(BOOL * deactivated, uint32 * ext_disc_reason) |
1085 |
|
{ |
1086 |
|
uint8 type; |
1087 |
|
BOOL disc = False; /* True when a disconnect PDU was received */ |
1088 |
|
BOOL cont = True; |
1089 |
|
STREAM s; |
1090 |
|
|
1091 |
|
while (cont) |
1092 |
|
{ |
1093 |
|
s = rdp_recv(&type); |
1094 |
|
if (s == NULL) |
1095 |
|
return False; |
1096 |
|
switch (type) |
1097 |
|
{ |
1098 |
|
case RDP_PDU_DEMAND_ACTIVE: |
1099 |
|
process_demand_active(s); |
1100 |
|
*deactivated = False; |
1101 |
|
break; |
1102 |
|
case RDP_PDU_DEACTIVATE: |
1103 |
|
DEBUG(("RDP_PDU_DEACTIVATE\n")); |
1104 |
|
*deactivated = True; |
1105 |
|
break; |
1106 |
|
case RDP_PDU_DATA: |
1107 |
|
disc = process_data_pdu(s, ext_disc_reason); |
1108 |
|
break; |
1109 |
|
case 0: |
1110 |
|
break; |
1111 |
|
default: |
1112 |
|
unimpl("PDU %d\n", type); |
1113 |
|
} |
1114 |
|
if (disc) |
1115 |
|
return False; |
1116 |
|
cont = g_next_packet < s->end; |
1117 |
|
} |
1118 |
|
return True; |
1119 |
|
} |
1120 |
|
|
1121 |
/* Establish a connection up to the RDP layer */ |
/* Establish a connection up to the RDP layer */ |
1122 |
BOOL |
BOOL |
1123 |
rdp_connect(char *server, uint32 flags, char *domain, char *password, |
rdp_connect(char *server, uint32 flags, char *domain, char *password, |