diff --git a/include/freerdp/update.h b/include/freerdp/update.h index 711c9906d..c4c9afe56 100644 --- a/include/freerdp/update.h +++ b/include/freerdp/update.h @@ -48,7 +48,10 @@ struct _BITMAP_DATA uint32 bitsPerPixel; uint32 flags; uint32 bitmapLength; - uint8 bitmapComprHdr[8]; + uint32 cbCompFirstRowSize; + uint32 cbCompMainBodySize; + uint32 cbScanWidth; + uint32 cbUncompressedSize; uint8* bitmapDataStream; boolean compressed; }; diff --git a/libfreerdp-core/capabilities.c b/libfreerdp-core/capabilities.c index afe61997a..0b9cac2e5 100644 --- a/libfreerdp-core/capabilities.c +++ b/libfreerdp-core/capabilities.c @@ -140,7 +140,7 @@ void rdp_write_general_capability_set(STREAM* s, rdpSettings* settings) header = rdp_capability_set_start(s); - extraFlags = LONG_CREDENTIALS_SUPPORTED; /* | NO_BITMAP_COMPRESSION_HDR; */ + extraFlags = LONG_CREDENTIALS_SUPPORTED | NO_BITMAP_COMPRESSION_HDR; if (settings->auto_reconnection) extraFlags |= AUTORECONNECT_SUPPORTED; @@ -155,8 +155,8 @@ void rdp_write_general_capability_set(STREAM* s, rdpSettings* settings) settings->suppress_output = false; } - stream_write_uint16(s, 0); /* osMajorType (2 bytes) */ - stream_write_uint16(s, 0); /* osMinorType (2 bytes) */ + stream_write_uint16(s, OSMAJORTYPE_WINDOWS); /* osMajorType (2 bytes) */ + stream_write_uint16(s, OSMINORTYPE_WINDOWS_NT); /* osMinorType (2 bytes) */ stream_write_uint16(s, CAPS_PROTOCOL_VERSION); /* protocolVersion (2 bytes) */ stream_write_uint16(s, 0); /* pad2OctetsA (2 bytes) */ stream_write_uint16(s, 0); /* generalCompressionTypes (2 bytes) */ diff --git a/libfreerdp-core/capabilities.h b/libfreerdp-core/capabilities.h index 85460c1fa..5e85e8e79 100644 --- a/libfreerdp-core/capabilities.h +++ b/libfreerdp-core/capabilities.h @@ -61,6 +61,22 @@ #define SOURCE_DESCRIPTOR "MSTSC" +#define OSMAJORTYPE_UNSPECIFIED 0x0000 +#define OSMAJORTYPE_WINDOWS 0x0001 +#define OSMAJORTYPE_OS2 0x0002 +#define OSMAJORTYPE_MACINTOSH 0x0003 +#define OSMAJORTYPE_UNIX 0x0004 + +#define OSMINORTYPE_UNSPECIFIED 0x0000 +#define OSMINORTYPE_WINDOWS_31X 0x0001 +#define OSMINORTYPE_WINDOWS_95 0x0002 +#define OSMINORTYPE_WINDOWS_NT 0x0003 +#define OSMINORTYPE_OS2_V21 0x0004 +#define OSMINORTYPE_POWER_PC 0x0005 +#define OSMINORTYPE_MACINTOSH 0x0006 +#define OSMINORTYPE_NATIVE_XSERVER 0x0007 +#define OSMINORTYPE_PSEUDO_XSERVER 0x0008 + /* Capabilities Protocol Version */ #define CAPS_PROTOCOL_VERSION 0x0200 diff --git a/libfreerdp-core/update.c b/libfreerdp-core/update.c index 49c4ebf21..458eb646c 100644 --- a/libfreerdp-core/update.c +++ b/libfreerdp-core/update.c @@ -61,15 +61,14 @@ void update_read_bitmap_data(STREAM* s, BITMAP_DATA* bitmap_data) if (bitmap_data->flags & BITMAP_COMPRESSION) { - uint16 cbCompMainBodySize; - uint16 cbUncompressedSize; - - stream_seek_uint16(s); /* cbCompFirstRowSize (2 bytes) */ - stream_read_uint16(s, cbCompMainBodySize); /* cbCompMainBodySize (2 bytes) */ - stream_seek_uint16(s); /* cbScanWidth (2 bytes) */ - stream_read_uint16(s, cbUncompressedSize); /* cbUncompressedSize (2 bytes) */ - - bitmap_data->bitmapLength = cbCompMainBodySize; + if (!(bitmap_data->flags & NO_BITMAP_COMPRESSION_HDR)) + { + stream_read_uint16(s, bitmap_data->cbCompFirstRowSize); /* cbCompFirstRowSize (2 bytes) */ + stream_read_uint16(s, bitmap_data->cbCompMainBodySize); /* cbCompMainBodySize (2 bytes) */ + stream_read_uint16(s, bitmap_data->cbScanWidth); /* cbScanWidth (2 bytes) */ + stream_read_uint16(s, bitmap_data->cbUncompressedSize); /* cbUncompressedSize (2 bytes) */ + bitmap_data->bitmapLength = bitmap_data->cbCompMainBodySize; + } bitmap_data->compressed = true; stream_get_mark(s, bitmap_data->bitmapDataStream);