2 * FreeRDP: A Remote Desktop Protocol Implementation
4 * Copyright 2014 Marc-Andre Moreau <marcandre.moreau@gmail.com>
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
23 #include <winpr/crt.h>
24 #include <winpr/print.h>
25 #include <freerdp/log.h>
32 * Windows Desktop Sharing API:
33 * http://blogs.msdn.com/b/rds/archive/2007/03/08/windows-desktop-sharing-api.aspx
35 * Windows Desktop Sharing Interfaces:
36 * http://msdn.microsoft.com/en-us/library/aa373871%28v=vs.85%29.aspx
38 * Offer Remote Assistance Sample C:
39 * http://msdn.microsoft.com/en-us/library/ms811079.aspx#remoteassistanceapi_topic2b
41 * Remote Assistance in XP: Programmatically establish an RDP session:
42 * http://www.codeproject.com/Articles/29939/Remote-Assistance-in-XP-Programmatically-establish
50 #define TAG SERVER_TAG("shadow.win")
52 DEFINE_GUID(CLSID_RDPSession,0x9B78F0E6,0x3E05,0x4A5B,0xB2,0xE8,0xE7,0x43,0xA8,0x95,0x6B,0x65);
53 DEFINE_GUID(DIID__IRDPSessionEvents,0x98a97042,0x6698,0x40e9,0x8e,0xfd,0xb3,0x20,0x09,0x90,0x00,0x4b);
54 DEFINE_GUID(IID_IRDPSRAPISharingSession,0xeeb20886,0xe470,0x4cf6,0x84,0x2b,0x27,0x39,0xc0,0xec,0x5c,0xfb);
55 DEFINE_GUID(IID_IRDPSRAPIAttendee,0xec0671b3,0x1b78,0x4b80,0xa4,0x64,0x91,0x32,0x24,0x75,0x43,0xe3);
56 DEFINE_GUID(IID_IRDPSRAPIAttendeeManager,0xba3a37e8,0x33da,0x4749,0x8d,0xa0,0x07,0xfa,0x34,0xda,0x79,0x44);
57 DEFINE_GUID(IID_IRDPSRAPISessionProperties,0x339b24f2,0x9bc0,0x4f16,0x9a,0xac,0xf1,0x65,0x43,0x3d,0x13,0xd4);
58 DEFINE_GUID(CLSID_RDPSRAPIApplicationFilter,0xe35ace89,0xc7e8,0x427e,0xa4,0xf9,0xb9,0xda,0x07,0x28,0x26,0xbd);
59 DEFINE_GUID(CLSID_RDPSRAPIInvitationManager,0x53d9c9db,0x75ab,0x4271,0x94,0x8a,0x4c,0x4e,0xb3,0x6a,0x8f,0x2b);
61 static ULONG Shadow_IRDPSessionEvents_RefCount = 0;
63 const char* GetRDPSessionEventString(DISPID id)
67 case DISPID_RDPSRAPI_EVENT_ON_ATTENDEE_CONNECTED:
68 return "OnAttendeeConnected";
71 case DISPID_RDPSRAPI_EVENT_ON_ATTENDEE_DISCONNECTED:
72 return "OnAttendeeDisconnected";
75 case DISPID_RDPSRAPI_EVENT_ON_ATTENDEE_UPDATE:
76 return "OnAttendeeUpdate";
79 case DISPID_RDPSRAPI_EVENT_ON_ERROR:
83 case DISPID_RDPSRAPI_EVENT_ON_VIEWER_CONNECTED:
84 return "OnConnectionEstablished";
87 case DISPID_RDPSRAPI_EVENT_ON_VIEWER_DISCONNECTED:
88 return "OnConnectionTerminated";
91 case DISPID_RDPSRAPI_EVENT_ON_VIEWER_AUTHENTICATED:
92 return "OnConnectionAuthenticated";
95 case DISPID_RDPSRAPI_EVENT_ON_VIEWER_CONNECTFAILED:
96 return "OnConnectionFailed";
99 case DISPID_RDPSRAPI_EVENT_ON_CTRLLEVEL_CHANGE_REQUEST:
100 return "OnControlLevelChangeRequest";
103 case DISPID_RDPSRAPI_EVENT_ON_GRAPHICS_STREAM_PAUSED:
104 return "OnGraphicsStreamPaused";
107 case DISPID_RDPSRAPI_EVENT_ON_GRAPHICS_STREAM_RESUMED:
108 return "OnGraphicsStreamResumed";
111 case DISPID_RDPSRAPI_EVENT_ON_VIRTUAL_CHANNEL_JOIN:
112 return "OnChannelJoin";
115 case DISPID_RDPSRAPI_EVENT_ON_VIRTUAL_CHANNEL_LEAVE:
116 return "OnChannelLeave";
119 case DISPID_RDPSRAPI_EVENT_ON_VIRTUAL_CHANNEL_DATARECEIVED:
120 return "OnChannelDataReceived";
123 case DISPID_RDPSRAPI_EVENT_ON_VIRTUAL_CHANNEL_SENDCOMPLETED:
124 return "OnChannelDataSent";
127 case DISPID_RDPSRAPI_EVENT_ON_APPLICATION_OPEN:
128 return "OnApplicationOpen";
131 case DISPID_RDPSRAPI_EVENT_ON_APPLICATION_CLOSE:
132 return "OnApplicationClose";
135 case DISPID_RDPSRAPI_EVENT_ON_APPLICATION_UPDATE:
136 return "OnApplicationUpdate";
139 case DISPID_RDPSRAPI_EVENT_ON_WINDOW_OPEN:
140 return "OnWindowOpen";
143 case DISPID_RDPSRAPI_EVENT_ON_WINDOW_CLOSE:
144 return "OnWindowClose";
147 case DISPID_RDPSRAPI_EVENT_ON_WINDOW_UPDATE:
148 return "OnWindowUpdate";
151 case DISPID_RDPSRAPI_EVENT_ON_APPFILTER_UPDATE:
152 return "OnAppFilterUpdate";
155 case DISPID_RDPSRAPI_EVENT_ON_SHARED_RECT_CHANGED:
156 return "OnSharedRectChanged";
159 case DISPID_RDPSRAPI_EVENT_ON_FOCUSRELEASED:
160 return "OnFocusReleased";
163 case DISPID_RDPSRAPI_EVENT_ON_SHARED_DESKTOP_SETTINGS_CHANGED:
164 return "OnSharedDesktopSettingsChanged";
167 case DISPID_RDPAPI_EVENT_ON_BOUNDING_RECT_CHANGED:
168 return "OnViewingSizeChanged";
175 static HRESULT STDMETHODCALLTYPE Shadow_IRDPSessionEvents_QueryInterface(
176 __RPC__in _IRDPSessionEvents * This,
177 /* [in] */ __RPC__in REFIID riid,
178 /* [annotation][iid_is][out] */
179 _COM_Outptr_ void **ppvObject)
183 if (IsEqualIID(riid, &DIID__IRDPSessionEvents) ||
184 IsEqualIID(riid, &IID_IDispatch) || IsEqualIID(riid, &IID_IUnknown))
190 return E_NOINTERFACE;
192 This->lpVtbl->AddRef(This);
197 static ULONG STDMETHODCALLTYPE Shadow_IRDPSessionEvents_AddRef(
198 __RPC__in _IRDPSessionEvents * This)
200 Shadow_IRDPSessionEvents_RefCount++;
201 return Shadow_IRDPSessionEvents_RefCount;
204 static ULONG STDMETHODCALLTYPE Shadow_IRDPSessionEvents_Release(
205 __RPC__in _IRDPSessionEvents * This)
207 if (!Shadow_IRDPSessionEvents_RefCount)
210 Shadow_IRDPSessionEvents_RefCount--;
212 return Shadow_IRDPSessionEvents_RefCount;
215 static HRESULT STDMETHODCALLTYPE Shadow_IRDPSessionEvents_GetTypeInfoCount(
216 __RPC__in _IRDPSessionEvents * This,
217 /* [out] */ __RPC__out UINT *pctinfo)
219 WLog_INFO(TAG, "Shadow_IRDPSessionEvents_GetTypeInfoCount");
224 static HRESULT STDMETHODCALLTYPE Shadow_IRDPSessionEvents_GetTypeInfo(
225 __RPC__in _IRDPSessionEvents * This,
226 /* [in] */ UINT iTInfo,
227 /* [in] */ LCID lcid,
228 /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo)
230 WLog_INFO(TAG, "Shadow_IRDPSessionEvents_GetTypeInfo");
234 static HRESULT STDMETHODCALLTYPE Shadow_IRDPSessionEvents_GetIDsOfNames(
235 __RPC__in _IRDPSessionEvents * This,
236 /* [in] */ __RPC__in REFIID riid,
237 /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,
238 /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,
239 /* [in] */ LCID lcid,
240 /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId)
242 WLog_INFO(TAG, "Shadow_IRDPSessionEvents_GetIDsOfNames");
246 static HRESULT STDMETHODCALLTYPE Shadow_IRDPSessionEvents_Invoke(
247 _IRDPSessionEvents * This,
248 /* [annotation][in] */
249 _In_ DISPID dispIdMember,
250 /* [annotation][in] */
252 /* [annotation][in] */
254 /* [annotation][in] */
256 /* [annotation][out][in] */
257 _In_ DISPPARAMS *pDispParams,
258 /* [annotation][out] */
259 _Out_opt_ VARIANT *pVarResult,
260 /* [annotation][out] */
261 _Out_opt_ EXCEPINFO *pExcepInfo,
262 /* [annotation][out] */
263 _Out_opt_ UINT *puArgErr)
269 WLog_INFO(TAG, "%s (%d)", GetRDPSessionEventString(dispIdMember), dispIdMember);
271 switch (dispIdMember)
273 case DISPID_RDPSRAPI_EVENT_ON_ATTENDEE_CONNECTED:
276 IDispatch* pDispatch;
277 IRDPSRAPIAttendee* pAttendee;
282 hr = DispGetParam(pDispParams, 0, VT_DISPATCH, &vr, &uArgErr);
286 WLog_ERR(TAG, "%s DispGetParam(0, VT_DISPATCH) failure: 0x%08X",
287 GetRDPSessionEventString(dispIdMember), hr);
291 pDispatch = vr.pdispVal;
293 hr = pDispatch->lpVtbl->QueryInterface(pDispatch, &IID_IRDPSRAPIAttendee, (void**) &pAttendee);
297 WLog_INFO(TAG, "%s IDispatch::QueryInterface(IRDPSRAPIAttendee) failure: 0x%08X",
298 GetRDPSessionEventString(dispIdMember), hr);
302 level = CTRL_LEVEL_VIEW;
303 //level = CTRL_LEVEL_INTERACTIVE;
305 hr = pAttendee->lpVtbl->put_ControlLevel(pAttendee, level);
309 WLog_INFO(TAG, "%s IRDPSRAPIAttendee::put_ControlLevel() failure: 0x%08X",
310 GetRDPSessionEventString(dispIdMember), hr);
314 pAttendee->lpVtbl->Release(pAttendee);
318 case DISPID_RDPSRAPI_EVENT_ON_ATTENDEE_DISCONNECTED:
321 case DISPID_RDPSRAPI_EVENT_ON_ATTENDEE_UPDATE:
324 case DISPID_RDPSRAPI_EVENT_ON_ERROR:
327 case DISPID_RDPSRAPI_EVENT_ON_VIEWER_CONNECTED:
330 case DISPID_RDPSRAPI_EVENT_ON_VIEWER_DISCONNECTED:
333 case DISPID_RDPSRAPI_EVENT_ON_VIEWER_AUTHENTICATED:
336 case DISPID_RDPSRAPI_EVENT_ON_VIEWER_CONNECTFAILED:
339 case DISPID_RDPSRAPI_EVENT_ON_CTRLLEVEL_CHANGE_REQUEST:
342 IDispatch* pDispatch;
343 IRDPSRAPIAttendee* pAttendee;
348 hr = DispGetParam(pDispParams, 1, VT_INT, &vr, &uArgErr);
352 WLog_INFO(TAG, "%s DispGetParam(1, VT_INT) failure: 0x%08X",
353 GetRDPSessionEventString(dispIdMember), hr);
362 hr = DispGetParam(pDispParams, 0, VT_DISPATCH, &vr, &uArgErr);
366 WLog_ERR(TAG, "%s DispGetParam(0, VT_DISPATCH) failure: 0x%08X",
367 GetRDPSessionEventString(dispIdMember), hr);
371 pDispatch = vr.pdispVal;
373 hr = pDispatch->lpVtbl->QueryInterface(pDispatch, &IID_IRDPSRAPIAttendee, (void**) &pAttendee);
377 WLog_INFO(TAG, "%s IDispatch::QueryInterface(IRDPSRAPIAttendee) failure: 0x%08X",
378 GetRDPSessionEventString(dispIdMember), hr);
382 hr = pAttendee->lpVtbl->put_ControlLevel(pAttendee, level);
386 WLog_INFO(TAG, "%s IRDPSRAPIAttendee::put_ControlLevel() failure: 0x%08X",
387 GetRDPSessionEventString(dispIdMember), hr);
391 pAttendee->lpVtbl->Release(pAttendee);
395 case DISPID_RDPSRAPI_EVENT_ON_GRAPHICS_STREAM_PAUSED:
398 case DISPID_RDPSRAPI_EVENT_ON_GRAPHICS_STREAM_RESUMED:
401 case DISPID_RDPSRAPI_EVENT_ON_VIRTUAL_CHANNEL_JOIN:
404 case DISPID_RDPSRAPI_EVENT_ON_VIRTUAL_CHANNEL_LEAVE:
407 case DISPID_RDPSRAPI_EVENT_ON_VIRTUAL_CHANNEL_DATARECEIVED:
410 case DISPID_RDPSRAPI_EVENT_ON_VIRTUAL_CHANNEL_SENDCOMPLETED:
413 case DISPID_RDPSRAPI_EVENT_ON_APPLICATION_OPEN:
416 case DISPID_RDPSRAPI_EVENT_ON_APPLICATION_CLOSE:
419 case DISPID_RDPSRAPI_EVENT_ON_APPLICATION_UPDATE:
422 case DISPID_RDPSRAPI_EVENT_ON_WINDOW_OPEN:
425 case DISPID_RDPSRAPI_EVENT_ON_WINDOW_CLOSE:
428 case DISPID_RDPSRAPI_EVENT_ON_WINDOW_UPDATE:
431 case DISPID_RDPSRAPI_EVENT_ON_APPFILTER_UPDATE:
434 case DISPID_RDPSRAPI_EVENT_ON_SHARED_RECT_CHANGED:
437 case DISPID_RDPSRAPI_EVENT_ON_FOCUSRELEASED:
440 case DISPID_RDPSRAPI_EVENT_ON_SHARED_DESKTOP_SETTINGS_CHANGED:
443 case DISPID_RDPAPI_EVENT_ON_BOUNDING_RECT_CHANGED:
450 static _IRDPSessionEventsVtbl Shadow_IRDPSessionEventsVtbl =
453 Shadow_IRDPSessionEvents_QueryInterface,
454 Shadow_IRDPSessionEvents_AddRef,
455 Shadow_IRDPSessionEvents_Release,
458 Shadow_IRDPSessionEvents_GetTypeInfoCount,
459 Shadow_IRDPSessionEvents_GetTypeInfo,
460 Shadow_IRDPSessionEvents_GetIDsOfNames,
461 Shadow_IRDPSessionEvents_Invoke
464 static _IRDPSessionEvents Shadow_IRDPSessionEvents =
466 &Shadow_IRDPSessionEventsVtbl
469 static LRESULT CALLBACK ShadowWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
482 return DefWindowProc(hwnd, uMsg, wParam, lParam);
489 int win_shadow_wds_wnd_init(winShadowSubsystem* subsystem)
493 WNDCLASSEX wndClassEx;
495 hModule = GetModuleHandle(NULL);
497 ZeroMemory(&wndClassEx, sizeof(WNDCLASSEX));
498 wndClassEx.cbSize = sizeof(WNDCLASSEX);
499 wndClassEx.style = 0;
500 wndClassEx.lpfnWndProc = ShadowWndProc;
501 wndClassEx.cbClsExtra = 0;
502 wndClassEx.cbWndExtra = 0;
503 wndClassEx.hInstance = hModule;
504 wndClassEx.hIcon = NULL;
505 wndClassEx.hCursor = NULL;
506 wndClassEx.hbrBackground = NULL;
507 wndClassEx.lpszMenuName = _T("ShadowWndMenu");
508 wndClassEx.lpszClassName = _T("ShadowWndClass");
509 wndClassEx.hIconSm = NULL;
511 if (!RegisterClassEx(&wndClassEx))
513 WLog_ERR(TAG, "RegisterClassEx failure");
517 hInstance = wndClassEx.hInstance;
519 subsystem->hWnd = CreateWindowEx(0, wndClassEx.lpszClassName,
520 0, 0, 0, 0, 0, 0, HWND_MESSAGE, 0, hInstance, NULL);
522 if (!subsystem->hWnd)
524 WLog_INFO(TAG, "CreateWindowEx failure");
531 int win_shadow_wds_init(winShadowSubsystem* subsystem)
540 rdpSettings* settings;
544 BSTR bstrConnectionString;
545 BSTR bstrPropertyName;
546 VARIANT varPropertyValue;
547 rdpAssistanceFile* file;
548 IConnectionPoint* pCP;
549 IConnectionPointContainer* pCPC;
551 win_shadow_wds_wnd_init(subsystem);
553 hr = OleInitialize(NULL);
557 WLog_ERR(TAG, "OleInitialize() failure");
561 hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
565 WLog_ERR(TAG, "CoInitialize() failure");
569 hr = CoCreateInstance(&CLSID_RDPSession, NULL, CLSCTX_ALL,
570 &IID_IRDPSRAPISharingSession, (void**) &(subsystem->pSharingSession));
574 WLog_ERR(TAG, "CoCreateInstance(IRDPSRAPISharingSession) failure: 0x%08X", hr);
578 pUnknown = (IUnknown*) subsystem->pSharingSession;
579 hr = pUnknown->lpVtbl->QueryInterface(pUnknown, &IID_IConnectionPointContainer, (void**) &pCPC);
583 WLog_ERR(TAG, "QueryInterface(IID_IConnectionPointContainer) failure: 0x%08X", hr);
587 pCPC->lpVtbl->FindConnectionPoint(pCPC, &DIID__IRDPSessionEvents, &pCP);
591 WLog_ERR(TAG, "IConnectionPointContainer::FindConnectionPoint(_IRDPSessionEvents) failure: 0x%08X", hr);
596 subsystem->pSessionEvents = &Shadow_IRDPSessionEvents;
597 subsystem->pSessionEvents->lpVtbl->AddRef(subsystem->pSessionEvents);
599 hr = pCP->lpVtbl->Advise(pCP, (IUnknown*) subsystem->pSessionEvents, &dwCookie);
603 WLog_ERR(TAG, "IConnectionPoint::Advise(Shadow_IRDPSessionEvents) failure: 0x%08X", hr);
607 hr = subsystem->pSharingSession->lpVtbl->put_ColorDepth(subsystem->pSharingSession, 32);
611 WLog_ERR(TAG, "IRDPSRAPISharingSession::put_ColorDepth() failure: 0x%08X", hr);
615 hr = subsystem->pSharingSession->lpVtbl->GetDesktopSharedRect(subsystem->pSharingSession,
616 &left, &top, &right, &bottom);
620 WLog_ERR(TAG, "IRDPSRAPISharingSession::GetDesktopSharedRect() failure: 0x%08X", hr);
624 width = right - left;
625 height = bottom - top;
627 WLog_INFO(TAG, "GetDesktopSharedRect(): left: %d top: %d right: %d bottom: %d width: %d height: %d",
628 left, top, right, bottom, width, height);
630 hr = subsystem->pSharingSession->lpVtbl->get_VirtualChannelManager(subsystem->pSharingSession,
631 &(subsystem->pVirtualChannelMgr));
635 WLog_ERR(TAG, "IRDPSRAPISharingSession::get_VirtualChannelManager() failure: 0x%08X", hr);
639 hr = subsystem->pSharingSession->lpVtbl->get_ApplicationFilter(subsystem->pSharingSession,
640 &(subsystem->pApplicationFilter));
644 WLog_ERR(TAG, "IRDPSRAPISharingSession::get_ApplicationFilter() failure: 0x%08X", hr);
648 hr = subsystem->pSharingSession->lpVtbl->get_Attendees(subsystem->pSharingSession,
649 &(subsystem->pAttendeeMgr));
653 WLog_ERR(TAG, "IRDPSRAPISharingSession::get_Attendees() failure: 0x%08X", hr);
657 hr = subsystem->pSharingSession->lpVtbl->get_Properties(subsystem->pSharingSession, &(subsystem->pSessionProperties));
661 WLog_ERR(TAG, "IRDPSRAPISharingSession::get_Properties() failure: 0x%08X", hr);
665 bstrPropertyName = SysAllocString(L"PortId");
666 varPropertyValue.vt = VT_I4;
667 varPropertyValue.intVal = 40000;
669 hr = subsystem->pSessionProperties->lpVtbl->put_Property(subsystem->pSessionProperties,
670 bstrPropertyName, varPropertyValue);
672 SysFreeString(bstrPropertyName);
676 WLog_ERR(TAG, "IRDPSRAPISessionProperties::put_Property(PortId) failure: 0x%08X", hr);
680 bstrPropertyName = SysAllocString(L"DrvConAttach");
681 varPropertyValue.vt = VT_BOOL;
682 varPropertyValue.boolVal = VARIANT_TRUE;
684 hr = subsystem->pSessionProperties->lpVtbl->put_Property(subsystem->pSessionProperties,
685 bstrPropertyName, varPropertyValue);
687 SysFreeString(bstrPropertyName);
691 WLog_ERR(TAG, "IRDPSRAPISessionProperties::put_Property(DrvConAttach) failure: 0x%08X", hr);
695 bstrPropertyName = SysAllocString(L"PortProtocol");
696 varPropertyValue.vt = VT_I4;
698 //varPropertyValue.intVal = 0; // AF_UNSPEC
699 varPropertyValue.intVal = 2; // AF_INET
700 //varPropertyValue.intVal = 23; // AF_INET6
702 hr = subsystem->pSessionProperties->lpVtbl->put_Property(subsystem->pSessionProperties,
703 bstrPropertyName, varPropertyValue);
705 SysFreeString(bstrPropertyName);
709 WLog_ERR(TAG, "IRDPSRAPISessionProperties::put_Property(PortProtocol) failure: 0x%08X", hr);
713 hr = subsystem->pSharingSession->lpVtbl->Open(subsystem->pSharingSession);
717 WLog_ERR(TAG, "IRDPSRAPISharingSession::Open() failure: 0x%08X", hr);
721 hr = subsystem->pSharingSession->lpVtbl->get_Invitations(subsystem->pSharingSession,
722 &(subsystem->pInvitationMgr));
726 WLog_ERR(TAG, "IRDPSRAPISharingSession::get_Invitations() failure");
730 bstrAuthString = SysAllocString(L"Shadow");
731 bstrGroupName = SysAllocString(L"ShadowGroup");
732 bstrPassword = SysAllocString(L"Shadow123!");
734 hr = subsystem->pInvitationMgr->lpVtbl->CreateInvitation(subsystem->pInvitationMgr, bstrAuthString,
735 bstrGroupName, bstrPassword, 5, &(subsystem->pInvitation));
737 SysFreeString(bstrAuthString);
738 SysFreeString(bstrGroupName);
739 SysFreeString(bstrPassword);
743 WLog_ERR(TAG, "IRDPSRAPIInvitationManager::CreateInvitation() failure: 0x%08X", hr);
747 subsystem->pInvitation->lpVtbl->get_ConnectionString(subsystem->pInvitation, &bstrConnectionString);
751 WLog_ERR(TAG, "IRDPSRAPIInvitation::get_ConnectionString() failure: 0x%08X", hr);
755 file = subsystem->pAssistanceFile = freerdp_assistance_file_new();
757 ConvertFromUnicode(CP_UTF8, 0, (WCHAR*) bstrConnectionString,
758 ((UINT32*) bstrConnectionString)[-1], &(file->ConnectionString2), 0, NULL, NULL);
760 status = freerdp_assistance_parse_connection_string2(file);
765 WLog_INFO(TAG, "ConnectionString: %s", file->ConnectionString2);
771 fp = fopen("inv.xml", "w+b");
775 size = strlen(file->ConnectionString2);
776 if (fwrite(file->ConnectionString2, size, 1, fp) != 1 || fwrite("\r\n", 2, 1, fp) != 1)
779 WLog_ERR(TAG, "Problem writing to inv.xml");
786 status = win_shadow_rdp_init(subsystem);
790 WLog_ERR(TAG, "win_shadow_rdp_init() failure: %d", status);
794 settings = subsystem->shw->settings;
796 freerdp_set_param_bool(settings, FreeRDP_RemoteAssistanceMode, TRUE);
798 freerdp_set_param_string(settings, FreeRDP_RemoteAssistanceSessionId, file->RASessionId);
800 freerdp_set_param_string(settings, FreeRDP_RemoteAssistanceRCTicket, file->ConnectionString2);
802 freerdp_set_param_string(settings, FreeRDP_Domain, "RDP");
803 freerdp_set_param_string(settings, FreeRDP_Username, "Shadow");
804 freerdp_set_param_string(settings, FreeRDP_RemoteAssistancePassword, "Shadow123!");
805 freerdp_set_param_bool(settings, FreeRDP_AutoLogonEnabled, TRUE);
807 freerdp_set_param_string(settings, FreeRDP_ServerHostname, file->MachineAddress);
808 freerdp_set_param_uint32(settings, FreeRDP_ServerPort, file->MachinePort);
810 freerdp_set_param_uint32(settings, FreeRDP_DesktopWidth, width);
811 freerdp_set_param_uint32(settings, FreeRDP_DesktopHeight, height);
813 status = win_shadow_rdp_start(subsystem);
817 WLog_ERR(TAG, "win_shadow_rdp_start() failure: %d", status);
824 int win_shadow_wds_uninit(winShadowSubsystem* subsystem)
826 if (subsystem->pSharingSession)
828 subsystem->pSharingSession->lpVtbl->Close(subsystem->pSharingSession);
829 subsystem->pSharingSession->lpVtbl->Release(subsystem->pSharingSession);
830 subsystem->pSharingSession = NULL;
833 if (subsystem->pVirtualChannelMgr)
835 subsystem->pVirtualChannelMgr->lpVtbl->Release(subsystem->pVirtualChannelMgr);
836 subsystem->pVirtualChannelMgr = NULL;
839 if (subsystem->pApplicationFilter)
841 subsystem->pApplicationFilter->lpVtbl->Release(subsystem->pApplicationFilter);
842 subsystem->pApplicationFilter = NULL;
845 if (subsystem->pAttendeeMgr)
847 subsystem->pAttendeeMgr->lpVtbl->Release(subsystem->pAttendeeMgr);
848 subsystem->pAttendeeMgr = NULL;
851 if (subsystem->pSessionProperties)
853 subsystem->pSessionProperties->lpVtbl->Release(subsystem->pSessionProperties);
854 subsystem->pSessionProperties = NULL;
857 if (subsystem->pInvitationMgr)
859 subsystem->pInvitationMgr->lpVtbl->Release(subsystem->pInvitationMgr);
860 subsystem->pInvitationMgr = NULL;
863 if (subsystem->pInvitation)
865 subsystem->pInvitation->lpVtbl->Release(subsystem->pInvitation);
866 subsystem->pInvitation = NULL;
869 if (subsystem->pAssistanceFile)
871 freerdp_assistance_file_free(subsystem->pAssistanceFile);
872 subsystem->pAssistanceFile = NULL;
877 DestroyWindow(subsystem->hWnd);
878 subsystem->hWnd = NULL;
883 win_shadow_rdp_uninit(subsystem);
884 subsystem->shw = NULL;