diff --git a/include/freerdp/settings.h b/include/freerdp/settings.h index a4ed305a9..acd2c4c70 100644 --- a/include/freerdp/settings.h +++ b/include/freerdp/settings.h @@ -168,7 +168,34 @@ struct rdp_settings uint32 share_id; - int remote_app; + boolean refresh_rect; + boolean suppress_output; + boolean desktop_resize; + + uint8 order_support[32]; + + boolean color_pointer; + boolean sound_beeps; + + boolean fast_path_input; + + boolean offscreen_bitmap_cache; + uint16 offscreen_bitmap_cache_size; + uint16 offscreen_bitmap_cache_entries; + + boolean persistent_bitmap_cache; + + uint32 vc_chunk_size; + + boolean draw_nine_grid; + uint16 draw_nine_grid_cache_size; + uint16 draw_nine_grid_cache_entries; + + boolean draw_gdi_plus; + boolean draw_gdi_plus_cache; + + boolean remote_app; + char app_name[64]; int bitmap_cache; int bitmap_cache_persist_enable; diff --git a/include/freerdp/utils/stream.h b/include/freerdp/utils/stream.h index 8943bf0fb..b734516f2 100644 --- a/include/freerdp/utils/stream.h +++ b/include/freerdp/utils/stream.h @@ -129,6 +129,10 @@ stream_extend(STREAM* stream); (((uint64)(*(_s->p + 7))) << 56); \ } while (0) +#define stream_seek_uint8(_s) stream_seek(s, 1) +#define stream_seek_uint16(_s) stream_seek(s, 2) +#define stream_seek_uint32(_s) stream_seek(s, 4) + #define stream_read_uint16_be(_s, _v) do { _v = \ (((uint16)(*_s->p)) << 8) + \ (uint16)(*(_s->p + 1)); \ diff --git a/libfreerdp-core/capabilities.c b/libfreerdp-core/capabilities.c index 77e7af54a..5274c8210 100644 --- a/libfreerdp-core/capabilities.c +++ b/libfreerdp-core/capabilities.c @@ -68,319 +68,27 @@ void rdp_read_capability_set_header(STREAM* s, uint16* length, uint16* type) void rdp_read_general_capability_set(STREAM* s, rdpSettings* settings) { - -} - -/** - * Read bitmap capability set.\n - * @msdn{cc240554} - * @param s stream - * @param settings settings - */ - -void rdp_read_bitmap_capability_set(STREAM* s, rdpSettings* settings) -{ - -} - -/** - * Read order capability set.\n - * @msdn{cc240556} - * @param s stream - * @param settings settings - */ - -void rdp_read_order_capability_set(STREAM* s, rdpSettings* settings) -{ - -} - -/** - * Read bitmap cache capability set.\n - * @msdn{cc240559} - * @param s stream - * @param settings settings - */ - -void rdp_read_bitmap_cache_capability_set(STREAM* s, rdpSettings* settings) -{ - -} - -/** - * Read control capability set.\n - * @msdn{cc240568} - * @param s stream - * @param settings settings - */ - -void rdp_read_control_capability_set(STREAM* s, rdpSettings* settings) -{ - -} - -/** - * Read window activation capability set.\n - * @msdn{cc240569} - * @param s stream - * @param settings settings - */ - -void rdp_read_window_activation_capability_set(STREAM* s, rdpSettings* settings) -{ - -} - -/** - * Read pointer capability set.\n - * @msdn{cc240562} - * @param s stream - * @param settings settings - */ - -void rdp_read_pointer_capability_set(STREAM* s, rdpSettings* settings) -{ - -} - -/** - * Read share capability set.\n - * @msdn{cc240570} - * @param s stream - * @param settings settings - */ - -void rdp_read_share_capability_set(STREAM* s, rdpSettings* settings) -{ - -} - -/** - * Read color cache capability set.\n - * @msdn{cc241564} - * @param s stream - * @param settings settings - */ - -void rdp_read_color_cache_capability_set(STREAM* s, rdpSettings* settings) -{ - -} - -/** - * Read sound capability set.\n - * @msdn{cc240552} - * @param s stream - * @param settings settings - */ - -void rdp_read_sound_capability_set(STREAM* s, rdpSettings* settings) -{ - -} - -/** - * Read input capability set.\n - * @msdn{cc240563} - * @param s stream - * @param settings settings - */ - -void rdp_read_input_capability_set(STREAM* s, rdpSettings* settings) -{ - -} - -/** - * Read font capability set.\n - * @msdn{cc240571} - * @param s stream - * @param settings settings - */ - -void rdp_read_font_capability_set(STREAM* s, rdpSettings* settings) -{ - -} - -/** - * Read brush capability set.\n - * @msdn{cc240564} - * @param s stream - * @param settings settings - */ - -void rdp_read_brush_capability_set(STREAM* s, rdpSettings* settings) -{ - -} - -/** - * Read glyph cache capability set.\n - * @msdn{cc240565} - * @param s stream - * @param settings settings - */ - -void rdp_read_glyph_cache_capability_set(STREAM* s, rdpSettings* settings) -{ - -} - -/** - * Read offscreen bitmap cache capability set.\n - * @msdn{cc240550} - * @param s stream - * @param settings settings - */ - -void rdp_read_offscreen_bitmap_cache_capability_set(STREAM* s, rdpSettings* settings) -{ - -} - -/** - * Read bitmap cache host support capability set.\n - * @msdn{cc240557} - * @param s stream - * @param settings settings - */ - -void rdp_read_bitmap_cache_host_support_capability_set(STREAM* s, rdpSettings* settings) -{ - -} - -/** - * Read bitmap cache v2 capability set.\n - * @msdn{cc240560} - * @param s stream - * @param settings settings - */ - -void rdp_read_bitmap_cache_v2_capability_set(STREAM* s, rdpSettings* settings) -{ - -} - -/** - * Read virtual channel capability set.\n - * @msdn{cc240551} - * @param s stream - * @param settings settings - */ - -void rdp_read_virtual_channel_capability_set(STREAM* s, rdpSettings* settings) -{ - -} - -/** - * Read drawn nine grid cache capability set.\n - * @msdn{cc241565} - * @param s stream - * @param settings settings - */ - -void rdp_read_draw_nine_grid_cache_capability_set(STREAM* s, rdpSettings* settings) -{ - -} - -/** - * Read GDI+ cache capability set.\n - * @msdn{cc241566} - * @param s stream - * @param settings settings - */ - -void rdp_read_draw_gdi_plus_cache_capability_set(STREAM* s, rdpSettings* settings) -{ - -} - -/** - * Read remote programs capability set.\n - * @msdn{cc242518} - * @param s stream - * @param settings settings - */ - -void rdp_read_remote_programs_capability_set(STREAM* s, rdpSettings* settings) -{ - -} - -/** - * Read window list capability set.\n - * @msdn{cc242564} - * @param s stream - * @param settings settings - */ - -void rdp_read_window_list_capability_set(STREAM* s, rdpSettings* settings) -{ - -} - -/** - * Read desktop composition capability set.\n - * @msdn{cc240855} - * @param s stream - * @param settings settings - */ - -void rdp_read_desktop_composition_capability_set(STREAM* s, rdpSettings* settings) -{ - -} - -/** - * Read multifragment update capability set.\n - * @msdn{cc240649} - * @param s stream - * @param settings settings - */ - -void rdp_read_multifragment_update_capability_set(STREAM* s, rdpSettings* settings) -{ - -} - -/** - * Read large pointer capability set.\n - * @msdn{cc240650} - * @param s stream - * @param settings settings - */ - -void rdp_read_large_pointer_capability_set(STREAM* s, rdpSettings* settings) -{ - -} - -/** - * Read surface commands capability set.\n - * @msdn{dd871563} - * @param s stream - * @param settings settings - */ - -void rdp_read_surface_commands_capability_set(STREAM* s, rdpSettings* settings) -{ - -} - -/** - * Read bitmap codecs capability set.\n - * @msdn{dd891377} - * @param s stream - * @param settings settings - */ - -void rdp_read_bitmap_codecs_capability_set(STREAM* s, rdpSettings* settings) -{ - + uint16 extraFlags; + uint8 refreshRectSupport; + uint8 suppressOutputSupport; + + stream_seek_uint16(s); /* osMajorType (2 bytes) */ + stream_seek_uint16(s); /* osMinorType (2 bytes) */ + stream_seek_uint16(s); /* protocolVersion (2 bytes) */ + stream_seek_uint16(s); /* pad2OctetsA (2 bytes) */ + stream_seek_uint16(s); /* generalCompressionTypes (2 bytes) */ + stream_read_uint16(s, extraFlags); /* extraFlags (2 bytes) */ + stream_seek_uint16(s); /* updateCapabilityFlag (2 bytes) */ + stream_seek_uint16(s); /* remoteUnshareFlag (2 bytes) */ + stream_seek_uint16(s); /* generalCompressionLevel (2 bytes) */ + stream_read_uint8(s, refreshRectSupport); /* refreshRectSupport (1 byte) */ + stream_read_uint8(s, suppressOutputSupport); /* suppressOutputSupport (1 byte) */ + + if (refreshRectSupport == False) + settings->refresh_rect = False; + + if (suppressOutputSupport == False) + settings->suppress_output = False; } /** @@ -395,6 +103,39 @@ void rdp_write_general_capability_set(STREAM* s, rdpSettings* settings) } +/** + * Read bitmap capability set.\n + * @msdn{cc240554} + * @param s stream + * @param settings settings + */ + +void rdp_read_bitmap_capability_set(STREAM* s, rdpSettings* settings) +{ + uint8 drawingFlags; + uint16 desktopWidth; + uint16 desktopHeight; + uint16 desktopResizeFlag; + uint16 preferredBitsPerPixel; + + stream_read_uint16(s, preferredBitsPerPixel); /* preferredBitsPerPixel (2 bytes) */ + stream_seek_uint16(s); /* receive1BitPerPixel (2 bytes) */ + stream_seek_uint16(s); /* receive4BitsPerPixel (2 bytes) */ + stream_seek_uint16(s); /* receive8BitsPerPixel (2 bytes) */ + stream_read_uint16(s, desktopWidth); /* desktopWidth (2 bytes) */ + stream_read_uint16(s, desktopHeight); /* desktopHeight (2 bytes) */ + stream_seek_uint16(s); /* pad2Octets (2 bytes) */ + stream_read_uint16(s, desktopResizeFlag); /* desktopResizeFlag (2 bytes) */ + stream_seek_uint16(s); /* bitmapCompressionFlag (2 bytes) */ + stream_seek_uint8(s); /* highColorFlags (1 byte) */ + stream_read_uint8(s, drawingFlags); /* drawingFlags (1 byte) */ + stream_seek_uint16(s); /* multipleRectangleSupport (2 bytes) */ + stream_seek_uint16(s); /* pad2OctetsB (2 bytes) */ + + if (desktopResizeFlag == False) + settings->desktop_resize = False; +} + /** * Write bitmap capability set.\n * @msdn{cc240554} @@ -407,6 +148,45 @@ void rdp_write_bitmap_capability_set(STREAM* s, rdpSettings* settings) } +/** + * Read order capability set.\n + * @msdn{cc240556} + * @param s stream + * @param settings settings + */ + +void rdp_read_order_capability_set(STREAM* s, rdpSettings* settings) +{ + int i; + uint16 orderFlags; + uint8 orderSupport[32]; + uint16 orderSupportExFlags; + + stream_seek(s, 16); /* terminalDescriptor (16 bytes) */ + stream_seek_uint32(s); /* pad4OctetsA (4 bytes) */ + stream_seek_uint16(s); /* desktopSaveXGranularity (2 bytes) */ + stream_seek_uint16(s); /* desktopSaveYGranularity (2 bytes) */ + stream_seek_uint16(s); /* pad2OctetsA (2 bytes) */ + stream_seek_uint16(s); /* maximumOrderLevel (2 bytes) */ + stream_seek_uint16(s); /* numberFonts (2 bytes) */ + stream_read_uint16(s, orderFlags); /* orderFlags (2 bytes) */ + stream_read(s, orderSupport, 32); /* orderSupport (32 bytes) */ + stream_seek_uint16(s); /* textFlags (2 bytes) */ + stream_read_uint16(s, orderSupportExFlags); /* orderSupportExFlags (2 bytes) */ + stream_seek_uint32(s); /* pad4OctetsB (4 bytes) */ + stream_seek_uint32(s); /* desktopSaveSize (4 bytes) */ + stream_seek_uint16(s); /* pad2OctetsC (2 bytes) */ + stream_seek_uint16(s); /* pad2OctetsD (2 bytes) */ + stream_seek_uint16(s); /* textANSICodePage (2 bytes) */ + stream_seek_uint16(s); /* pad2OctetsE (2 bytes) */ + + for (i = 0; i < 32; i++) + { + if (orderSupport[i] == False) + settings->order_support[i] = False; + } +} + /** * Write order capability set.\n * @msdn{cc240556} @@ -419,6 +199,29 @@ void rdp_write_order_capability_set(STREAM* s, rdpSettings* settings) } +/** + * Read bitmap cache capability set.\n + * @msdn{cc240559} + * @param s stream + * @param settings settings + */ + +void rdp_read_bitmap_cache_capability_set(STREAM* s, rdpSettings* settings) +{ + stream_seek_uint32(s); /* pad1 (4 bytes) */ + stream_seek_uint32(s); /* pad2 (4 bytes) */ + stream_seek_uint32(s); /* pad3 (4 bytes) */ + stream_seek_uint32(s); /* pad4 (4 bytes) */ + stream_seek_uint32(s); /* pad5 (4 bytes) */ + stream_seek_uint32(s); /* pad6 (4 bytes) */ + stream_seek_uint16(s); /* Cache0Entries (2 bytes) */ + stream_seek_uint16(s); /* Cache0MaximumCellSize (2 bytes) */ + stream_seek_uint16(s); /* Cache1Entries (2 bytes) */ + stream_seek_uint16(s); /* Cache1MaximumCellSize (2 bytes) */ + stream_seek_uint16(s); /* Cache2Entries (2 bytes) */ + stream_seek_uint16(s); /* Cache2MaximumCellSize (2 bytes) */ +} + /** * Write bitmap cache capability set.\n * @msdn{cc240559} @@ -431,6 +234,21 @@ void rdp_write_bitmap_cache_capability_set(STREAM* s, rdpSettings* settings) } +/** + * Read control capability set.\n + * @msdn{cc240568} + * @param s stream + * @param settings settings + */ + +void rdp_read_control_capability_set(STREAM* s, rdpSettings* settings) +{ + stream_seek_uint16(s); /* controlFlags (2 bytes) */ + stream_seek_uint16(s); /* remoteDetachFlag (2 bytes) */ + stream_seek_uint16(s); /* controlInterest (2 bytes) */ + stream_seek_uint16(s); /* detachInterest (2 bytes) */ +} + /** * Write control capability set.\n * @msdn{cc240568} @@ -443,6 +261,21 @@ void rdp_write_control_capability_set(STREAM* s, rdpSettings* settings) } +/** + * Read window activation capability set.\n + * @msdn{cc240569} + * @param s stream + * @param settings settings + */ + +void rdp_read_window_activation_capability_set(STREAM* s, rdpSettings* settings) +{ + stream_seek_uint16(s); /* helpKeyFlag (2 bytes) */ + stream_seek_uint16(s); /* helpKeyIndexFlag (2 bytes) */ + stream_seek_uint16(s); /* helpExtendedKeyFlag (2 bytes) */ + stream_seek_uint16(s); /* windowManagerKeyFlag (2 bytes) */ +} + /** * Write window activation capability set.\n * @msdn{cc240569} @@ -455,6 +288,27 @@ void rdp_write_window_activation_capability_set(STREAM* s, rdpSettings* settings } +/** + * Read pointer capability set.\n + * @msdn{cc240562} + * @param s stream + * @param settings settings + */ + +void rdp_read_pointer_capability_set(STREAM* s, rdpSettings* settings) +{ + uint16 colorPointerFlag; + uint16 colorPointerCacheSize; + uint16 pointerCacheSize; + + stream_read_uint16(s, colorPointerFlag); /* colorPointerFlag (2 bytes) */ + stream_read_uint16(s, colorPointerCacheSize); /* colorPointerCacheSize (2 bytes) */ + stream_read_uint16(s, pointerCacheSize); /* pointerCacheSize (2 bytes) */ + + if (colorPointerFlag == False) + settings->color_pointer = False; +} + /** * Write pointer capability set.\n * @msdn{cc240562} @@ -467,6 +321,19 @@ void rdp_write_pointer_capability_set(STREAM* s, rdpSettings* settings) } +/** + * Read share capability set.\n + * @msdn{cc240570} + * @param s stream + * @param settings settings + */ + +void rdp_read_share_capability_set(STREAM* s, rdpSettings* settings) +{ + stream_seek_uint16(s); /* nodeId (2 bytes) */ + stream_seek_uint16(s); /* pad2Octets (2 bytes) */ +} + /** * Write share capability set.\n * @msdn{cc240570} @@ -479,6 +346,19 @@ void rdp_write_share_capability_set(STREAM* s, rdpSettings* settings) } +/** + * Read color cache capability set.\n + * @msdn{cc241564} + * @param s stream + * @param settings settings + */ + +void rdp_read_color_cache_capability_set(STREAM* s, rdpSettings* settings) +{ + stream_seek_uint16(s); /* colorTableCacheSize (2 bytes) */ + stream_seek_uint16(s); /* pad2Octets (2 bytes) */ +} + /** * Write color cache capability set.\n * @msdn{cc241564} @@ -491,6 +371,23 @@ void rdp_write_color_cache_capability_set(STREAM* s, rdpSettings* settings) } +/** + * Read sound capability set.\n + * @msdn{cc240552} + * @param s stream + * @param settings settings + */ + +void rdp_read_sound_capability_set(STREAM* s, rdpSettings* settings) +{ + uint16 soundFlags; + + stream_read_uint16(s, soundFlags); /* soundFlags (2 bytes) */ + stream_seek_uint16(s); /* pad2OctetsA (2 bytes) */ + + settings->sound_beeps = (soundFlags & SOUND_BEEPS_FLAG) ? True : False; +} + /** * Write sound capability set.\n * @msdn{cc240552} @@ -503,6 +400,36 @@ void rdp_write_sound_capability_set(STREAM* s, rdpSettings* settings) } +/** + * Read input capability set.\n + * @msdn{cc240563} + * @param s stream + * @param settings settings + */ + +void rdp_read_input_capability_set(STREAM* s, rdpSettings* settings) +{ + uint16 inputFlags; + uint32 keyboardLayout; + uint32 keyboardType; + uint32 keyboardSubType; + uint32 keyboardFunctionKeys; + + stream_read_uint16(s, inputFlags); /* inputFlags (2 bytes) */ + stream_seek_uint16(s); /* pad2OctetsA (2 bytes) */ + stream_read_uint32(s, keyboardLayout); /* keyboardLayout (4 bytes) */ + stream_read_uint32(s, keyboardType); /* keyboardType (4 bytes) */ + stream_read_uint32(s, keyboardSubType); /* keyboardSubType (4 bytes) */ + stream_read_uint32(s, keyboardFunctionKeys); /* keyboardFunctionKeys (4 bytes) */ + stream_seek(s, 64); /* imeFileName (64 bytes) */ + + if ((inputFlags & INPUT_FLAG_FASTPATH_INPUT) || (inputFlags & INPUT_FLAG_FASTPATH_INPUT2)) + { + if (settings->fast_path_input != False) + settings->fast_path_input = True; + } +} + /** * Write input capability set.\n * @msdn{cc240563} @@ -515,6 +442,19 @@ void rdp_write_input_capability_set(STREAM* s, rdpSettings* settings) } +/** + * Read font capability set.\n + * @msdn{cc240571} + * @param s stream + * @param settings settings + */ + +void rdp_read_font_capability_set(STREAM* s, rdpSettings* settings) +{ + stream_seek_uint16(s); /* fontSupportFlags (2 bytes) */ + stream_seek_uint16(s); /* pad2Octets (2 bytes) */ +} + /** * Write font capability set.\n * @msdn{cc240571} @@ -527,6 +467,18 @@ void rdp_write_font_capability_set(STREAM* s, rdpSettings* settings) } +/** + * Read brush capability set.\n + * @msdn{cc240564} + * @param s stream + * @param settings settings + */ + +void rdp_read_brush_capability_set(STREAM* s, rdpSettings* settings) +{ + stream_seek_uint32(s); /* brushSupportLevel (4 bytes) */ +} + /** * Write brush capability set.\n * @msdn{cc240564} @@ -539,6 +491,21 @@ void rdp_write_brush_capability_set(STREAM* s, rdpSettings* settings) } +/** + * Read glyph cache capability set.\n + * @msdn{cc240565} + * @param s stream + * @param settings settings + */ + +void rdp_read_glyph_cache_capability_set(STREAM* s, rdpSettings* settings) +{ + stream_seek(s, 40); /* glyphCache (40 bytes) */ + stream_seek_uint32(s); /* fragCache (4 bytes) */ + stream_seek_uint16(s); /* glyphSupportLevel (2 bytes) */ + stream_seek_uint16(s); /* pad2Octets (2 bytes) */ +} + /** * Write glyph cache capability set.\n * @msdn{cc240565} @@ -551,6 +518,27 @@ void rdp_write_glyph_cache_capability_set(STREAM* s, rdpSettings* settings) } +/** + * Read offscreen bitmap cache capability set.\n + * @msdn{cc240550} + * @param s stream + * @param settings settings + */ + +void rdp_read_offscreen_bitmap_cache_capability_set(STREAM* s, rdpSettings* settings) +{ + uint32 offscreenSupportLevel; + uint16 offscreenCacheSize; + uint16 offscreenCacheEntries; + + stream_read_uint32(s, offscreenSupportLevel); /* offscreenSupportLevel (4 bytes) */ + stream_read_uint16(s, settings->offscreen_bitmap_cache_size); /* offscreenCacheSize (2 bytes) */ + stream_read_uint16(s, settings->offscreen_bitmap_cache_entries); /* offscreenCacheEntries (2 bytes) */ + + if (offscreenSupportLevel & True) + settings->offscreen_bitmap_cache = True; +} + /** * Write offscreen bitmap cache capability set.\n * @msdn{cc240550} @@ -563,6 +551,25 @@ void rdp_write_offscreen_bitmap_cache_capability_set(STREAM* s, rdpSettings* set } +/** + * Read bitmap cache host support capability set.\n + * @msdn{cc240557} + * @param s stream + * @param settings settings + */ + +void rdp_read_bitmap_cache_host_support_capability_set(STREAM* s, rdpSettings* settings) +{ + uint8 cacheVersion; + + stream_read_uint8(s, cacheVersion); /* cacheVersion (1 byte) */ + stream_seek_uint8(s); /* pad1 (1 byte) */ + stream_seek_uint16(s); /* pad2 (2 bytes) */ + + if (cacheVersion & BITMAP_CACHE_V2) + settings->persistent_bitmap_cache = True; +} + /** * Write bitmap cache host support capability set.\n * @msdn{cc240557} @@ -575,6 +582,26 @@ void rdp_write_bitmap_cache_host_support_capability_set(STREAM* s, rdpSettings* } +/** + * Read bitmap cache v2 capability set.\n + * @msdn{cc240560} + * @param s stream + * @param settings settings + */ + +void rdp_read_bitmap_cache_v2_capability_set(STREAM* s, rdpSettings* settings) +{ + stream_seek_uint16(s); /* cacheFlags (2 bytes) */ + stream_seek_uint8(s); /* pad2 (1 byte) */ + stream_seek_uint8(s); /* numCellCaches (1 byte) */ + stream_seek(s, 4); /* bitmapCache0CellInfo (4 bytes) */ + stream_seek(s, 4); /* bitmapCache1CellInfo (4 bytes) */ + stream_seek(s, 4); /* bitmapCache2CellInfo (4 bytes) */ + stream_seek(s, 4); /* bitmapCache3CellInfo (4 bytes) */ + stream_seek(s, 4); /* bitmapCache4CellInfo (4 bytes) */ + stream_seek(s, 12); /* pad3 (12 bytes) */ +} + /** * Write bitmap cache v2 capability set.\n * @msdn{cc240560} @@ -587,6 +614,19 @@ void rdp_write_bitmap_cache_v2_capability_set(STREAM* s, rdpSettings* settings) } +/** + * Read virtual channel capability set.\n + * @msdn{cc240551} + * @param s stream + * @param settings settings + */ + +void rdp_read_virtual_channel_capability_set(STREAM* s, rdpSettings* settings) +{ + stream_seek_uint32(s); /* flags (4 bytes) */ + stream_read_uint32(s, settings->vc_chunk_size); /* VCChunkSize (4 bytes) */ +} + /** * Write virtual channel capability set.\n * @msdn{cc240551} @@ -599,6 +639,28 @@ void rdp_write_virtual_channel_capability_set(STREAM* s, rdpSettings* settings) } +/** + * Read drawn nine grid cache capability set.\n + * @msdn{cc241565} + * @param s stream + * @param settings settings + */ + +void rdp_read_draw_nine_grid_cache_capability_set(STREAM* s, rdpSettings* settings) +{ + uint32 drawNineGridSupportLevel; + uint16 drawNineGridCacheSize; + uint16 drawNineGridCacheEntries; + + stream_read_uint32(s, drawNineGridSupportLevel); /* drawNineGridSupportLevel (4 bytes) */ + stream_read_uint16(s, settings->draw_nine_grid_cache_size); /* drawNineGridCacheSize (2 bytes) */ + stream_read_uint16(s, settings->draw_nine_grid_cache_entries); /* drawNineGridCacheEntries (2 bytes) */ + + if ((drawNineGridSupportLevel & DRAW_NINEGRID_SUPPORTED) || + (drawNineGridSupportLevel & DRAW_NINEGRID_SUPPORTED_V2)) + settings->draw_nine_grid = True; +} + /** * Write drawn nine grid cache capability set.\n * @msdn{cc241565} @@ -611,6 +673,32 @@ void rdp_write_draw_nine_grid_cache_capability_set(STREAM* s, rdpSettings* setti } +/** + * Read GDI+ cache capability set.\n + * @msdn{cc241566} + * @param s stream + * @param settings settings + */ + +void rdp_read_draw_gdi_plus_cache_capability_set(STREAM* s, rdpSettings* settings) +{ + uint32 drawGDIPlusSupportLevel; + uint32 drawGdiplusCacheLevel; + + stream_read_uint32(s, drawGDIPlusSupportLevel); /* drawGDIPlusSupportLevel (4 bytes) */ + stream_seek_uint32(s); /* GdipVersion (4 bytes) */ + stream_read_uint32(s, drawGdiplusCacheLevel); /* drawGdiplusCacheLevel (4 bytes) */ + stream_seek(s, 10); /* GdipCacheEntries (10 bytes) */ + stream_seek(s, 8); /* GdipCacheChunkSize (8 bytes) */ + stream_seek(s, 6); /* GdipImageCacheProperties (6 bytes) */ + + if (drawGDIPlusSupportLevel & DRAW_GDIPLUS_SUPPORTED) + settings->draw_gdi_plus = True; + + if (drawGdiplusCacheLevel & DRAW_GDIPLUS_CACHE_LEVEL_ONE) + settings->draw_gdi_plus_cache = True; +} + /** * Write GDI+ cache capability set.\n * @msdn{cc241566} @@ -623,6 +711,33 @@ void rdp_write_draw_gdi_plus_cache_capability_set(STREAM* s, rdpSettings* settin } +/** + * Read remote programs capability set.\n + * @msdn{cc242518} + * @param s stream + * @param settings settings + */ + +void rdp_read_remote_programs_capability_set(STREAM* s, rdpSettings* settings) +{ + uint32 railSupportLevel; + + stream_read_uint32(s, railSupportLevel); /* railSupportLevel (4 bytes) */ + + if (railSupportLevel & RAIL_LEVEL_SUPPORTED) + { + + } + else + { + if (settings->remote_app == True) + { + /* RemoteApp Failure! */ + settings->remote_app = False; + } + } +} + /** * Write remote programs capability set.\n * @msdn{cc242518} @@ -635,6 +750,20 @@ void rdp_write_remote_programs_capability_set(STREAM* s, rdpSettings* settings) } +/** + * Read window list capability set.\n + * @msdn{cc242564} + * @param s stream + * @param settings settings + */ + +void rdp_read_window_list_capability_set(STREAM* s, rdpSettings* settings) +{ + stream_seek_uint32(s); /* WndSupportLevel (4 bytes) */ + stream_seek_uint8(s); /* NumIconCaches (1 byte) */ + stream_seek_uint16(s); /* NumIconCacheEntries (2 bytes) */ +} + /** * Write window list capability set.\n * @msdn{cc242564} @@ -647,6 +776,18 @@ void rdp_write_window_list_capability_set(STREAM* s, rdpSettings* settings) } +/** + * Read desktop composition capability set.\n + * @msdn{cc240855} + * @param s stream + * @param settings settings + */ + +void rdp_read_desktop_composition_capability_set(STREAM* s, rdpSettings* settings) +{ + stream_seek_uint16(s); /* CompDeskSupportLevel (2 bytes) */ +} + /** * Write desktop composition capability set.\n * @msdn{cc240855} @@ -659,6 +800,18 @@ void rdp_write_desktop_composition_capability_set(STREAM* s, rdpSettings* settin } +/** + * Read multifragment update capability set.\n + * @msdn{cc240649} + * @param s stream + * @param settings settings + */ + +void rdp_read_multifragment_update_capability_set(STREAM* s, rdpSettings* settings) +{ + stream_seek_uint32(s); /* MaxRequestSize (4 bytes) */ +} + /** * Write multifragment update capability set.\n * @msdn{cc240649} @@ -671,6 +824,18 @@ void rdp_write_multifragment_update_capability_set(STREAM* s, rdpSettings* setti } +/** + * Read large pointer capability set.\n + * @msdn{cc240650} + * @param s stream + * @param settings settings + */ + +void rdp_read_large_pointer_capability_set(STREAM* s, rdpSettings* settings) +{ + stream_seek_uint16(s); /* largePointerSupportFlags (2 bytes) */ +} + /** * Write large pointer capability set.\n * @msdn{cc240650} @@ -683,6 +848,19 @@ void rdp_write_large_pointer_capability_set(STREAM* s, rdpSettings* settings) } +/** + * Read surface commands capability set.\n + * @msdn{dd871563} + * @param s stream + * @param settings settings + */ + +void rdp_read_surface_commands_capability_set(STREAM* s, rdpSettings* settings) +{ + stream_seek_uint32(s); /* cmdFlags (4 bytes) */ + stream_seek_uint32(s); /* reserved (4 bytes) */ +} + /** * Write surface commands capability set.\n * @msdn{dd871563} @@ -695,6 +873,32 @@ void rdp_write_surface_commands_capability_set(STREAM* s, rdpSettings* settings) } +/** + * Read bitmap codecs capability set.\n + * @msdn{dd891377} + * @param s stream + * @param settings settings + */ + +void rdp_read_bitmap_codecs_capability_set(STREAM* s, rdpSettings* settings) +{ + uint8 bitmapCodecCount; + uint16 codecPropertiesLength; + + stream_read_uint8(s, bitmapCodecCount); /* bitmapCodecCount (1 byte) */ + + while (bitmapCodecCount > 0) + { + stream_seek(s, 16); /* codecGUID (16 bytes) */ + stream_seek_uint8(s); /* codecID (1 byte) */ + + stream_read_uint16(s, codecPropertiesLength); /* codecPropertiesLength (2 bytes) */ + stream_seek(s, codecPropertiesLength); /* codecProperties */ + + bitmapCodecCount--; + } +} + /** * Write bitmap codecs capability set.\n * @msdn{dd891377} @@ -711,6 +915,7 @@ void rdp_read_demand_active(STREAM* s, rdpSettings* settings) { uint16 type; uint16 length; + uint8 *bm, *em; uint16 numberCapabilities; uint16 lengthSourceDescriptor; uint16 lengthCombinedCapabilities; @@ -727,10 +932,12 @@ void rdp_read_demand_active(STREAM* s, rdpSettings* settings) /* capabilitySets */ while (numberCapabilities > 0) { + stream_get_mark(s, bm); + rdp_read_capability_set_header(s, &length, &type); printf("%s Capability Set (0x%02X), length:%d\n", CAPSET_TYPE_STRINGS[type], type, length); - stream_seek(s, length - CAPSET_HEADER_LENGTH); - numberCapabilities--; + + em = bm + length; switch (type) { @@ -845,6 +1052,12 @@ void rdp_read_demand_active(STREAM* s, rdpSettings* settings) default: break; } + + if (s->p != em) + printf("incorrect offset, actual:%d expected:%d\n", (int) (s->p - bm), (int) (em - bm)); + + stream_set_mark(s, em); + numberCapabilities--; } } diff --git a/libfreerdp-core/capabilities.h b/libfreerdp-core/capabilities.h index 454cf9ebd..55741d2ba 100644 --- a/libfreerdp-core/capabilities.h +++ b/libfreerdp-core/capabilities.h @@ -55,63 +55,122 @@ #define CAPSET_HEADER_LENGTH 4 +/* General Capability Flags */ +#define FASTPATH_OUTPUT_SUPPORTED 0x0001 +#define LONG_CREDENTIALS_SUPPORTED 0x0004 +#define AUTORECONNECT_SUPPORTED 0x0008 +#define ENC_SALTED_CHECKSUM 0x0010 + +/* Drawing Flags */ +#define DRAW_ALLOW_DYNAMIC_COLOR_FIDELITY 0x02 +#define DRAW_ALLOW_COLOR_SUBSAMPLING 0x04 +#define DRAW_ALLOW_SKIP_ALPHA 0x08 + +/* Order Flags */ +#define NEGOTIATE_ORDER_SUPPORT 0x0002 +#define ZERO_BOUNDS_DELTA_SUPPORT 0x0008 +#define COLOR_INDEX_SUPPORT 0x0020 +#define SOLID_PATTERN_BRUSH_ONLY 0x0040 +#define ORDER_FLAGS_EXTRA_SUPPORT 0x0080 + +/* Extended Order Flags */ +#define CACHE_BITMAP_REV3_SUPPORT 0x0002 +#define ALTSEC_FRAME_MARKER_SUPPORT 0x0004 + +/* Order Support */ +#define NEG_DSTBLT_INDEX 0x00 +#define NEG_PATBLT_INDEX 0x01 +#define NEG_SCRBLT_INDEX 0x02 +#define NEG_MEMBLT_INDEX 0x03 +#define NEG_MEM3BLT_INDEX 0x04 +#define NEG_DRAWNINEGRID_INDEX 0x07 +#define NEG_LINETO_INDEX 0x08 +#define NEG_MULTI_DRAWNINEGRID_INDEX 0x09 +#define NEG_SAVEBITMAP_INDEX 0x0B +#define NEG_MULTIDSTBLT_INDEX 0x0F +#define NEG_MULTIPATBLT_INDEX 0x10 +#define NEG_MULTISCRBLT_INDEX 0x11 +#define NEG_MULTIOPAQUERECT_INDEX 0x12 +#define NEG_FAST_INDEX_INDEX 0x13 +#define NEG_POLYGON_SC_INDEX 0x14 +#define NEG_POLYGON_CB_INDEX 0x15 +#define NEG_POLYLINE_INDEX 0x16 +#define NEG_FAST_GLYPH_INDEX 0x18 +#define NEG_ELLIPSE_SC_INDEX 0x19 +#define NEG_ELLIPSE_CB_INDEX 0x1A +#define NEG_INDEX_INDEX 0x1B + +/* Sound Flags */ +#define SOUND_BEEPS_FLAG 0x0001 + +/* Input Flags */ +#define INPUT_FLAG_SCANCODES 0x0001 +#define INPUT_FLAG_MOUSEX 0x0004 +#define INPUT_FLAG_FASTPATH_INPUT 0x0008 +#define INPUT_FLAG_UNICODE 0x0010 +#define INPUT_FLAG_FASTPATH_INPUT2 0x0020 + +/* Font Support Flags */ +#define FONTSUPPORT_FONTLIST 0x0001 + +/* Brush Support Level */ +#define BRUSH_DEFAULT 0x00000000 +#define BRUSH_COLOR_8x8 0x00000001 +#define BRUSH_COLOR_FULL 0x00000002 + +/* Glyph Support Level */ +#define GLYPH_SUPPORT_NONE 0x0000 +#define GLYPH_SUPPORT_PARTIAL 0x0001 +#define GLYPH_SUPPORT_FULL 0x0002 +#define GLYPH_SUPPORT_ENCODE 0x0003 + +/* Bitmap Cache Version */ +#define BITMAP_CACHE_V2 0x01 + +/* Bitmap Cache V2 Flags */ +#define PERSISTENT_KEYS_EXPECTED_FLAG 0x0001 +#define ALLOW_CACHE_WAITING_LIST_FLAG 0x0002 + +/* Virtual Channel Flags */ +#define VCCAPS_NO_COMPR 0x00000000 +#define VCCAPS_COMPR_SC 0x00000001 +#define VCCAPS_COMPR_CS_8K 0x00000002 + +/* Draw Nine Grid Support Level */ +#define DRAW_NINEGRID_NO_SUPPORT 0x00000000 +#define DRAW_NINEGRID_SUPPORTED 0x00000001 +#define DRAW_NINEGRID_SUPPORTED_V2 0x00000002 + +/* Draw GDI+ Support Level */ +#define DRAW_GDIPLUS_DEFAULT 0x00000000 +#define DRAW_GDIPLUS_SUPPORTED 0x00000001 + +/* Draw GDI+ Cache Level */ +#define DRAW_GDIPLUS_CACHE_LEVEL_DEFAULT 0x00000000 +#define DRAW_GDIPLUS_CACHE_LEVEL_ONE 0x00000001 + +/* RAIL Support Level */ +#define RAIL_LEVEL_SUPPORTED 0x00000001 +#define RAIL_LEVEL_DOCKED_LANGBAR_SUPPORTED 0x00000002 + +/* Window Support Level */ +#define WINDOW_LEVEL_NOT_SUPPORTED 0x00000000 +#define WINDOW_LEVEL_SUPPORTED 0x00000001 +#define WINDOW_LEVEL_SUPPORTED_EX 0x00000002 + +/* Desktop Composition Support Level */ +#define COMPDESK_NOT_SUPPORTED 0x0000 +#define COMPDESK_SUPPORTED 0x0001 + +/* Large Pointer Support Flags */ +#define LARGE_POINTER_FLAG_96x96 0x00000001 + +/* Surface Commands Flags */ +#define SURFCMDS_SET_SURFACE_BITS 0x00000002 +#define SURFCMDS_FRAME_MARKER 0x00000010 +#define SURFCMDS_STREAM_SURFACE_BITS 0x00000040 + void rdp_read_demand_active(STREAM* s, rdpSettings* settings); void rdp_read_deactivate_all(STREAM* s, rdpSettings* settings); -void rdp_read_general_capability_set(STREAM* s, rdpSettings* settings); -void rdp_read_bitmap_capability_set(STREAM* s, rdpSettings* settings); -void rdp_read_order_capability_set(STREAM* s, rdpSettings* settings); -void rdp_read_bitmap_cache_capability_set(STREAM* s, rdpSettings* settings); -void rdp_read_control_capability_set(STREAM* s, rdpSettings* settings); -void rdp_read_window_activation_capability_set(STREAM* s, rdpSettings* settings); -void rdp_read_pointer_capability_set(STREAM* s, rdpSettings* settings); -void rdp_read_share_capability_set(STREAM* s, rdpSettings* settings); -void rdp_read_color_cache_capability_set(STREAM* s, rdpSettings* settings); -void rdp_read_sound_capability_set(STREAM* s, rdpSettings* settings); -void rdp_read_input_capability_set(STREAM* s, rdpSettings* settings); -void rdp_read_font_capability_set(STREAM* s, rdpSettings* settings); -void rdp_read_brush_capability_set(STREAM* s, rdpSettings* settings); -void rdp_read_glyph_cache_capability_set(STREAM* s, rdpSettings* settings); -void rdp_read_offscreen_bitmap_cache_capability_set(STREAM* s, rdpSettings* settings); -void rdp_read_bitmap_cache_host_support_capability_set(STREAM* s, rdpSettings* settings); -void rdp_read_bitmap_cache_v2_capability_set(STREAM* s, rdpSettings* settings); -void rdp_read_virtual_channel_capability_set(STREAM* s, rdpSettings* settings); -void rdp_read_draw_nine_grid_cache_capability_set(STREAM* s, rdpSettings* settings); -void rdp_read_draw_gdi_plus_cache_capability_set(STREAM* s, rdpSettings* settings); -void rdp_read_remote_programs_capability_set(STREAM* s, rdpSettings* settings); -void rdp_read_window_list_capability_set(STREAM* s, rdpSettings* settings); -void rdp_read_desktop_composition_capability_set(STREAM* s, rdpSettings* settings); -void rdp_read_multifragment_update_capability_set(STREAM* s, rdpSettings* settings); -void rdp_read_large_pointer_capability_set(STREAM* s, rdpSettings* settings); -void rdp_read_surface_commands_capability_set(STREAM* s, rdpSettings* settings); -void rdp_read_bitmap_codecs_capability_set(STREAM* s, rdpSettings* settings); - -void rdp_write_general_capability_set(STREAM* s, rdpSettings* settings); -void rdp_write_bitmap_capability_set(STREAM* s, rdpSettings* settings); -void rdp_write_order_capability_set(STREAM* s, rdpSettings* settings); -void rdp_write_bitmap_cache_capability_set(STREAM* s, rdpSettings* settings); -void rdp_write_control_capability_set(STREAM* s, rdpSettings* settings); -void rdp_write_window_activation_capability_set(STREAM* s, rdpSettings* settings); -void rdp_write_pointer_capability_set(STREAM* s, rdpSettings* settings); -void rdp_write_share_capability_set(STREAM* s, rdpSettings* settings); -void rdp_write_color_cache_capability_set(STREAM* s, rdpSettings* settings); -void rdp_write_sound_capability_set(STREAM* s, rdpSettings* settings); -void rdp_write_input_capability_set(STREAM* s, rdpSettings* settings); -void rdp_write_font_capability_set(STREAM* s, rdpSettings* settings); -void rdp_write_brush_capability_set(STREAM* s, rdpSettings* settings); -void rdp_write_glyph_cache_capability_set(STREAM* s, rdpSettings* settings); -void rdp_write_offscreen_bitmap_cache_capability_set(STREAM* s, rdpSettings* settings); -void rdp_write_bitmap_cache_host_support_capability_set(STREAM* s, rdpSettings* settings); -void rdp_write_bitmap_cache_v2_capability_set(STREAM* s, rdpSettings* settings); -void rdp_write_virtual_channel_capability_set(STREAM* s, rdpSettings* settings); -void rdp_write_draw_nine_grid_cache_capability_set(STREAM* s, rdpSettings* settings); -void rdp_write_draw_gdi_plus_cache_capability_set(STREAM* s, rdpSettings* settings); -void rdp_write_remote_programs_capability_set(STREAM* s, rdpSettings* settings); -void rdp_write_window_list_capability_set(STREAM* s, rdpSettings* settings); -void rdp_write_desktop_composition_capability_set(STREAM* s, rdpSettings* settings); -void rdp_write_multifragment_update_capability_set(STREAM* s, rdpSettings* settings); -void rdp_write_large_pointer_capability_set(STREAM* s, rdpSettings* settings); -void rdp_write_surface_commands_capability_set(STREAM* s, rdpSettings* settings); -void rdp_write_bitmap_codecs_capability_set(STREAM* s, rdpSettings* settings); - #endif /* __CAPABILITIES_H */ diff --git a/libfreerdp-core/settings.c b/libfreerdp-core/settings.c index 79351e9b5..6bbf05877 100644 --- a/libfreerdp-core/settings.c +++ b/libfreerdp-core/settings.c @@ -17,6 +17,7 @@ * limitations under the License. */ +#include "capabilities.h" #include #include @@ -53,6 +54,30 @@ rdpSettings* settings_new() settings->encryption_method = ENCRYPTION_METHOD_NONE; settings->encryption_level = ENCRYPTION_LEVEL_NONE; + settings->order_support[NEG_DSTBLT_INDEX] = True; + settings->order_support[NEG_PATBLT_INDEX] = True; + settings->order_support[NEG_SCRBLT_INDEX] = True; + settings->order_support[NEG_MEMBLT_INDEX] = True; + settings->order_support[NEG_MEM3BLT_INDEX] = True; + settings->order_support[NEG_DRAWNINEGRID_INDEX] = True; + settings->order_support[NEG_LINETO_INDEX] = True; + settings->order_support[NEG_MULTI_DRAWNINEGRID_INDEX] = True; + settings->order_support[NEG_SAVEBITMAP_INDEX] = True; + settings->order_support[NEG_MULTIDSTBLT_INDEX] = True; + settings->order_support[NEG_MULTIPATBLT_INDEX] = True; + settings->order_support[NEG_MULTISCRBLT_INDEX] = True; + settings->order_support[NEG_MULTIOPAQUERECT_INDEX] = True; + settings->order_support[NEG_FAST_INDEX_INDEX] = True; + settings->order_support[NEG_POLYGON_SC_INDEX] = True; + settings->order_support[NEG_POLYGON_CB_INDEX] = True; + settings->order_support[NEG_POLYLINE_INDEX] = True; + settings->order_support[NEG_FAST_GLYPH_INDEX] = True; + settings->order_support[NEG_ELLIPSE_SC_INDEX] = True; + settings->order_support[NEG_ELLIPSE_CB_INDEX] = True; + settings->order_support[NEG_INDEX_INDEX] = True; + + settings->color_pointer = True; + settings->client_dir = xmalloc(strlen(client_dll)); strcpy(settings->client_dir, client_dll);