Blame server/shadow/Win/win_wds.c

Packit 1fb8d4
/**
Packit 1fb8d4
 * FreeRDP: A Remote Desktop Protocol Implementation
Packit 1fb8d4
 *
Packit 1fb8d4
 * Copyright 2014 Marc-Andre Moreau <marcandre.moreau@gmail.com>
Packit 1fb8d4
 *
Packit 1fb8d4
 * Licensed under the Apache License, Version 2.0 (the "License");
Packit 1fb8d4
 * you may not use this file except in compliance with the License.
Packit 1fb8d4
 * You may obtain a copy of the License at
Packit 1fb8d4
 *
Packit 1fb8d4
 *     http://www.apache.org/licenses/LICENSE-2.0
Packit 1fb8d4
 *
Packit 1fb8d4
 * Unless required by applicable law or agreed to in writing, software
Packit 1fb8d4
 * distributed under the License is distributed on an "AS IS" BASIS,
Packit 1fb8d4
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Packit 1fb8d4
 * See the License for the specific language governing permissions and
Packit 1fb8d4
 * limitations under the License.
Packit 1fb8d4
 */
Packit 1fb8d4
Packit 1fb8d4
#ifdef HAVE_CONFIG_H
Packit 1fb8d4
#include "config.h"
Packit 1fb8d4
#endif
Packit 1fb8d4
Packit 1fb8d4
#include <winpr/crt.h>
Packit 1fb8d4
#include <winpr/print.h>
Packit 1fb8d4
#include <freerdp/log.h>
Packit 1fb8d4
Packit 1fb8d4
#include "win_rdp.h"
Packit 1fb8d4
Packit 1fb8d4
#include "win_wds.h"
Packit 1fb8d4
Packit 1fb8d4
/**
Packit 1fb8d4
 * Windows Desktop Sharing API:
Packit 1fb8d4
 * http://blogs.msdn.com/b/rds/archive/2007/03/08/windows-desktop-sharing-api.aspx
Packit 1fb8d4
 *
Packit 1fb8d4
 * Windows Desktop Sharing Interfaces:
Packit 1fb8d4
 * http://msdn.microsoft.com/en-us/library/aa373871%28v=vs.85%29.aspx
Packit 1fb8d4
 *
Packit 1fb8d4
 * Offer Remote Assistance Sample C:
Packit 1fb8d4
 * http://msdn.microsoft.com/en-us/library/ms811079.aspx#remoteassistanceapi_topic2b
Packit 1fb8d4
 *
Packit 1fb8d4
 * Remote Assistance in XP: Programmatically establish an RDP session:
Packit 1fb8d4
 * http://www.codeproject.com/Articles/29939/Remote-Assistance-in-XP-Programmatically-establish
Packit 1fb8d4
 */
