1 |
/* -*- c-basic-offset: 8 -*- |
/* -*- c-basic-offset: 8 -*- |
2 |
rdesktop: A Remote Desktop Protocol client. |
rdesktop: A Remote Desktop Protocol client. |
3 |
Protocol services - RDP layer |
Protocol services - RDP layer |
4 |
Copyright (C) Matthew Chapman 1999-2002 |
Copyright (C) Matthew Chapman 1999-2005 |
5 |
|
|
6 |
This program is free software; you can redistribute it and/or modify |
This program is free software; you can redistribute it and/or modify |
7 |
it under the terms of the GNU General Public License as published by |
it under the terms of the GNU General Public License as published by |
58 |
rdp_s = sec_recv(&rdpver); |
rdp_s = sec_recv(&rdpver); |
59 |
if (rdp_s == NULL) |
if (rdp_s == NULL) |
60 |
return NULL; |
return NULL; |
61 |
if (rdpver != 3) |
if (rdpver == 0xff) |
62 |
|
{ |
63 |
|
g_next_packet = rdp_s->end; |
64 |
|
*type = 0; |
65 |
|
return rdp_s; |
66 |
|
} |
67 |
|
else if (rdpver != 3) |
68 |
{ |
{ |
69 |
/* rdp5_process should move g_next_packet ok */ |
/* rdp5_process should move g_next_packet ok */ |
70 |
rdp5_process(rdp_s); |
rdp5_process(rdp_s); |
386 |
rdp_enum_bmpcache2(void) |
rdp_enum_bmpcache2(void) |
387 |
{ |
{ |
388 |
STREAM s; |
STREAM s; |
389 |
uint8 idlist[BMPCACHE2_NUM_PSTCELLS * sizeof(BITMAP_ID)]; |
HASH_KEY keylist[BMPCACHE2_NUM_PSTCELLS]; |
390 |
uint32 nids, offset, count, flags; |
uint32 num_keys, offset, count, flags; |
391 |
|
|
392 |
offset = 0; |
offset = 0; |
393 |
nids = pstcache_enumerate(2, idlist); |
num_keys = pstcache_enumerate(2, keylist); |
394 |
|
|
395 |
while (offset < nids) |
while (offset < num_keys) |
396 |
{ |
{ |
397 |
count = MIN(nids - offset, 169); |
count = MIN(num_keys - offset, 169); |
398 |
|
|
399 |
s = rdp_init_data(24 + count * sizeof(BITMAP_ID)); |
s = rdp_init_data(24 + count * sizeof(HASH_KEY)); |
400 |
|
|
401 |
flags = 0; |
flags = 0; |
402 |
if (offset == 0) |
if (offset == 0) |
403 |
flags |= PDU_FLAG_FIRST; |
flags |= PDU_FLAG_FIRST; |
404 |
if (nids - offset <= 169) |
if (num_keys - offset <= 169) |
405 |
flags |= PDU_FLAG_LAST; |
flags |= PDU_FLAG_LAST; |
406 |
|
|
407 |
/* header */ |
/* header */ |
411 |
out_uint16_le(s, 0); |
out_uint16_le(s, 0); |
412 |
out_uint16_le(s, 0); |
out_uint16_le(s, 0); |
413 |
out_uint16_le(s, 0); |
out_uint16_le(s, 0); |
414 |
out_uint16_le(s, nids); |
out_uint16_le(s, num_keys); |
415 |
out_uint32_le(s, 0); |
out_uint32_le(s, 0); |
416 |
out_uint32_le(s, flags); |
out_uint32_le(s, flags); |
417 |
|
|
418 |
/* list */ |
/* list */ |
419 |
out_uint8a(s, idlist + offset * sizeof(BITMAP_ID), count * sizeof(BITMAP_ID)); |
out_uint8a(s, keylist[offset], count * sizeof(HASH_KEY)); |
420 |
|
|
421 |
s_mark_end(s); |
s_mark_end(s); |
422 |
rdp_send_data(s, 0x2b); |
rdp_send_data(s, 0x2b); |
1091 |
|
|
1092 |
if (ctype & RDP_MPPC_COMPRESSED) |
if (ctype & RDP_MPPC_COMPRESSED) |
1093 |
{ |
{ |
1094 |
|
if (len > RDP_MPPC_DICT_SIZE) |
1095 |
|
error("error decompressed packet size exceeds max\n"); |
1096 |
if (mppc_expand(s->p, clen, ctype, &roff, &rlen) == -1) |
if (mppc_expand(s->p, clen, ctype, &roff, &rlen) == -1) |
1097 |
error("error while decompressing packet\n"); |
error("error while decompressing packet\n"); |
1098 |
|
|