diff --git a/channels/disp/client/disp_main.c b/channels/disp/client/disp_main.c index e8827366b..3682449fe 100644 --- a/channels/disp/client/disp_main.c +++ b/channels/disp/client/disp_main.c @@ -66,8 +66,8 @@ struct _DISP_PLUGIN DISP_LISTENER_CALLBACK* listener_callback; UINT32 MaxNumMonitors; - UINT32 MaxMonitorWidth; - UINT32 MaxMonitorHeight; + UINT32 MaxMonitorAreaFactorA; + UINT32 MaxMonitorAreaFactorB; }; typedef struct _DISP_PLUGIN DISP_PLUGIN; @@ -110,15 +110,9 @@ int disp_send_display_control_monitor_layout_pdu(DISP_CHANNEL_CALLBACK* callback if (Monitors[index].Width < 200) Monitors[index].Width = 200; - if (Monitors[index].Width > disp->MaxMonitorWidth) - Monitors[index].Width = disp->MaxMonitorWidth; - if (Monitors[index].Height < 200) Monitors[index].Height = 200; - if (Monitors[index].Height > disp->MaxMonitorHeight) - Monitors[index].Height = disp->MaxMonitorHeight; - Stream_Write_UINT32(s, Monitors[index].Flags); /* Flags (4 bytes) */ Stream_Write_UINT32(s, Monitors[index].Left); /* Left (4 bytes) */ Stream_Write_UINT32(s, Monitors[index].Top); /* Top (4 bytes) */ @@ -127,6 +121,8 @@ int disp_send_display_control_monitor_layout_pdu(DISP_CHANNEL_CALLBACK* callback Stream_Write_UINT32(s, Monitors[index].PhysicalWidth); /* PhysicalWidth (4 bytes) */ Stream_Write_UINT32(s, Monitors[index].PhysicalHeight); /* PhysicalHeight (4 bytes) */ Stream_Write_UINT32(s, Monitors[index].Orientation); /* Orientation (4 bytes) */ + Stream_Write_UINT32(s, Monitors[index].DesktopScaleFactor); /* DesktopScaleFactor (4 bytes) */ + Stream_Write_UINT32(s, Monitors[index].DeviceScaleFactor); /* DeviceScaleFactor (4 bytes) */ #if 0 fprintf(stderr, "\t: Flags: 0x%04X\n", Monitors[index].Flags); @@ -138,9 +134,6 @@ int disp_send_display_control_monitor_layout_pdu(DISP_CHANNEL_CALLBACK* callback fprintf(stderr, "\t: PhysicalHeight: %d\n", Monitors[index].PhysicalHeight); fprintf(stderr, "\t: Orientation: %d\n", Monitors[index].Orientation); #endif - - Stream_Write_UINT32(s, Monitors[index].DesktopScaleFactor); /* DesktopScaleFactor (4 bytes) */ - Stream_Write_UINT32(s, Monitors[index].DeviceScaleFactor); /* DeviceScaleFactor (4 bytes) */ } Stream_SealLength(s); @@ -158,12 +151,15 @@ int disp_recv_display_control_caps_pdu(DISP_CHANNEL_CALLBACK* callback, wStream* disp = (DISP_PLUGIN*) callback->plugin; - Stream_Read_UINT32(s, disp->MaxNumMonitors); /* MaxNumMonitors (4 bytes) */ - Stream_Read_UINT32(s, disp->MaxMonitorWidth); /* MaxMonitorWidth (4 bytes) */ - Stream_Read_UINT32(s, disp->MaxMonitorHeight); /* MaxMonitorHeight (4 bytes) */ + if (Stream_GetRemainingLength(s) < 12) + return -1; - //fprintf(stderr, "DisplayControlCapsPdu: MaxNumMonitors: %d MaxMonitorWidth: %d MaxMonitorHeight: %d\n", - // disp->MaxNumMonitors, disp->MaxMonitorWidth, disp->MaxMonitorHeight); + Stream_Read_UINT32(s, disp->MaxNumMonitors); /* MaxNumMonitors (4 bytes) */ + Stream_Read_UINT32(s, disp->MaxMonitorAreaFactorA); /* MaxMonitorAreaFactorA (4 bytes) */ + Stream_Read_UINT32(s, disp->MaxMonitorAreaFactorB); /* MaxMonitorAreaFactorB (4 bytes) */ + + //fprintf(stderr, "DisplayControlCapsPdu: MaxNumMonitors: %d MaxMonitorAreaFactorA: %d MaxMonitorAreaFactorB: %d\n", + // disp->MaxNumMonitors, disp->MaxMonitorAreaFactorA, disp->MaxMonitorAreaFactorB); return 0; } @@ -173,6 +169,9 @@ int disp_recv_pdu(DISP_CHANNEL_CALLBACK* callback, wStream* s) UINT32 type; UINT32 length; + if (Stream_GetRemainingLength(s) < 8) + return -1; + Stream_Read_UINT32(s, type); /* Type (4 bytes) */ Stream_Read_UINT32(s, length); /* Length (4 bytes) */ @@ -220,8 +219,10 @@ static int disp_on_new_channel_connection(IWTSListenerCallback* pListenerCallbac DISP_CHANNEL_CALLBACK* callback; DISP_LISTENER_CALLBACK* listener_callback = (DISP_LISTENER_CALLBACK*) pListenerCallback; - callback = (DISP_CHANNEL_CALLBACK*) malloc(sizeof(DISP_CHANNEL_CALLBACK)); - ZeroMemory(callback, sizeof(DISP_CHANNEL_CALLBACK)); + callback = (DISP_CHANNEL_CALLBACK*) calloc(1, sizeof(DISP_CHANNEL_CALLBACK)); + + if (!callback) + return -1; callback->iface.OnDataReceived = disp_on_data_received; callback->iface.OnClose = disp_on_close; @@ -240,8 +241,10 @@ static int disp_plugin_initialize(IWTSPlugin* pPlugin, IWTSVirtualChannelManager int status; DISP_PLUGIN* disp = (DISP_PLUGIN*) pPlugin; - disp->listener_callback = (DISP_LISTENER_CALLBACK*) malloc(sizeof(DISP_LISTENER_CALLBACK)); - ZeroMemory(disp->listener_callback, sizeof(DISP_LISTENER_CALLBACK)); + disp->listener_callback = (DISP_LISTENER_CALLBACK*) calloc(1, sizeof(DISP_LISTENER_CALLBACK)); + + if (!disp->listener_callback) + return -1; disp->listener_callback->iface.OnNewChannelConnection = disp_on_new_channel_connection; disp->listener_callback->plugin = pPlugin; @@ -281,11 +284,7 @@ int disp_send_monitor_layout(DispClientContext* context, UINT32 NumMonitors, DIS return 1; } -#ifdef STATIC_CHANNELS -#define DVCPluginEntry disp_DVCPluginEntry -#endif - -int DVCPluginEntry(IDRDYNVC_ENTRY_POINTS* pEntryPoints) +int disp_DVCPluginEntry(IDRDYNVC_ENTRY_POINTS* pEntryPoints) { int error = 0; DISP_PLUGIN* disp; @@ -317,8 +316,8 @@ int DVCPluginEntry(IDRDYNVC_ENTRY_POINTS* pEntryPoints) disp->iface.pInterface = (void*) context; disp->MaxNumMonitors = 16; - disp->MaxMonitorWidth = 8192; - disp->MaxMonitorHeight = 8192; + disp->MaxMonitorAreaFactorA = 8192; + disp->MaxMonitorAreaFactorB = 8192; error = pEntryPoints->RegisterPlugin(pEntryPoints, "disp", (IWTSPlugin*) disp); } diff --git a/channels/disp/client/disp_main.h b/channels/disp/client/disp_main.h index 1851618a0..2cb9156f8 100644 --- a/channels/disp/client/disp_main.h +++ b/channels/disp/client/disp_main.h @@ -31,8 +31,8 @@ #include +#define DISPLAY_CONTROL_PDU_TYPE_CAPS 0x00000005 #define DISPLAY_CONTROL_PDU_TYPE_MONITOR_LAYOUT 0x00000002 -#define DISPLAY_CONTROL_PDU_TYPE_CAPS 0x00000003 #endif /* FREERDP_CHANNEL_DISP_CLIENT_MAIN_H */ diff --git a/channels/echo/client/echo_main.c b/channels/echo/client/echo_main.c index ef381e21a..f5633dd41 100644 --- a/channels/echo/client/echo_main.c +++ b/channels/echo/client/echo_main.c @@ -26,12 +26,11 @@ #include #include +#include #include #include -#include - #include "echo_main.h" typedef struct _ECHO_LISTENER_CALLBACK ECHO_LISTENER_CALLBACK; @@ -63,47 +62,21 @@ struct _ECHO_PLUGIN static int echo_on_data_received(IWTSVirtualChannelCallback* pChannelCallback, wStream *data) { - int error; + int status; ECHO_CHANNEL_CALLBACK* callback = (ECHO_CHANNEL_CALLBACK*) pChannelCallback; - BYTE *pBuffer = Stream_Pointer(data); - UINT32 cbSize = Stream_GetRemainingLength(data); - -#ifdef WITH_DEBUG_DVC - int i = 0; - char* debug_buffer; - char* p; - - if (cbSize > 0) - { - debug_buffer = (char*) malloc(3 * cbSize); - ZeroMemory(debug_buffer, 3 * cbSize); - - p = debug_buffer; - - for (i = 0; i < (int) (cbSize - 1); i++) - { - sprintf(p, "%02x ", pBuffer[i]); - p += 3; - } - sprintf(p, "%02x", pBuffer[i]); - - DEBUG_DVC("ECHO %d: %s", cbSize, debug_buffer); - free(debug_buffer); - } -#endif + BYTE* pBuffer = Stream_Pointer(data); + UINT32 cbSize = Stream_GetRemainingLength(data); /* echo back what we have received. ECHO does not have any message IDs. */ - error = callback->channel->Write(callback->channel, cbSize, pBuffer, NULL); + status = callback->channel->Write(callback->channel, cbSize, pBuffer, NULL); - return error; + return status; } static int echo_on_close(IWTSVirtualChannelCallback* pChannelCallback) { ECHO_CHANNEL_CALLBACK* callback = (ECHO_CHANNEL_CALLBACK*) pChannelCallback; - DEBUG_DVC(""); - free(callback); return 0; @@ -116,10 +89,10 @@ static int echo_on_new_channel_connection(IWTSListenerCallback* pListenerCallbac ECHO_CHANNEL_CALLBACK* callback; ECHO_LISTENER_CALLBACK* listener_callback = (ECHO_LISTENER_CALLBACK*) pListenerCallback; - DEBUG_DVC(""); + callback = (ECHO_CHANNEL_CALLBACK*) calloc(1, sizeof(ECHO_CHANNEL_CALLBACK)); - callback = (ECHO_CHANNEL_CALLBACK*) malloc(sizeof(ECHO_CHANNEL_CALLBACK)); - ZeroMemory(callback, sizeof(ECHO_CHANNEL_CALLBACK)); + if (!callback) + return -1; callback->iface.OnDataReceived = echo_on_data_received; callback->iface.OnClose = echo_on_close; @@ -136,10 +109,10 @@ static int echo_plugin_initialize(IWTSPlugin* pPlugin, IWTSVirtualChannelManager { ECHO_PLUGIN* echo = (ECHO_PLUGIN*) pPlugin; - DEBUG_DVC(""); + echo->listener_callback = (ECHO_LISTENER_CALLBACK*) calloc(1, sizeof(ECHO_LISTENER_CALLBACK)); - echo->listener_callback = (ECHO_LISTENER_CALLBACK*) malloc(sizeof(ECHO_LISTENER_CALLBACK)); - ZeroMemory(echo->listener_callback, sizeof(ECHO_LISTENER_CALLBACK)); + if (!echo->listener_callback) + return -1; echo->listener_callback->iface.OnNewChannelConnection = echo_on_new_channel_connection; echo->listener_callback->plugin = pPlugin; @@ -153,36 +126,35 @@ static int echo_plugin_terminated(IWTSPlugin* pPlugin) { ECHO_PLUGIN* echo = (ECHO_PLUGIN*) pPlugin; - DEBUG_DVC(""); - - free(echo); + if (echo) + { + free(echo); + } return 0; } -#ifdef STATIC_CHANNELS -#define DVCPluginEntry echo_DVCPluginEntry -#endif - -int DVCPluginEntry(IDRDYNVC_ENTRY_POINTS* pEntryPoints) +int echo_DVCPluginEntry(IDRDYNVC_ENTRY_POINTS* pEntryPoints) { - int error = 0; + int status = 0; ECHO_PLUGIN* echo; echo = (ECHO_PLUGIN*) pEntryPoints->GetPlugin(pEntryPoints, "echo"); - if (echo == NULL) + if (!echo) { - echo = (ECHO_PLUGIN*) malloc(sizeof(ECHO_PLUGIN)); - ZeroMemory(echo, sizeof(ECHO_PLUGIN)); + echo = (ECHO_PLUGIN*) calloc(1, sizeof(ECHO_PLUGIN)); + + if (!echo) + return -1; echo->iface.Initialize = echo_plugin_initialize; echo->iface.Connected = NULL; echo->iface.Disconnected = NULL; echo->iface.Terminated = echo_plugin_terminated; - error = pEntryPoints->RegisterPlugin(pEntryPoints, "echo", (IWTSPlugin*) echo); + status = pEntryPoints->RegisterPlugin(pEntryPoints, "echo", (IWTSPlugin*) echo); } - return error; + return status; } diff --git a/channels/rdpgfx/client/rdpgfx_main.c b/channels/rdpgfx/client/rdpgfx_main.c index f50010f93..e214f2145 100644 --- a/channels/rdpgfx/client/rdpgfx_main.c +++ b/channels/rdpgfx/client/rdpgfx_main.c @@ -1033,11 +1033,7 @@ void* rdpgfx_get_cache_slot_data(RdpgfxClientContext* context, UINT16 cacheSlot) return pData; } -#ifdef STATIC_CHANNELS -#define DVCPluginEntry rdpgfx_DVCPluginEntry -#endif - -int DVCPluginEntry(IDRDYNVC_ENTRY_POINTS* pEntryPoints) +int rdpgfx_DVCPluginEntry(IDRDYNVC_ENTRY_POINTS* pEntryPoints) { int status = 0; RDPGFX_PLUGIN* gfx; @@ -1095,6 +1091,9 @@ int DVCPluginEntry(IDRDYNVC_ENTRY_POINTS* pEntryPoints) gfx->zgfx = zgfx_context_new(FALSE); + if (!gfx->zgfx) + return -1; + status = pEntryPoints->RegisterPlugin(pEntryPoints, "rdpgfx", (IWTSPlugin*) gfx); } diff --git a/libfreerdp/core/info.c b/libfreerdp/core/info.c index f68dff17b..c5bc9173e 100644 --- a/libfreerdp/core/info.c +++ b/libfreerdp/core/info.c @@ -431,6 +431,9 @@ void rdp_write_info_packet(wStream* s, rdpSettings* settings) if (settings->RemoteConsoleAudio) flags |= INFO_REMOTECONSOLEAUDIO; + if (settings->HiDefRemoteApp) + flags |= INFO_HIDEF_RAIL_SUPPORTED; + if (settings->CompressionEnabled) { flags |= INFO_COMPRESSION; diff --git a/libfreerdp/core/info.h b/libfreerdp/core/info.h index 3d2758a29..0e98dde3c 100644 --- a/libfreerdp/core/info.h +++ b/libfreerdp/core/info.h @@ -49,6 +49,7 @@ #define INFO_USING_SAVED_CREDS 0x00100000 #define INFO_AUDIOCAPTURE 0x00200000 #define INFO_VIDEO_DISABLE 0x00400000 +#define INFO_HIDEF_RAIL_SUPPORTED 0x02000000 /* Logon Information Types */ #define INFO_TYPE_LOGON 0x00000000