19#include <freerdp/config.h>
22#include <winpr/print.h>
23#include <freerdp/log.h>
48#include <freerdp/assistance.h>
50#define TAG SERVER_TAG("shadow.win")
52DEFINE_GUID(CLSID_RDPSession, 0x9B78F0E6, 0x3E05, 0x4A5B, 0xB2, 0xE8, 0xE7, 0x43, 0xA8, 0x95, 0x6B,
54DEFINE_GUID(DIID__IRDPSessionEvents, 0x98a97042, 0x6698, 0x40e9, 0x8e, 0xfd, 0xb3, 0x20, 0x09, 0x90,
56DEFINE_GUID(IID_IRDPSRAPISharingSession, 0xeeb20886, 0xe470, 0x4cf6, 0x84, 0x2b, 0x27, 0x39, 0xc0,
58DEFINE_GUID(IID_IRDPSRAPIAttendee, 0xec0671b3, 0x1b78, 0x4b80, 0xa4, 0x64, 0x91, 0x32, 0x24, 0x75,
60DEFINE_GUID(IID_IRDPSRAPIAttendeeManager, 0xba3a37e8, 0x33da, 0x4749, 0x8d, 0xa0, 0x07, 0xfa, 0x34,
62DEFINE_GUID(IID_IRDPSRAPISessionProperties, 0x339b24f2, 0x9bc0, 0x4f16, 0x9a, 0xac, 0xf1, 0x65,
63 0x43, 0x3d, 0x13, 0xd4);
64DEFINE_GUID(CLSID_RDPSRAPIApplicationFilter, 0xe35ace89, 0xc7e8, 0x427e, 0xa4, 0xf9, 0xb9, 0xda,
65 0x07, 0x28, 0x26, 0xbd);
66DEFINE_GUID(CLSID_RDPSRAPIInvitationManager, 0x53d9c9db, 0x75ab, 0x4271, 0x94, 0x8a, 0x4c, 0x4e,
67 0xb3, 0x6a, 0x8f, 0x2b);
69static ULONG Shadow_IRDPSessionEvents_RefCount = 0;
71const char* GetRDPSessionEventString(DISPID
id)
75 case DISPID_RDPSRAPI_EVENT_ON_ATTENDEE_CONNECTED:
76 return "OnAttendeeConnected";
79 case DISPID_RDPSRAPI_EVENT_ON_ATTENDEE_DISCONNECTED:
80 return "OnAttendeeDisconnected";
83 case DISPID_RDPSRAPI_EVENT_ON_ATTENDEE_UPDATE:
84 return "OnAttendeeUpdate";
87 case DISPID_RDPSRAPI_EVENT_ON_ERROR:
91 case DISPID_RDPSRAPI_EVENT_ON_VIEWER_CONNECTED:
92 return "OnConnectionEstablished";
95 case DISPID_RDPSRAPI_EVENT_ON_VIEWER_DISCONNECTED:
96 return "OnConnectionTerminated";
99 case DISPID_RDPSRAPI_EVENT_ON_VIEWER_AUTHENTICATED:
100 return "OnConnectionAuthenticated";
103 case DISPID_RDPSRAPI_EVENT_ON_VIEWER_CONNECTFAILED:
104 return "OnConnectionFailed";
107 case DISPID_RDPSRAPI_EVENT_ON_CTRLLEVEL_CHANGE_REQUEST:
108 return "OnControlLevelChangeRequest";
111 case DISPID_RDPSRAPI_EVENT_ON_GRAPHICS_STREAM_PAUSED:
112 return "OnGraphicsStreamPaused";
115 case DISPID_RDPSRAPI_EVENT_ON_GRAPHICS_STREAM_RESUMED:
116 return "OnGraphicsStreamResumed";
119 case DISPID_RDPSRAPI_EVENT_ON_VIRTUAL_CHANNEL_JOIN:
120 return "OnChannelJoin";
123 case DISPID_RDPSRAPI_EVENT_ON_VIRTUAL_CHANNEL_LEAVE:
124 return "OnChannelLeave";
127 case DISPID_RDPSRAPI_EVENT_ON_VIRTUAL_CHANNEL_DATARECEIVED:
128 return "OnChannelDataReceived";
131 case DISPID_RDPSRAPI_EVENT_ON_VIRTUAL_CHANNEL_SENDCOMPLETED:
132 return "OnChannelDataSent";
135 case DISPID_RDPSRAPI_EVENT_ON_APPLICATION_OPEN:
136 return "OnApplicationOpen";
139 case DISPID_RDPSRAPI_EVENT_ON_APPLICATION_CLOSE:
140 return "OnApplicationClose";
143 case DISPID_RDPSRAPI_EVENT_ON_APPLICATION_UPDATE:
144 return "OnApplicationUpdate";
147 case DISPID_RDPSRAPI_EVENT_ON_WINDOW_OPEN:
148 return "OnWindowOpen";
151 case DISPID_RDPSRAPI_EVENT_ON_WINDOW_CLOSE:
152 return "OnWindowClose";
155 case DISPID_RDPSRAPI_EVENT_ON_WINDOW_UPDATE:
156 return "OnWindowUpdate";
159 case DISPID_RDPSRAPI_EVENT_ON_APPFILTER_UPDATE:
160 return "OnAppFilterUpdate";
163 case DISPID_RDPSRAPI_EVENT_ON_SHARED_RECT_CHANGED:
164 return "OnSharedRectChanged";
167 case DISPID_RDPSRAPI_EVENT_ON_FOCUSRELEASED:
168 return "OnFocusReleased";
171 case DISPID_RDPSRAPI_EVENT_ON_SHARED_DESKTOP_SETTINGS_CHANGED:
172 return "OnSharedDesktopSettingsChanged";
175 case DISPID_RDPAPI_EVENT_ON_BOUNDING_RECT_CHANGED:
176 return "OnViewingSizeChanged";
183static HRESULT STDMETHODCALLTYPE
184Shadow_IRDPSessionEvents_QueryInterface(__RPC__in _IRDPSessionEvents* This,
185 __RPC__in REFIID riid,
187 _COM_Outptr_
void** ppvObject)
189 *ppvObject =
nullptr;
191 if (IsEqualIID(riid, &DIID__IRDPSessionEvents) || IsEqualIID(riid, &IID_IDispatch) ||
192 IsEqualIID(riid, &IID_IUnknown))
198 return E_NOINTERFACE;
200 This->lpVtbl->AddRef(This);
204static ULONG STDMETHODCALLTYPE Shadow_IRDPSessionEvents_AddRef(__RPC__in _IRDPSessionEvents* This)
206 Shadow_IRDPSessionEvents_RefCount++;
207 return Shadow_IRDPSessionEvents_RefCount;
210static ULONG STDMETHODCALLTYPE Shadow_IRDPSessionEvents_Release(__RPC__in _IRDPSessionEvents* This)
212 if (!Shadow_IRDPSessionEvents_RefCount)
215 Shadow_IRDPSessionEvents_RefCount--;
216 return Shadow_IRDPSessionEvents_RefCount;
219static HRESULT STDMETHODCALLTYPE
220Shadow_IRDPSessionEvents_GetTypeInfoCount(__RPC__in _IRDPSessionEvents* This,
221 __RPC__out UINT* pctinfo)
223 WLog_INFO(TAG,
"Shadow_IRDPSessionEvents_GetTypeInfoCount");
228static HRESULT STDMETHODCALLTYPE
229Shadow_IRDPSessionEvents_GetTypeInfo(__RPC__in _IRDPSessionEvents* This,
232 __RPC__deref_out_opt ITypeInfo** ppTInfo)
234 WLog_INFO(TAG,
"Shadow_IRDPSessionEvents_GetTypeInfo");
238static HRESULT STDMETHODCALLTYPE Shadow_IRDPSessionEvents_GetIDsOfNames(
239 __RPC__in _IRDPSessionEvents* This,
240 __RPC__in REFIID riid,
241 __RPC__in_ecount_full(cNames) LPOLESTR* rgszNames,
242 __RPC__in_range(0, 16384) UINT cNames,
244 __RPC__out_ecount_full(cNames) DISPID* rgDispId)
246 WLog_INFO(TAG,
"Shadow_IRDPSessionEvents_GetIDsOfNames");
250static HRESULT STDMETHODCALLTYPE Shadow_IRDPSessionEvents_Invoke(_IRDPSessionEvents* This,
252 _In_ DISPID dispIdMember,
260 _In_ DISPPARAMS* pDispParams,
262 _Out_opt_ VARIANT* pVarResult,
264 _Out_opt_ EXCEPINFO* pExcepInfo,
266 _Out_opt_ UINT* puArgErr)
268 WLog_INFO(TAG,
"%s (%ld)", GetRDPSessionEventString(dispIdMember), dispIdMember);
270 switch (dispIdMember)
272 case DISPID_RDPSRAPI_EVENT_ON_ATTENDEE_CONNECTED:
276 IRDPSRAPIAttendee* pAttendee =
nullptr;
277 VARIANT vr = WINPR_C_ARRAY_INIT;
279#if defined(NONAMELESSUNION)
280 vr.n1.n2.vt = VT_DISPATCH;
284 HRESULT hr = DispGetParam(pDispParams, 0, VT_DISPATCH, &vr, &uArgErr);
288 WLog_ERR(TAG,
"%s DispGetParam(0, VT_DISPATCH) failure: 0x%08lX",
289 GetRDPSessionEventString(dispIdMember), hr);
293 IDispatch* pDispatch =
294#if defined(NONAMELESSUNION)
295 pDispatch = vr.n1.n2.n3.pdispVal;
297 pDispatch = vr.pdispVal;
299 hr = pDispatch->lpVtbl->QueryInterface(pDispatch, &IID_IRDPSRAPIAttendee,
304 WLog_INFO(TAG,
"%s IDispatch::QueryInterface(IRDPSRAPIAttendee) failure: 0x%08lX",
305 GetRDPSessionEventString(dispIdMember), hr);
309 level = CTRL_LEVEL_VIEW;
311 hr = pAttendee->lpVtbl->put_ControlLevel(pAttendee, level);
315 WLog_INFO(TAG,
"%s IRDPSRAPIAttendee::put_ControlLevel() failure: 0x%08lX",
316 GetRDPSessionEventString(dispIdMember), hr);
320 pAttendee->lpVtbl->Release(pAttendee);
324 case DISPID_RDPSRAPI_EVENT_ON_ATTENDEE_DISCONNECTED:
327 case DISPID_RDPSRAPI_EVENT_ON_ATTENDEE_UPDATE:
330 case DISPID_RDPSRAPI_EVENT_ON_ERROR:
333 case DISPID_RDPSRAPI_EVENT_ON_VIEWER_CONNECTED:
336 case DISPID_RDPSRAPI_EVENT_ON_VIEWER_DISCONNECTED:
339 case DISPID_RDPSRAPI_EVENT_ON_VIEWER_AUTHENTICATED:
342 case DISPID_RDPSRAPI_EVENT_ON_VIEWER_CONNECTFAILED:
345 case DISPID_RDPSRAPI_EVENT_ON_CTRLLEVEL_CHANGE_REQUEST:
349 IRDPSRAPIAttendee* pAttendee =
nullptr;
350 VARIANT vr = WINPR_C_ARRAY_INIT;
351#if defined(NONAMELESSUNION)
352 vr.n1.n2.vt = VT_INT;
357 HRESULT hr = DispGetParam(pDispParams, 1, VT_INT, &vr, &uArgErr);
361 WLog_INFO(TAG,
"%s DispGetParam(1, VT_INT) failure: 0x%08lX",
362 GetRDPSessionEventString(dispIdMember), hr);
366#if defined(NONAMELESSUNION)
367 level = vr.n1.n2.n3.intVal;
372 VARIANT vr2 = WINPR_C_ARRAY_INIT;
373#if defined(NONAMELESSUNION)
374 vr2.n1.n2.vt = VT_DISPATCH;
376 vr2.vt = VT_DISPATCH;
378 hr = DispGetParam(pDispParams, 0, VT_DISPATCH, &vr2, &uArgErr);
382 WLog_ERR(TAG,
"%s DispGetParam(0, VT_DISPATCH) failure: 0x%08lX",
383 GetRDPSessionEventString(dispIdMember), hr);
387 IDispatch* pDispatch =
388#if defined(NONAMELESSUNION)
389 vr2.n1.n2.n3.pdispVal;
393 hr = pDispatch->lpVtbl->QueryInterface(pDispatch, &IID_IRDPSRAPIAttendee,
398 WLog_INFO(TAG,
"%s IDispatch::QueryInterface(IRDPSRAPIAttendee) failure: 0x%08lX",
399 GetRDPSessionEventString(dispIdMember), hr);
403 hr = pAttendee->lpVtbl->put_ControlLevel(pAttendee, level);
407 WLog_INFO(TAG,
"%s IRDPSRAPIAttendee::put_ControlLevel() failure: 0x%08lX",
408 GetRDPSessionEventString(dispIdMember), hr);
412 pAttendee->lpVtbl->Release(pAttendee);
416 case DISPID_RDPSRAPI_EVENT_ON_GRAPHICS_STREAM_PAUSED:
419 case DISPID_RDPSRAPI_EVENT_ON_GRAPHICS_STREAM_RESUMED:
422 case DISPID_RDPSRAPI_EVENT_ON_VIRTUAL_CHANNEL_JOIN:
425 case DISPID_RDPSRAPI_EVENT_ON_VIRTUAL_CHANNEL_LEAVE:
428 case DISPID_RDPSRAPI_EVENT_ON_VIRTUAL_CHANNEL_DATARECEIVED:
431 case DISPID_RDPSRAPI_EVENT_ON_VIRTUAL_CHANNEL_SENDCOMPLETED:
434 case DISPID_RDPSRAPI_EVENT_ON_APPLICATION_OPEN:
437 case DISPID_RDPSRAPI_EVENT_ON_APPLICATION_CLOSE:
440 case DISPID_RDPSRAPI_EVENT_ON_APPLICATION_UPDATE:
443 case DISPID_RDPSRAPI_EVENT_ON_WINDOW_OPEN:
446 case DISPID_RDPSRAPI_EVENT_ON_WINDOW_CLOSE:
449 case DISPID_RDPSRAPI_EVENT_ON_WINDOW_UPDATE:
452 case DISPID_RDPSRAPI_EVENT_ON_APPFILTER_UPDATE:
455 case DISPID_RDPSRAPI_EVENT_ON_SHARED_RECT_CHANGED:
458 case DISPID_RDPSRAPI_EVENT_ON_FOCUSRELEASED:
461 case DISPID_RDPSRAPI_EVENT_ON_SHARED_DESKTOP_SETTINGS_CHANGED:
464 case DISPID_RDPAPI_EVENT_ON_BOUNDING_RECT_CHANGED:
471static _IRDPSessionEventsVtbl Shadow_IRDPSessionEventsVtbl = {
473 Shadow_IRDPSessionEvents_QueryInterface, Shadow_IRDPSessionEvents_AddRef,
474 Shadow_IRDPSessionEvents_Release,
477 Shadow_IRDPSessionEvents_GetTypeInfoCount, Shadow_IRDPSessionEvents_GetTypeInfo,
478 Shadow_IRDPSessionEvents_GetIDsOfNames, Shadow_IRDPSessionEvents_Invoke
481static _IRDPSessionEvents Shadow_IRDPSessionEvents = { &Shadow_IRDPSessionEventsVtbl };
483static LRESULT CALLBACK ShadowWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
496 return DefWindowProc(hwnd, uMsg, wParam, lParam);
503int win_shadow_wds_wnd_init(winShadowSubsystem* subsystem)
507 WNDCLASSEX wndClassEx = WINPR_C_ARRAY_INIT;
508 hModule = GetModuleHandle(
nullptr);
510 wndClassEx.cbSize =
sizeof(WNDCLASSEX);
511 wndClassEx.style = 0;
512 wndClassEx.lpfnWndProc = ShadowWndProc;
513 wndClassEx.cbClsExtra = 0;
514 wndClassEx.cbWndExtra = 0;
515 wndClassEx.hInstance = hModule;
516 wndClassEx.hIcon =
nullptr;
517 wndClassEx.hCursor =
nullptr;
518 wndClassEx.hbrBackground =
nullptr;
519 wndClassEx.lpszMenuName = _T(
"ShadowWndMenu");
520 wndClassEx.lpszClassName = _T(
"ShadowWndClass");
521 wndClassEx.hIconSm =
nullptr;
523 if (!RegisterClassEx(&wndClassEx))
525 WLog_ERR(TAG,
"RegisterClassEx failure");
529 hInstance = wndClassEx.hInstance;
530 subsystem->hWnd = CreateWindowEx(0, wndClassEx.lpszClassName, 0, 0, 0, 0, 0, 0, HWND_MESSAGE, 0,
533 if (!subsystem->hWnd)
535 WLog_INFO(TAG,
"CreateWindowEx failure");
542int win_shadow_wds_init(winShadowSubsystem* subsystem)
550 BSTR bstrAuthString =
nullptr;
551 BSTR bstrGroupName =
nullptr;
552 BSTR bstrPassword =
nullptr;
553 BSTR bstrPropertyName =
nullptr;
554 VARIANT varPropertyValue;
555 rdpAssistanceFile* file =
nullptr;
556 IConnectionPoint* pCP =
nullptr;
557 IConnectionPointContainer* pCPC =
nullptr;
559 win_shadow_wds_wnd_init(subsystem);
560 HRESULT hr = OleInitialize(
nullptr);
564 WLog_ERR(TAG,
"OleInitialize() failure");
568 hr = CoInitializeEx(
nullptr, COINIT_APARTMENTTHREADED);
572 WLog_ERR(TAG,
"CoInitialize() failure");
576 hr = CoCreateInstance(&CLSID_RDPSession,
nullptr, CLSCTX_ALL, &IID_IRDPSRAPISharingSession,
577 (
void**)&(subsystem->pSharingSession));
581 WLog_ERR(TAG,
"CoCreateInstance(IRDPSRAPISharingSession) failure: 0x%08lX", hr);
585 IUnknown* pUnknown = (IUnknown*)subsystem->pSharingSession;
586 hr = pUnknown->lpVtbl->QueryInterface(pUnknown, &IID_IConnectionPointContainer, (
void**)&pCPC);
590 WLog_ERR(TAG,
"QueryInterface(IID_IConnectionPointContainer) failure: 0x%08lX", hr);
594 pCPC->lpVtbl->FindConnectionPoint(pCPC, &DIID__IRDPSessionEvents, &pCP);
600 "IConnectionPointContainer::FindConnectionPoint(_IRDPSessionEvents) failure: 0x%08lX",
606 subsystem->pSessionEvents = &Shadow_IRDPSessionEvents;
607 subsystem->pSessionEvents->lpVtbl->AddRef(subsystem->pSessionEvents);
608 hr = pCP->lpVtbl->Advise(pCP, (IUnknown*)subsystem->pSessionEvents, &dwCookie);
612 WLog_ERR(TAG,
"IConnectionPoint::Advise(Shadow_IRDPSessionEvents) failure: 0x%08lX", hr);
616 hr = subsystem->pSharingSession->lpVtbl->put_ColorDepth(subsystem->pSharingSession, 32);
620 WLog_ERR(TAG,
"IRDPSRAPISharingSession::put_ColorDepth() failure: 0x%08lX", hr);
624 hr = subsystem->pSharingSession->lpVtbl->GetDesktopSharedRect(subsystem->pSharingSession, &left,
625 &top, &right, &bottom);
629 WLog_ERR(TAG,
"IRDPSRAPISharingSession::GetDesktopSharedRect() failure: 0x%08lX", hr);
633 long width = right - left;
634 long height = bottom - top;
637 "GetDesktopSharedRect(): left: %ld top: %ld right: %ld bottom: %ld width: %ld height: %ld",
638 left, top, right, bottom, width, height);
639 hr = subsystem->pSharingSession->lpVtbl->get_VirtualChannelManager(
640 subsystem->pSharingSession, &(subsystem->pVirtualChannelMgr));
644 WLog_ERR(TAG,
"IRDPSRAPISharingSession::get_VirtualChannelManager() failure: 0x%08lX", hr);
648 hr = subsystem->pSharingSession->lpVtbl->get_ApplicationFilter(
649 subsystem->pSharingSession, &(subsystem->pApplicationFilter));
653 WLog_ERR(TAG,
"IRDPSRAPISharingSession::get_ApplicationFilter() failure: 0x%08lX", hr);
657 hr = subsystem->pSharingSession->lpVtbl->get_Attendees(subsystem->pSharingSession,
658 &(subsystem->pAttendeeMgr));
662 WLog_ERR(TAG,
"IRDPSRAPISharingSession::get_Attendees() failure: 0x%08lX", hr);
666 hr = subsystem->pSharingSession->lpVtbl->get_Properties(subsystem->pSharingSession,
667 &(subsystem->pSessionProperties));
671 WLog_ERR(TAG,
"IRDPSRAPISharingSession::get_Properties() failure: 0x%08lX", hr);
675 bstrPropertyName = SysAllocString(L
"PortId");
676#if defined(NONAMELESSUNION)
677 varPropertyValue.n1.n2.vt = VT_I4;
678 varPropertyValue.n1.n2.n3.intVal = 40000;
680 varPropertyValue.vt = VT_I4;
681 varPropertyValue.intVal = 40000;
683 hr = subsystem->pSessionProperties->lpVtbl->put_Property(subsystem->pSessionProperties,
684 bstrPropertyName, varPropertyValue);
685 SysFreeString(bstrPropertyName);
689 WLog_ERR(TAG,
"IRDPSRAPISessionProperties::put_Property(PortId) failure: 0x%08lX", hr);
693 bstrPropertyName = SysAllocString(L
"DrvConAttach");
694#if defined(NONAMELESSUNION)
695 varPropertyValue.n1.n2.vt = VT_BOOL;
696 varPropertyValue.n1.n2.n3.boolVal = VARIANT_TRUE;
698 varPropertyValue.vt = VT_BOOL;
699 varPropertyValue.boolVal = VARIANT_TRUE;
701 hr = subsystem->pSessionProperties->lpVtbl->put_Property(subsystem->pSessionProperties,
702 bstrPropertyName, varPropertyValue);
703 SysFreeString(bstrPropertyName);
707 WLog_ERR(TAG,
"IRDPSRAPISessionProperties::put_Property(DrvConAttach) failure: 0x%08lX",
712 bstrPropertyName = SysAllocString(L
"PortProtocol");
713#if defined(NONAMELESSUNION)
714 varPropertyValue.n1.n2.vt = VT_I4;
715 varPropertyValue.n1.n2.n3.intVal = 2;
717 varPropertyValue.vt = VT_I4;
719 varPropertyValue.intVal = 2;
722 hr = subsystem->pSessionProperties->lpVtbl->put_Property(subsystem->pSessionProperties,
723 bstrPropertyName, varPropertyValue);
724 SysFreeString(bstrPropertyName);
728 WLog_ERR(TAG,
"IRDPSRAPISessionProperties::put_Property(PortProtocol) failure: 0x%08lX",
733 hr = subsystem->pSharingSession->lpVtbl->Open(subsystem->pSharingSession);
737 WLog_ERR(TAG,
"IRDPSRAPISharingSession::Open() failure: 0x%08lX", hr);
741 hr = subsystem->pSharingSession->lpVtbl->get_Invitations(subsystem->pSharingSession,
742 &(subsystem->pInvitationMgr));
746 WLog_ERR(TAG,
"IRDPSRAPISharingSession::get_Invitations() failure");
750 bstrAuthString = SysAllocString(L
"Shadow");
751 bstrGroupName = SysAllocString(L
"ShadowGroup");
752 bstrPassword = SysAllocString(L
"Shadow123!");
753 hr = subsystem->pInvitationMgr->lpVtbl->CreateInvitation(
754 subsystem->pInvitationMgr, bstrAuthString, bstrGroupName, bstrPassword, 5,
755 &(subsystem->pInvitation));
756 SysFreeString(bstrAuthString);
757 SysFreeString(bstrGroupName);
758 SysFreeString(bstrPassword);
762 WLog_ERR(TAG,
"IRDPSRAPIInvitationManager::CreateInvitation() failure: 0x%08lX", hr);
766 file = subsystem->pAssistanceFile = freerdp_assistance_file_new();
770 WLog_ERR(TAG,
"freerdp_assistance_file_new() failed");
776 BSTR bstrConnectionString =
nullptr;
777 hr = subsystem->pInvitation->lpVtbl->get_ConnectionString(subsystem->pInvitation,
778 &bstrConnectionString);
782 WLog_ERR(TAG,
"IRDPSRAPIInvitation::get_ConnectionString() failure: 0x%08lX", hr);
786 char* ConnectionString2 = ConvertWCharToUtf8Alloc(bstrConnectionString,
nullptr);
787 SysFreeString(bstrConnectionString);
788 status2 = freerdp_assistance_set_connection_string2(file, ConnectionString2,
"Shadow123!");
789 free(ConnectionString2);
791 if ((!ConnectionString2) || (status2 < 1))
793 WLog_ERR(TAG,
"failed to convert connection string");
798 freerdp_assistance_print_file(file, WLog_Get(TAG), WLOG_INFO);
799 status = win_shadow_rdp_init(subsystem);
803 WLog_ERR(TAG,
"win_shadow_rdp_init() failure: %d", status);
807 rdpSettings* settings = subsystem->shw->settings;
808 if (!freerdp_assistance_populate_settings_from_assistance_file(file, settings))
820 status = win_shadow_rdp_start(subsystem);
824 WLog_ERR(TAG,
"win_shadow_rdp_start() failure: %d", status);
831int win_shadow_wds_uninit(winShadowSubsystem* subsystem)
833 if (subsystem->pSharingSession)
835 subsystem->pSharingSession->lpVtbl->Close(subsystem->pSharingSession);
836 subsystem->pSharingSession->lpVtbl->Release(subsystem->pSharingSession);
837 subsystem->pSharingSession =
nullptr;
840 if (subsystem->pVirtualChannelMgr)
842 subsystem->pVirtualChannelMgr->lpVtbl->Release(subsystem->pVirtualChannelMgr);
843 subsystem->pVirtualChannelMgr =
nullptr;
846 if (subsystem->pApplicationFilter)
848 subsystem->pApplicationFilter->lpVtbl->Release(subsystem->pApplicationFilter);
849 subsystem->pApplicationFilter =
nullptr;
852 if (subsystem->pAttendeeMgr)
854 subsystem->pAttendeeMgr->lpVtbl->Release(subsystem->pAttendeeMgr);
855 subsystem->pAttendeeMgr =
nullptr;
858 if (subsystem->pSessionProperties)
860 subsystem->pSessionProperties->lpVtbl->Release(subsystem->pSessionProperties);
861 subsystem->pSessionProperties =
nullptr;
864 if (subsystem->pInvitationMgr)
866 subsystem->pInvitationMgr->lpVtbl->Release(subsystem->pInvitationMgr);
867 subsystem->pInvitationMgr =
nullptr;
870 if (subsystem->pInvitation)
872 subsystem->pInvitation->lpVtbl->Release(subsystem->pInvitation);
873 subsystem->pInvitation =
nullptr;
876 if (subsystem->pAssistanceFile)
878 freerdp_assistance_file_free(subsystem->pAssistanceFile);
879 subsystem->pAssistanceFile =
nullptr;
884 DestroyWindow(subsystem->hWnd);
885 subsystem->hWnd =
nullptr;
890 win_shadow_rdp_uninit(subsystem);
891 subsystem->shw =
nullptr;
WINPR_ATTR_NODISCARD FREERDP_API BOOL freerdp_settings_set_bool(rdpSettings *settings, FreeRDP_Settings_Keys_Bool id, BOOL val)
Sets a BOOL settings value.
WINPR_ATTR_NODISCARD FREERDP_API BOOL freerdp_settings_set_uint32(rdpSettings *settings, FreeRDP_Settings_Keys_UInt32 id, UINT32 val)
Sets a UINT32 settings value.
WINPR_ATTR_NODISCARD FREERDP_API BOOL freerdp_settings_set_string(rdpSettings *settings, FreeRDP_Settings_Keys_String id, const char *val)
Sets a string settings value. The param is copied.