38 |
uint8 *g_next_packet; |
uint8 *g_next_packet; |
39 |
uint32 g_rdp_shareid; |
uint32 g_rdp_shareid; |
40 |
|
|
41 |
|
extern RDPCOMP mppc_dict; |
42 |
|
|
43 |
#if WITH_DEBUG |
#if WITH_DEBUG |
44 |
static uint32 g_packetno; |
static uint32 g_packetno; |
45 |
#endif |
#endif |
176 |
time_t t = time(NULL); |
time_t t = time(NULL); |
177 |
time_t tzone; |
time_t tzone; |
178 |
|
|
|
#if 0 |
|
|
// enable rdp compression |
|
|
flags |= RDP_COMPRESSION; |
|
|
#endif |
|
|
|
|
179 |
if (!g_use_rdp5 || 1 == g_server_rdp_version) |
if (!g_use_rdp5 || 1 == g_server_rdp_version) |
180 |
{ |
{ |
181 |
DEBUG_RDP5(("Sending RDP4-style Logon packet\n")); |
DEBUG_RDP5(("Sending RDP4-style Logon packet\n")); |
182 |
|
|
183 |
|
#if 0 |
184 |
|
/* enable rdp compression */ |
185 |
|
/* decompression also works with rdp5 */ |
186 |
|
/* but there are some unknown opcodes */ |
187 |
|
flags |= RDP_COMPRESSION; |
188 |
|
#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 |
|
|
204 |
} |
} |
205 |
else |
else |
206 |
{ |
{ |
207 |
|
|
208 |
flags |= RDP_LOGON_BLOB; |
flags |= RDP_LOGON_BLOB; |
209 |
DEBUG_RDP5(("Sending RDP5-style Logon packet\n")); |
DEBUG_RDP5(("Sending RDP5-style Logon packet\n")); |
210 |
packetlen = 4 + /* Unknown uint32 */ |
packetlen = 4 + /* Unknown uint32 */ |
441 |
order_caps[0] = 1; /* dest blt */ |
order_caps[0] = 1; /* dest blt */ |
442 |
order_caps[1] = 1; /* pat blt */ |
order_caps[1] = 1; /* pat blt */ |
443 |
order_caps[2] = 1; /* screen blt */ |
order_caps[2] = 1; /* screen blt */ |
444 |
order_caps[3] = (g_bitmap_cache ? 1 : 0); /* memblt */ |
order_caps[3] = (g_bitmap_cache ? 1 : 0); /* memblt */ |
445 |
order_caps[8] = 1; /* line */ |
order_caps[8] = 1; /* line */ |
446 |
order_caps[9] = 1; /* line */ |
order_caps[9] = 1; /* line */ |
447 |
order_caps[10] = 1; /* rect */ |
order_caps[10] = 1; /* rect */ |
958 |
uint8 data_pdu_type; |
uint8 data_pdu_type; |
959 |
uint8 ctype; |
uint8 ctype; |
960 |
uint16 clen; |
uint16 clen; |
961 |
int len; |
uint32 len; |
962 |
#if 0 |
|
963 |
int roff, rlen, ret; |
uint32 roff, rlen; |
964 |
static struct stream ns; |
|
965 |
static signed char *dict = 0; |
struct stream *ns = &(mppc_dict.ns); |
966 |
#endif |
uint8 *dict = (mppc_dict.hist); |
967 |
|
|
968 |
in_uint8s(s, 6); /* shareid, pad, streamid */ |
in_uint8s(s, 6); /* shareid, pad, streamid */ |
969 |
in_uint16(s, len); |
in_uint16(s, len); |
972 |
in_uint16(s, clen); |
in_uint16(s, clen); |
973 |
clen -= 18; |
clen -= 18; |
974 |
|
|
975 |
#if 0 |
if (ctype & RDP_MPPC_COMPRESSED) |
|
if (ctype & 0x20) |
|
976 |
{ |
{ |
|
if (!dict) |
|
|
{ |
|
|
dict = (signed char *) malloc(8200 * sizeof(signed char)); |
|
|
dict = (signed char *) memset(dict, 0, 8200 * sizeof(signed char)); |
|
|
} |
|
977 |
|
|
978 |
ret = decompress(s->p, clen, ctype, (signed char *) dict, &roff, &rlen); |
if (mppc_expand(s->p, clen, ctype, &roff, &rlen) == -1) |
979 |
|
error("error while decompressing packet\n"); |
980 |
|
|
981 |
len -= 18; |
len -= 18; |
982 |
|
|
983 |
ns.data = xrealloc(ns.data, len); |
/* this should never happen */ |
984 |
|
if (len != rlen) |
985 |
|
error("decompression error len != rlen\n"); |
986 |
|
|
987 |
ns.data = (unsigned char *) memcpy(ns.data, (unsigned char *) (dict + roff), len); |
/* allocate memory and copy the uncompressed data into the temporary stream */ |
988 |
|
ns->data = xrealloc(ns->data, len); |
989 |
|
|
990 |
ns.size = len; |
memcpy((ns->data), (unsigned char *) (mppc_dict.hist + roff), len); |
|
ns.end = ns.data + ns.size; |
|
|
ns.p = ns.data; |
|
|
ns.rdp_hdr = ns.p; |
|
991 |
|
|
992 |
s = &ns; |
ns->size = len; |
993 |
|
ns->end = (ns->data + ns->size); |
994 |
|
ns->p = ns->data; |
995 |
|
ns->rdp_hdr = ns->p; |
996 |
|
|
997 |
|
s = ns; |
998 |
} |
} |
|
#endif |
|
999 |
|
|
1000 |
switch (data_pdu_type) |
switch (data_pdu_type) |
1001 |
{ |
{ |