Packit 1fb8d4
Packit 1fb8d4
#undef DEFINE_GUID
Packit 1fb8d4
#define INITGUID
Packit 1fb8d4
Packit 1fb8d4
#include <initguid.h>
Packit 1fb8d4
Packit 1fb8d4
#define TAG SERVER_TAG("shadow.win")
Packit 1fb8d4
Packit 1fb8d4
DEFINE_GUID(CLSID_RDPSession,0x9B78F0E6,0x3E05,0x4A5B,0xB2,0xE8,0xE7,0x43,0xA8,0x95,0x6B,0x65);
Packit 1fb8d4
DEFINE_GUID(DIID__IRDPSessionEvents,0x98a97042,0x6698,0x40e9,0x8e,0xfd,0xb3,0x20,0x09,0x90,0x00,0x4b);
Packit 1fb8d4
DEFINE_GUID(IID_IRDPSRAPISharingSession,0xeeb20886,0xe470,0x4cf6,0x84,0x2b,0x27,0x39,0xc0,0xec,0x5c,0xfb);
Packit 1fb8d4
DEFINE_GUID(IID_IRDPSRAPIAttendee,0xec0671b3,0x1b78,0x4b80,0xa4,0x64,0x91,0x32,0x24,0x75,0x43,0xe3);
Packit 1fb8d4
DEFINE_GUID(IID_IRDPSRAPIAttendeeManager,0xba3a37e8,0x33da,0x4749,0x8d,0xa0,0x07,0xfa,0x34,0xda,0x79,0x44);
Packit 1fb8d4
DEFINE_GUID(IID_IRDPSRAPISessionProperties,0x339b24f2,0x9bc0,0x4f16,0x9a,0xac,0xf1,0x65,0x43,0x3d,0x13,0xd4);
Packit 1fb8d4
DEFINE_GUID(CLSID_RDPSRAPIApplicationFilter,0xe35ace89,0xc7e8,0x427e,0xa4,0xf9,0xb9,0xda,0x07,0x28,0x26,0xbd);
Packit 1fb8d4
DEFINE_GUID(CLSID_RDPSRAPIInvitationManager,0x53d9c9db,0x75ab,0x4271,0x94,0x8a,0x4c,0x4e,0xb3,0x6a,0x8f,0x2b);
Packit 1fb8d4
Packit 1fb8d4
static ULONG Shadow_IRDPSessionEvents_RefCount = 0;
Packit 1fb8d4
Packit 1fb8d4
const char* GetRDPSessionEventString(DISPID id)
Packit 1fb8d4
{
Packit 1fb8d4
	switch (id)
Packit 1fb8d4
	{
Packit 1fb8d4
		case DISPID_RDPSRAPI_EVENT_ON_ATTENDEE_CONNECTED:
Packit 1fb8d4
			return "OnAttendeeConnected";
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case DISPID_RDPSRAPI_EVENT_ON_ATTENDEE_DISCONNECTED:
Packit 1fb8d4
			return "OnAttendeeDisconnected";
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case DISPID_RDPSRAPI_EVENT_ON_ATTENDEE_UPDATE:
Packit 1fb8d4
			return "OnAttendeeUpdate";
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case DISPID_RDPSRAPI_EVENT_ON_ERROR:
Packit 1fb8d4
			return "OnError";
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case DISPID_RDPSRAPI_EVENT_ON_VIEWER_CONNECTED:
Packit 1fb8d4
			return "OnConnectionEstablished";
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case DISPID_RDPSRAPI_EVENT_ON_VIEWER_DISCONNECTED:
Packit 1fb8d4
			return "OnConnectionTerminated";
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case DISPID_RDPSRAPI_EVENT_ON_VIEWER_AUTHENTICATED:
Packit 1fb8d4
			return "OnConnectionAuthenticated";
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case DISPID_RDPSRAPI_EVENT_ON_VIEWER_CONNECTFAILED:
Packit 1fb8d4
			return "OnConnectionFailed";
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case DISPID_RDPSRAPI_EVENT_ON_CTRLLEVEL_CHANGE_REQUEST:
Packit 1fb8d4
			return "OnControlLevelChangeRequest";
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case DISPID_RDPSRAPI_EVENT_ON_GRAPHICS_STREAM_PAUSED:
Packit 1fb8d4
			return "OnGraphicsStreamPaused";
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case DISPID_RDPSRAPI_EVENT_ON_GRAPHICS_STREAM_RESUMED:
Packit 1fb8d4
			return "OnGraphicsStreamResumed";
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case DISPID_RDPSRAPI_EVENT_ON_VIRTUAL_CHANNEL_JOIN:
Packit 1fb8d4
			return "OnChannelJoin";
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case DISPID_RDPSRAPI_EVENT_ON_VIRTUAL_CHANNEL_LEAVE:
Packit 1fb8d4
			return "OnChannelLeave";
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case DISPID_RDPSRAPI_EVENT_ON_VIRTUAL_CHANNEL_DATARECEIVED:
Packit 1fb8d4
			return "OnChannelDataReceived";
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case DISPID_RDPSRAPI_EVENT_ON_VIRTUAL_CHANNEL_SENDCOMPLETED:
Packit 1fb8d4
			return "OnChannelDataSent";
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case DISPID_RDPSRAPI_EVENT_ON_APPLICATION_OPEN:
Packit 1fb8d4
			return "OnApplicationOpen";
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case DISPID_RDPSRAPI_EVENT_ON_APPLICATION_CLOSE:
Packit 1fb8d4
			return "OnApplicationClose";
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case DISPID_RDPSRAPI_EVENT_ON_APPLICATION_UPDATE:
Packit 1fb8d4
			return "OnApplicationUpdate";
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case DISPID_RDPSRAPI_EVENT_ON_WINDOW_OPEN:
Packit 1fb8d4
			return "OnWindowOpen";
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case DISPID_RDPSRAPI_EVENT_ON_WINDOW_CLOSE:
Packit 1fb8d4
			return "OnWindowClose";
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case DISPID_RDPSRAPI_EVENT_ON_WINDOW_UPDATE:
Packit 1fb8d4
			return "OnWindowUpdate";
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case DISPID_RDPSRAPI_EVENT_ON_APPFILTER_UPDATE:
Packit 1fb8d4
			return "OnAppFilterUpdate";
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case DISPID_RDPSRAPI_EVENT_ON_SHARED_RECT_CHANGED:
Packit 1fb8d4
			return "OnSharedRectChanged";
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case DISPID_RDPSRAPI_EVENT_ON_FOCUSRELEASED:
Packit 1fb8d4
			return "OnFocusReleased";
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case DISPID_RDPSRAPI_EVENT_ON_SHARED_DESKTOP_SETTINGS_CHANGED:
Packit 1fb8d4
			return "OnSharedDesktopSettingsChanged";
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case DISPID_RDPAPI_EVENT_ON_BOUNDING_RECT_CHANGED:
Packit 1fb8d4
			return "OnViewingSizeChanged";
Packit 1fb8d4
			break;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	return "OnUnknown";
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static HRESULT STDMETHODCALLTYPE Shadow_IRDPSessionEvents_QueryInterface( 
Packit 1fb8d4
            __RPC__in _IRDPSessionEvents * This,
Packit 1fb8d4
            /* [in] */ __RPC__in REFIID riid,
Packit 1fb8d4
            /* [annotation][iid_is][out] */ 
Packit 1fb8d4
            _COM_Outptr_  void **ppvObject)
Packit 1fb8d4
{
Packit 1fb8d4
	*ppvObject = NULL;
Packit 1fb8d4
Packit 1fb8d4
	if (IsEqualIID(riid, &DIID__IRDPSessionEvents) ||
Packit 1fb8d4
		IsEqualIID(riid, &IID_IDispatch) || IsEqualIID(riid, &IID_IUnknown))
Packit 1fb8d4
	{
Packit 1fb8d4
		*ppvObject = This;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	if (!(*ppvObject))
Packit 1fb8d4
		return E_NOINTERFACE;
Packit 1fb8d4
Packit 1fb8d4
	This->lpVtbl->AddRef(This);
Packit 1fb8d4
Packit 1fb8d4
	return S_OK;
Packit 1fb8d4
}
Packit 1fb8d4
        
Packit 1fb8d4
static ULONG STDMETHODCALLTYPE Shadow_IRDPSessionEvents_AddRef( 
Packit 1fb8d4
            __RPC__in _IRDPSessionEvents * This)
Packit 1fb8d4
{
Packit 1fb8d4
	Shadow_IRDPSessionEvents_RefCount++;
Packit 1fb8d4
	return Shadow_IRDPSessionEvents_RefCount;
Packit 1fb8d4
}
Packit 1fb8d4
        
Packit 1fb8d4
static ULONG STDMETHODCALLTYPE Shadow_IRDPSessionEvents_Release( 
Packit 1fb8d4
            __RPC__in _IRDPSessionEvents * This)
Packit 1fb8d4
{
Packit 1fb8d4
	if (!Shadow_IRDPSessionEvents_RefCount)
Packit 1fb8d4
		return 0;
Packit 1fb8d4
Packit 1fb8d4
	Shadow_IRDPSessionEvents_RefCount--;
Packit 1fb8d4
Packit 1fb8d4
	return Shadow_IRDPSessionEvents_RefCount;
Packit 1fb8d4
}
Packit 1fb8d4
        
Packit 1fb8d4
static HRESULT STDMETHODCALLTYPE Shadow_IRDPSessionEvents_GetTypeInfoCount( 
Packit 1fb8d4
            __RPC__in _IRDPSessionEvents * This,
Packit 1fb8d4
            /* [out] */ __RPC__out UINT *pctinfo)
Packit 1fb8d4
{
Packit 1fb8d4
	WLog_INFO(TAG, "Shadow_IRDPSessionEvents_GetTypeInfoCount");
Packit 1fb8d4
	*pctinfo = 1;
Packit 1fb8d4
	return S_OK;
Packit 1fb8d4
}
Packit 1fb8d4
        
Packit 1fb8d4
static HRESULT STDMETHODCALLTYPE Shadow_IRDPSessionEvents_GetTypeInfo( 
Packit 1fb8d4
            __RPC__in _IRDPSessionEvents * This,
Packit 1fb8d4
            /* [in] */ UINT iTInfo,
Packit 1fb8d4
            /* [in] */ LCID lcid,
Packit 1fb8d4
            /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo)
Packit 1fb8d4
{
Packit 1fb8d4
	WLog_INFO(TAG, "Shadow_IRDPSessionEvents_GetTypeInfo");
Packit 1fb8d4
	return E_NOTIMPL;
Packit 1fb8d4
}
Packit 1fb8d4
        
Packit 1fb8d4
static HRESULT STDMETHODCALLTYPE Shadow_IRDPSessionEvents_GetIDsOfNames( 
Packit 1fb8d4
            __RPC__in _IRDPSessionEvents * This,
Packit 1fb8d4
            /* [in] */ __RPC__in REFIID riid,
Packit 1fb8d4
            /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,
Packit 1fb8d4
            /* [range][in] */ __RPC__in_range(0,16384) UINT cNames,
Packit 1fb8d4
            /* [in] */ LCID lcid,
Packit 1fb8d4
            /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId)
Packit 1fb8d4
{
Packit 1fb8d4
	WLog_INFO(TAG, "Shadow_IRDPSessionEvents_GetIDsOfNames");
Packit 1fb8d4
	return E_NOTIMPL;
Packit 1fb8d4
}
Packit 1fb8d4
        
Packit 1fb8d4
static HRESULT STDMETHODCALLTYPE Shadow_IRDPSessionEvents_Invoke( 
Packit 1fb8d4
            _IRDPSessionEvents * This,
Packit 1fb8d4
            /* [annotation][in] */ 
Packit 1fb8d4
            _In_  DISPID dispIdMember,
Packit 1fb8d4
            /* [annotation][in] */ 
Packit 1fb8d4
            _In_  REFIID riid,
Packit 1fb8d4
            /* [annotation][in] */ 
Packit 1fb8d4
            _In_  LCID lcid,
Packit 1fb8d4
            /* [annotation][in] */ 
Packit 1fb8d4
            _In_  WORD wFlags,
Packit 1fb8d4
            /* [annotation][out][in] */ 
Packit 1fb8d4
            _In_  DISPPARAMS *pDispParams,
Packit 1fb8d4
            /* [annotation][out] */ 
Packit 1fb8d4
            _Out_opt_  VARIANT *pVarResult,
Packit 1fb8d4
            /* [annotation][out] */ 
Packit 1fb8d4
            _Out_opt_  EXCEPINFO *pExcepInfo,
Packit 1fb8d4
            /* [annotation][out] */ 
Packit 1fb8d4
            _Out_opt_  UINT *puArgErr)
Packit 1fb8d4
{
Packit 1fb8d4
	HRESULT hr;
Packit 1fb8d4
	VARIANT vr;
Packit 1fb8d4
	UINT uArgErr;
Packit 1fb8d4
Packit 1fb8d4
	WLog_INFO(TAG, "%s (%ld)", GetRDPSessionEventString(dispIdMember), dispIdMember);
Packit 1fb8d4
Packit 1fb8d4
	switch (dispIdMember)
Packit 1fb8d4
	{
Packit 1fb8d4
		case DISPID_RDPSRAPI_EVENT_ON_ATTENDEE_CONNECTED:
Packit 1fb8d4
			{
Packit 1fb8d4
				int level;
Packit 1fb8d4
				IDispatch* pDispatch;
Packit 1fb8d4
				IRDPSRAPIAttendee* pAttendee;
Packit 1fb8d4
Packit 1fb8d4
				vr.vt = VT_DISPATCH;
Packit 1fb8d4
				vr.pdispVal = NULL;
Packit 1fb8d4
Packit 1fb8d4
				hr = DispGetParam(pDispParams, 0, VT_DISPATCH, &vr, &uArgErr);
Packit 1fb8d4
Packit 1fb8d4
				if (FAILED(hr))
Packit 1fb8d4
				{
Packit 1fb8d4
					WLog_ERR(TAG, "%s DispGetParam(0, VT_DISPATCH) failure: 0x%08lX",
Packit 1fb8d4
						GetRDPSessionEventString(dispIdMember), hr);
Packit 1fb8d4
					return hr;
Packit 1fb8d4
				}
Packit 1fb8d4
				
Packit 1fb8d4
				pDispatch = vr.pdispVal;
Packit 1fb8d4
Packit 1fb8d4
				hr = pDispatch->lpVtbl->QueryInterface(pDispatch, &IID_IRDPSRAPIAttendee, (void**) &pAttendee);
Packit 1fb8d4
Packit 1fb8d4
				if (FAILED(hr))
Packit 1fb8d4
				{
Packit 1fb8d4
					WLog_INFO(TAG, "%s IDispatch::QueryInterface(IRDPSRAPIAttendee) failure: 0x%08lX",
Packit 1fb8d4
						GetRDPSessionEventString(dispIdMember), hr);
Packit 1fb8d4
					return hr;
Packit 1fb8d4
				}
Packit 1fb8d4
Packit 1fb8d4
				level = CTRL_LEVEL_VIEW;
Packit 1fb8d4
				//level = CTRL_LEVEL_INTERACTIVE;
Packit 1fb8d4
Packit 1fb8d4
				hr = pAttendee->lpVtbl->put_ControlLevel(pAttendee, level);
Packit 1fb8d4
Packit 1fb8d4
				if (FAILED(hr))
Packit 1fb8d4
				{
Packit 1fb8d4
					WLog_INFO(TAG, "%s IRDPSRAPIAttendee::put_ControlLevel() failure: 0x%08lX",
Packit 1fb8d4
						GetRDPSessionEventString(dispIdMember), hr);
Packit 1fb8d4
					return hr;
Packit 1fb8d4
				}
Packit 1fb8d4
Packit 1fb8d4
				pAttendee->lpVtbl->Release(pAttendee);
Packit 1fb8d4
			}
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case DISPID_RDPSRAPI_EVENT_ON_ATTENDEE_DISCONNECTED:
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case DISPID_RDPSRAPI_EVENT_ON_ATTENDEE_UPDATE:
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case DISPID_RDPSRAPI_EVENT_ON_ERROR:
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case DISPID_RDPSRAPI_EVENT_ON_VIEWER_CONNECTED:
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case DISPID_RDPSRAPI_EVENT_ON_VIEWER_DISCONNECTED:
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case DISPID_RDPSRAPI_EVENT_ON_VIEWER_AUTHENTICATED:
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case DISPID_RDPSRAPI_EVENT_ON_VIEWER_CONNECTFAILED:
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case DISPID_RDPSRAPI_EVENT_ON_CTRLLEVEL_CHANGE_REQUEST:
Packit 1fb8d4
			{
Packit 1fb8d4
				int level;
Packit 1fb8d4
				IDispatch* pDispatch;
Packit 1fb8d4
				IRDPSRAPIAttendee* pAttendee;
Packit 1fb8d4
Packit 1fb8d4
				vr.vt = VT_INT;
Packit 1fb8d4
				vr.pdispVal = NULL;
Packit 1fb8d4
Packit 1fb8d4
				hr = DispGetParam(pDispParams, 1, VT_INT, &vr, &uArgErr);
Packit 1fb8d4
Packit 1fb8d4
				if (FAILED(hr))
Packit 1fb8d4
				{
Packit 1fb8d4
					WLog_INFO(TAG, "%s DispGetParam(1, VT_INT) failure: 0x%08lX",
Packit 1fb8d4
						GetRDPSessionEventString(dispIdMember), hr);
Packit 1fb8d4
					return hr;
Packit 1fb8d4
				}
Packit 1fb8d4
Packit 1fb8d4
				level = vr.intVal;
Packit 1fb8d4
Packit 1fb8d4
				vr.vt = VT_DISPATCH;
Packit 1fb8d4
				vr.pdispVal = NULL;
Packit 1fb8d4
Packit 1fb8d4
				hr = DispGetParam(pDispParams, 0, VT_DISPATCH, &vr, &uArgErr);
Packit 1fb8d4
Packit 1fb8d4
				if (FAILED(hr))
Packit 1fb8d4
				{
Packit 1fb8d4
					WLog_ERR(TAG, "%s DispGetParam(0, VT_DISPATCH) failure: 0x%08lX",
Packit 1fb8d4
						GetRDPSessionEventString(dispIdMember), hr);
Packit 1fb8d4
					return hr;
Packit 1fb8d4
				}
Packit 1fb8d4
				
Packit 1fb8d4
				pDispatch = vr.pdispVal;
Packit 1fb8d4
Packit 1fb8d4
				hr = pDispatch->lpVtbl->QueryInterface(pDispatch, &IID_IRDPSRAPIAttendee, (void**) &pAttendee);
Packit 1fb8d4
Packit 1fb8d4
				if (FAILED(hr))
Packit 1fb8d4
				{
Packit 1fb8d4
					WLog_INFO(TAG, "%s IDispatch::QueryInterface(IRDPSRAPIAttendee) failure: 0x%08lX",
Packit 1fb8d4
						GetRDPSessionEventString(dispIdMember), hr);
Packit 1fb8d4
					return hr;
Packit 1fb8d4
				}
Packit 1fb8d4
Packit 1fb8d4
				hr = pAttendee->lpVtbl->put_ControlLevel(pAttendee, level);
Packit 1fb8d4
Packit 1fb8d4
				if (FAILED(hr))
Packit 1fb8d4
				{
Packit 1fb8d4
					WLog_INFO(TAG, "%s IRDPSRAPIAttendee::put_ControlLevel() failure: 0x%08lX",
Packit 1fb8d4
						GetRDPSessionEventString(dispIdMember), hr);
Packit 1fb8d4
					return hr;
Packit 1fb8d4
				}
Packit 1fb8d4
Packit 1fb8d4
				pAttendee->lpVtbl->Release(pAttendee);
Packit 1fb8d4
			}
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case DISPID_RDPSRAPI_EVENT_ON_GRAPHICS_STREAM_PAUSED:
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case DISPID_RDPSRAPI_EVENT_ON_GRAPHICS_STREAM_RESUMED:
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case DISPID_RDPSRAPI_EVENT_ON_VIRTUAL_CHANNEL_JOIN:
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case DISPID_RDPSRAPI_EVENT_ON_VIRTUAL_CHANNEL_LEAVE:
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case DISPID_RDPSRAPI_EVENT_ON_VIRTUAL_CHANNEL_DATARECEIVED:
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case DISPID_RDPSRAPI_EVENT_ON_VIRTUAL_CHANNEL_SENDCOMPLETED:
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case DISPID_RDPSRAPI_EVENT_ON_APPLICATION_OPEN:
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case DISPID_RDPSRAPI_EVENT_ON_APPLICATION_CLOSE:
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case DISPID_RDPSRAPI_EVENT_ON_APPLICATION_UPDATE:
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case DISPID_RDPSRAPI_EVENT_ON_WINDOW_OPEN:
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case DISPID_RDPSRAPI_EVENT_ON_WINDOW_CLOSE:
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case DISPID_RDPSRAPI_EVENT_ON_WINDOW_UPDATE:
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case DISPID_RDPSRAPI_EVENT_ON_APPFILTER_UPDATE:
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case DISPID_RDPSRAPI_EVENT_ON_SHARED_RECT_CHANGED:
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case DISPID_RDPSRAPI_EVENT_ON_FOCUSRELEASED:
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case DISPID_RDPSRAPI_EVENT_ON_SHARED_DESKTOP_SETTINGS_CHANGED:
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case DISPID_RDPAPI_EVENT_ON_BOUNDING_RECT_CHANGED:
Packit 1fb8d4
			break;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	return S_OK;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static _IRDPSessionEventsVtbl Shadow_IRDPSessionEventsVtbl =
Packit 1fb8d4
{
Packit 1fb8d4
	/* IUnknown */
Packit 1fb8d4
	Shadow_IRDPSessionEvents_QueryInterface,
Packit 1fb8d4
	Shadow_IRDPSessionEvents_AddRef,
Packit 1fb8d4
	Shadow_IRDPSessionEvents_Release,
Packit 1fb8d4
Packit 1fb8d4
	/* IDispatch */
Packit 1fb8d4
	Shadow_IRDPSessionEvents_GetTypeInfoCount,
Packit 1fb8d4
	Shadow_IRDPSessionEvents_GetTypeInfo,
Packit 1fb8d4
	Shadow_IRDPSessionEvents_GetIDsOfNames,
Packit 1fb8d4
	Shadow_IRDPSessionEvents_Invoke
Packit 1fb8d4
};
Packit 1fb8d4
Packit 1fb8d4
static _IRDPSessionEvents Shadow_IRDPSessionEvents =
Packit 1fb8d4
{
Packit 1fb8d4
	&Shadow_IRDPSessionEventsVtbl
Packit 1fb8d4
};
Packit 1fb8d4
Packit 1fb8d4
static LRESULT CALLBACK ShadowWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
Packit 1fb8d4
{
Packit 1fb8d4
	switch (uMsg)
Packit 1fb8d4
	{
Packit 1fb8d4
		case WM_CLOSE:
Packit 1fb8d4
			DestroyWindow(hwnd);
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case WM_DESTROY:
Packit 1fb8d4
			PostQuitMessage(0);
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		default:
Packit 1fb8d4
			return DefWindowProc(hwnd, uMsg, wParam, lParam);
Packit 1fb8d4
			break;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	return 0;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
int win_shadow_wds_wnd_init(winShadowSubsystem* subsystem)
Packit 1fb8d4
{
Packit 1fb8d4
	HMODULE hModule;
Packit 1fb8d4
	HINSTANCE hInstance;
Packit 1fb8d4
	WNDCLASSEX wndClassEx;
Packit 1fb8d4
Packit 1fb8d4
	hModule = GetModuleHandle(NULL);
Packit 1fb8d4
Packit 1fb8d4
	ZeroMemory(&wndClassEx, sizeof(WNDCLASSEX));
Packit 1fb8d4
	wndClassEx.cbSize = sizeof(WNDCLASSEX);
Packit 1fb8d4
	wndClassEx.style = 0;
Packit 1fb8d4
	wndClassEx.lpfnWndProc = ShadowWndProc;
Packit 1fb8d4
	wndClassEx.cbClsExtra = 0;
Packit 1fb8d4
	wndClassEx.cbWndExtra = 0;
Packit 1fb8d4
	wndClassEx.hInstance = hModule;
Packit 1fb8d4
	wndClassEx.hIcon = NULL;
Packit 1fb8d4
	wndClassEx.hCursor = NULL;
Packit 1fb8d4
	wndClassEx.hbrBackground = NULL;
Packit 1fb8d4
	wndClassEx.lpszMenuName = _T("ShadowWndMenu");
Packit 1fb8d4
	wndClassEx.lpszClassName = _T("ShadowWndClass");
Packit 1fb8d4
	wndClassEx.hIconSm = NULL;
Packit 1fb8d4
Packit 1fb8d4
	if (!RegisterClassEx(&wndClassEx))
Packit 1fb8d4
	{
Packit 1fb8d4
		WLog_ERR(TAG, "RegisterClassEx failure");
Packit 1fb8d4
		return -1;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	hInstance = wndClassEx.hInstance;
Packit 1fb8d4
Packit 1fb8d4
	subsystem->hWnd = CreateWindowEx(0, wndClassEx.lpszClassName,
Packit 1fb8d4
		0, 0, 0, 0, 0, 0, HWND_MESSAGE, 0, hInstance, NULL);
Packit 1fb8d4
Packit 1fb8d4
	if (!subsystem->hWnd)
Packit 1fb8d4
	{
Packit 1fb8d4
		WLog_INFO(TAG, "CreateWindowEx failure");
Packit 1fb8d4
		return -1;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	return 1;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
int win_shadow_wds_init(winShadowSubsystem* subsystem)
Packit 1fb8d4
{
Packit 1fb8d4
	int status;
Packit 1fb8d4
	HRESULT hr;
Packit 1fb8d4
	DWORD dwCookie;
Packit 1fb8d4
	long left, top;
Packit 1fb8d4
	long right, bottom;
Packit 1fb8d4
	long width, height;
Packit 1fb8d4
	IUnknown* pUnknown;
Packit 1fb8d4
	rdpSettings* settings;
Packit 1fb8d4
	BSTR bstrAuthString;
Packit 1fb8d4
	BSTR bstrGroupName;
Packit 1fb8d4
	BSTR bstrPassword;
Packit 1fb8d4
	BSTR bstrConnectionString;
Packit 1fb8d4
	BSTR bstrPropertyName;
Packit 1fb8d4
	VARIANT varPropertyValue;
Packit 1fb8d4
	rdpAssistanceFile* file;
Packit 1fb8d4
	IConnectionPoint* pCP;
Packit 1fb8d4
	IConnectionPointContainer* pCPC;
Packit 1fb8d4
Packit 1fb8d4
	win_shadow_wds_wnd_init(subsystem);
Packit 1fb8d4
Packit 1fb8d4
	hr = OleInitialize(NULL);
Packit 1fb8d4
Packit 1fb8d4
	if (FAILED(hr))
Packit 1fb8d4
	{
Packit 1fb8d4
		WLog_ERR(TAG, "OleInitialize() failure");
Packit 1fb8d4
		return -1;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
Packit 1fb8d4
Packit 1fb8d4
	if (FAILED(hr))
Packit 1fb8d4
	{
Packit 1fb8d4
		WLog_ERR(TAG, "CoInitialize() failure");
Packit 1fb8d4
		return -1;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	hr = CoCreateInstance(&CLSID_RDPSession, NULL, CLSCTX_ALL,
Packit 1fb8d4
		&IID_IRDPSRAPISharingSession, (void**) &(subsystem->pSharingSession));
Packit 1fb8d4
Packit 1fb8d4
	if (FAILED(hr))
Packit 1fb8d4
	{
Packit 1fb8d4
		WLog_ERR(TAG, "CoCreateInstance(IRDPSRAPISharingSession) failure: 0x%08lX", hr);
Packit 1fb8d4
		return -1;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	pUnknown = (IUnknown*) subsystem->pSharingSession;
Packit 1fb8d4
	hr = pUnknown->lpVtbl->QueryInterface(pUnknown, &IID_IConnectionPointContainer, (void**) &pCPC);
Packit 1fb8d4
Packit 1fb8d4
	if (FAILED(hr))
Packit 1fb8d4
	{
Packit 1fb8d4
		WLog_ERR(TAG, "QueryInterface(IID_IConnectionPointContainer) failure: 0x%08lX", hr);
Packit 1fb8d4
		return -1;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	pCPC->lpVtbl->FindConnectionPoint(pCPC, &DIID__IRDPSessionEvents, &pCP);
Packit 1fb8d4
Packit 1fb8d4
	if (FAILED(hr))
Packit 1fb8d4
	{
Packit 1fb8d4
		WLog_ERR(TAG, "IConnectionPointContainer::FindConnectionPoint(_IRDPSessionEvents) failure: 0x%08lX", hr);
Packit 1fb8d4
		return -1;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	dwCookie = 0;
Packit 1fb8d4
	subsystem->pSessionEvents = &Shadow_IRDPSessionEvents;
Packit 1fb8d4
	subsystem->pSessionEvents->lpVtbl->AddRef(subsystem->pSessionEvents);
Packit 1fb8d4
Packit 1fb8d4
	hr = pCP->lpVtbl->Advise(pCP, (IUnknown*) subsystem->pSessionEvents, &dwCookie);
Packit 1fb8d4
Packit 1fb8d4
	if (FAILED(hr))
Packit 1fb8d4
	{
Packit 1fb8d4
		WLog_ERR(TAG, "IConnectionPoint::Advise(Shadow_IRDPSessionEvents) failure: 0x%08lX", hr);
Packit 1fb8d4
		return -1;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	hr = subsystem->pSharingSession->lpVtbl->put_ColorDepth(subsystem->pSharingSession, 32);
Packit 1fb8d4
Packit 1fb8d4
	if (FAILED(hr))
Packit 1fb8d4
	{
Packit 1fb8d4
		WLog_ERR(TAG, "IRDPSRAPISharingSession::put_ColorDepth() failure: 0x%08lX", hr);
Packit 1fb8d4
		return -1;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	hr = subsystem->pSharingSession->lpVtbl->GetDesktopSharedRect(subsystem->pSharingSession,
Packit 1fb8d4
		&left, &top, &right, &bottom);
Packit 1fb8d4
Packit 1fb8d4
	if (FAILED(hr))
Packit 1fb8d4
	{
Packit 1fb8d4
		WLog_ERR(TAG, "IRDPSRAPISharingSession::GetDesktopSharedRect() failure: 0x%08lX", hr);
Packit 1fb8d4
		return -1;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	width = right - left;
Packit 1fb8d4
	height = bottom - top;
Packit 1fb8d4
Packit 1fb8d4
	WLog_INFO(TAG, "GetDesktopSharedRect(): left: %ld top: %ld right: %ld bottom: %ld width: %ld height: %ld",
Packit 1fb8d4
		left, top, right, bottom, width, height);
Packit 1fb8d4
Packit 1fb8d4
	hr = subsystem->pSharingSession->lpVtbl->get_VirtualChannelManager(subsystem->pSharingSession,
Packit 1fb8d4
		&(subsystem->pVirtualChannelMgr));
Packit 1fb8d4
Packit 1fb8d4
	if (FAILED(hr))
Packit 1fb8d4
	{
Packit 1fb8d4
		WLog_ERR(TAG, "IRDPSRAPISharingSession::get_VirtualChannelManager() failure: 0x%08lX", hr);
Packit 1fb8d4
		return -1;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	hr = subsystem->pSharingSession->lpVtbl->get_ApplicationFilter(subsystem->pSharingSession,
Packit 1fb8d4
		&(subsystem->pApplicationFilter));
Packit 1fb8d4
Packit 1fb8d4
	if (FAILED(hr))
Packit 1fb8d4
	{
Packit 1fb8d4
		WLog_ERR(TAG, "IRDPSRAPISharingSession::get_ApplicationFilter() failure: 0x%08lX", hr);
Packit 1fb8d4
		return -1;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	hr = subsystem->pSharingSession->lpVtbl->get_Attendees(subsystem->pSharingSession,
Packit 1fb8d4
		&(subsystem->pAttendeeMgr));
Packit 1fb8d4
Packit 1fb8d4
	if (FAILED(hr))
Packit 1fb8d4
	{
Packit 1fb8d4
		WLog_ERR(TAG, "IRDPSRAPISharingSession::get_Attendees() failure: 0x%08lX", hr);
Packit 1fb8d4
		return -1;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	hr = subsystem->pSharingSession->lpVtbl->get_Properties(subsystem->pSharingSession, &(subsystem->pSessionProperties));
Packit 1fb8d4
Packit 1fb8d4
	if (FAILED(hr))
Packit 1fb8d4
	{
Packit 1fb8d4
		WLog_ERR(TAG, "IRDPSRAPISharingSession::get_Properties() failure: 0x%08lX", hr);
Packit 1fb8d4
		return -1;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	bstrPropertyName = SysAllocString(L"PortId");
Packit 1fb8d4
	varPropertyValue.vt = VT_I4;
Packit 1fb8d4
	varPropertyValue.intVal = 40000;
Packit 1fb8d4
Packit 1fb8d4
	hr = subsystem->pSessionProperties->lpVtbl->put_Property(subsystem->pSessionProperties,
Packit 1fb8d4
		bstrPropertyName, varPropertyValue);
Packit 1fb8d4
Packit 1fb8d4
	SysFreeString(bstrPropertyName);
Packit 1fb8d4
Packit 1fb8d4
	if (FAILED(hr))
Packit 1fb8d4
	{
Packit 1fb8d4
		WLog_ERR(TAG, "IRDPSRAPISessionProperties::put_Property(PortId) failure: 0x%08lX", hr);
Packit 1fb8d4
		return -1;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	bstrPropertyName = SysAllocString(L"DrvConAttach");
Packit 1fb8d4
	varPropertyValue.vt = VT_BOOL;
Packit 1fb8d4
	varPropertyValue.boolVal = VARIANT_TRUE;
Packit 1fb8d4
Packit 1fb8d4
	hr = subsystem->pSessionProperties->lpVtbl->put_Property(subsystem->pSessionProperties,
Packit 1fb8d4
		bstrPropertyName, varPropertyValue);
Packit 1fb8d4
Packit 1fb8d4
	SysFreeString(bstrPropertyName);
Packit 1fb8d4
Packit 1fb8d4
	if (FAILED(hr))
Packit 1fb8d4
	{
Packit 1fb8d4
		WLog_ERR(TAG, "IRDPSRAPISessionProperties::put_Property(DrvConAttach) failure: 0x%08lX", hr);
Packit 1fb8d4
		return -1;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	bstrPropertyName = SysAllocString(L"PortProtocol");
Packit 1fb8d4
	varPropertyValue.vt = VT_I4;
Packit 1fb8d4
Packit 1fb8d4
	//varPropertyValue.intVal = 0; // AF_UNSPEC
Packit 1fb8d4
	varPropertyValue.intVal = 2; // AF_INET
Packit 1fb8d4
	//varPropertyValue.intVal = 23; // AF_INET6
Packit 1fb8d4
Packit 1fb8d4
	hr = subsystem->pSessionProperties->lpVtbl->put_Property(subsystem->pSessionProperties,
Packit 1fb8d4
		bstrPropertyName, varPropertyValue);
Packit 1fb8d4
Packit 1fb8d4
	SysFreeString(bstrPropertyName);
Packit 1fb8d4
Packit 1fb8d4
	if (FAILED(hr))
Packit 1fb8d4
	{
Packit 1fb8d4
		WLog_ERR(TAG, "IRDPSRAPISessionProperties::put_Property(PortProtocol) failure: 0x%08lX", hr);
Packit 1fb8d4
		return -1;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	hr = subsystem->pSharingSession->lpVtbl->Open(subsystem->pSharingSession);
Packit 1fb8d4
Packit 1fb8d4
	if (FAILED(hr))
Packit 1fb8d4
	{
Packit 1fb8d4
		WLog_ERR(TAG, "IRDPSRAPISharingSession::Open() failure: 0x%08lX", hr);
Packit 1fb8d4
		return -1;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	hr = subsystem->pSharingSession->lpVtbl->get_Invitations(subsystem->pSharingSession,
Packit 1fb8d4
		&(subsystem->pInvitationMgr));
Packit 1fb8d4
Packit 1fb8d4
	if (FAILED(hr))
Packit 1fb8d4
	{
Packit 1fb8d4
		WLog_ERR(TAG, "IRDPSRAPISharingSession::get_Invitations() failure");
Packit 1fb8d4
		return -1;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	bstrAuthString = SysAllocString(L"Shadow");
Packit 1fb8d4
	bstrGroupName = SysAllocString(L"ShadowGroup");
Packit 1fb8d4
	bstrPassword = SysAllocString(L"Shadow123!");
Packit 1fb8d4
Packit 1fb8d4
	hr = subsystem->pInvitationMgr->lpVtbl->CreateInvitation(subsystem->pInvitationMgr, bstrAuthString,
Packit 1fb8d4
		bstrGroupName, bstrPassword, 5, &(subsystem->pInvitation));
Packit 1fb8d4
Packit 1fb8d4
	SysFreeString(bstrAuthString);
Packit 1fb8d4
	SysFreeString(bstrGroupName);
Packit 1fb8d4
	SysFreeString(bstrPassword);
Packit 1fb8d4
Packit 1fb8d4
	if (FAILED(hr))
Packit 1fb8d4
	{
Packit 1fb8d4
		WLog_ERR(TAG, "IRDPSRAPIInvitationManager::CreateInvitation() failure: 0x%08lX", hr);
Packit 1fb8d4
		return -1;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	hr = subsystem->pInvitation->lpVtbl->get_ConnectionString(subsystem->pInvitation, &bstrConnectionString);
Packit 1fb8d4
Packit 1fb8d4
	if (FAILED(hr))
Packit 1fb8d4
	{
Packit 1fb8d4
		WLog_ERR(TAG, "IRDPSRAPIInvitation::get_ConnectionString() failure: 0x%08lX", hr);
Packit 1fb8d4
		return -1;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	file = subsystem->pAssistanceFile = freerdp_assistance_file_new();
Packit 1fb8d4
Packit 1fb8d4
	if (!file)
Packit 1fb8d4
	{
Packit 1fb8d4
		WLog_ERR(TAG, "freerdp_assistance_file_new() failed");
Packit 1fb8d4
		return -1;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	status = ConvertFromUnicode(CP_UTF8, 0, (WCHAR*) bstrConnectionString,
Packit 1fb8d4
		((UINT32*) bstrConnectionString)[-1], &(file->ConnectionString2), 0, NULL, NULL);
Packit 1fb8d4
Packit 1fb8d4
	SysFreeString(bstrConnectionString);
Packit 1fb8d4
Packit 1fb8d4
	if (status < 1)
Packit 1fb8d4
	{
Packit 1fb8d4
		WLog_ERR(TAG, "failed to convert connection string");
Packit 1fb8d4
		return -1;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	status = freerdp_assistance_parse_connection_string2(file);
Packit 1fb8d4
Packit 1fb8d4
	if (status < 0)
Packit 1fb8d4
		return -1;
Packit 1fb8d4
Packit 1fb8d4
	WLog_INFO(TAG, "ConnectionString: %s", file->ConnectionString2);
Packit 1fb8d4
Packit 1fb8d4
#if 0
Packit 1fb8d4
	FILE* fp;
Packit 1fb8d4
	size_t size;
Packit 1fb8d4
Packit 1fb8d4
	fp = fopen("inv.xml", "w+b");
Packit 1fb8d4
Packit 1fb8d4
	if (fp)
Packit 1fb8d4
	{
Packit 1fb8d4
		size = strlen(file->ConnectionString2);
Packit 1fb8d4
		if (fwrite(file->ConnectionString2, size, 1, fp) != 1 || fwrite("\r\n", 2, 1, fp) != 1)
Packit 1fb8d4
		{
Packit 1fb8d4
			fclose(fp);
Packit 1fb8d4
			WLog_ERR(TAG, "Problem writing to inv.xml");
Packit 1fb8d4
			return -1;
Packit 1fb8d4
		}
Packit 1fb8d4
		fclose(fp);
Packit 1fb8d4
	}
Packit 1fb8d4
#endif
Packit 1fb8d4
Packit 1fb8d4
	status = win_shadow_rdp_init(subsystem);
Packit 1fb8d4
Packit 1fb8d4
	if (status < 0)
Packit 1fb8d4
	{
Packit 1fb8d4
		WLog_ERR(TAG, "win_shadow_rdp_init() failure: %d", status);
Packit 1fb8d4
		return status;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	settings = subsystem->shw->settings;
Packit 1fb8d4
Packit 1fb8d4
	freerdp_set_param_bool(settings, FreeRDP_RemoteAssistanceMode, TRUE);
Packit 1fb8d4
Packit 1fb8d4
	freerdp_set_param_string(settings, FreeRDP_RemoteAssistanceSessionId, file->RASessionId);
Packit 1fb8d4
Packit 1fb8d4
	freerdp_set_param_string(settings, FreeRDP_RemoteAssistanceRCTicket, file->ConnectionString2);
Packit 1fb8d4
Packit 1fb8d4
	freerdp_set_param_string(settings, FreeRDP_Domain, "RDP");
Packit 1fb8d4
	freerdp_set_param_string(settings, FreeRDP_Username, "Shadow");
Packit 1fb8d4
	freerdp_set_param_string(settings, FreeRDP_RemoteAssistancePassword, "Shadow123!");
Packit 1fb8d4
	freerdp_set_param_bool(settings, FreeRDP_AutoLogonEnabled, TRUE);
Packit 1fb8d4
Packit 1fb8d4
	freerdp_set_param_string(settings, FreeRDP_ServerHostname, file->MachineAddress);
Packit 1fb8d4
	freerdp_set_param_uint32(settings, FreeRDP_ServerPort, file->MachinePort);
Packit 1fb8d4
Packit 1fb8d4
	freerdp_set_param_uint32(settings, FreeRDP_DesktopWidth, width);
Packit 1fb8d4
	freerdp_set_param_uint32(settings, FreeRDP_DesktopHeight, height);
Packit 1fb8d4
Packit 1fb8d4
	status = win_shadow_rdp_start(subsystem);
Packit 1fb8d4
Packit 1fb8d4
	if (status < 0)
Packit 1fb8d4
	{
Packit 1fb8d4
		WLog_ERR(TAG, "win_shadow_rdp_start() failure: %d", status);
Packit 1fb8d4
		return status;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	return 1;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
int win_shadow_wds_uninit(winShadowSubsystem* subsystem)
Packit 1fb8d4
{
Packit 1fb8d4
	if (subsystem->pSharingSession)
Packit 1fb8d4
	{
Packit 1fb8d4
		subsystem->pSharingSession->lpVtbl->Close(subsystem->pSharingSession);
Packit 1fb8d4
		subsystem->pSharingSession->lpVtbl->Release(subsystem->pSharingSession);
Packit 1fb8d4
		subsystem->pSharingSession = NULL;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	if (subsystem->pVirtualChannelMgr)
Packit 1fb8d4
	{
Packit 1fb8d4
		subsystem->pVirtualChannelMgr->lpVtbl->Release(subsystem->pVirtualChannelMgr);
Packit 1fb8d4
		subsystem->pVirtualChannelMgr = NULL;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	if (subsystem->pApplicationFilter)
Packit 1fb8d4
	{
Packit 1fb8d4
		subsystem->pApplicationFilter->lpVtbl->Release(subsystem->pApplicationFilter);
Packit 1fb8d4
		subsystem->pApplicationFilter = NULL;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	if (subsystem->pAttendeeMgr)
Packit 1fb8d4
	{
Packit 1fb8d4
		subsystem->pAttendeeMgr->lpVtbl->Release(subsystem->pAttendeeMgr);
Packit 1fb8d4
		subsystem->pAttendeeMgr = NULL;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	if (subsystem->pSessionProperties)
Packit 1fb8d4
	{
Packit 1fb8d4
		subsystem->pSessionProperties->lpVtbl->Release(subsystem->pSessionProperties);
Packit 1fb8d4
		subsystem->pSessionProperties = NULL;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	if (subsystem->pInvitationMgr)
Packit 1fb8d4
	{
Packit 1fb8d4
		subsystem->pInvitationMgr->lpVtbl->Release(subsystem->pInvitationMgr);
Packit 1fb8d4
		subsystem->pInvitationMgr = NULL;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	if (subsystem->pInvitation)
Packit 1fb8d4
	{
Packit 1fb8d4
		subsystem->pInvitation->lpVtbl->Release(subsystem->pInvitation);
Packit 1fb8d4
		subsystem->pInvitation = NULL;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	if (subsystem->pAssistanceFile)
Packit 1fb8d4
	{
Packit 1fb8d4
		freerdp_assistance_file_free(subsystem->pAssistanceFile);
Packit 1fb8d4
		subsystem->pAssistanceFile = NULL;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	if (subsystem->hWnd)
Packit 1fb8d4
	{
Packit 1fb8d4
		DestroyWindow(subsystem->hWnd);
Packit 1fb8d4
		subsystem->hWnd = NULL;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	if (subsystem->shw)
Packit 1fb8d4
	{
Packit 1fb8d4
		win_shadow_rdp_uninit(subsystem);
Packit 1fb8d4
		subsystem->shw = NULL;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	return 1;
Packit 1fb8d4
}