Updated windows shadow server assistance usage.

This commit is contained in:
Armin Novak 2018-11-12 13:40:40 +01:00
parent 8df39fdad4
commit c8908c8be6
4 changed files with 146 additions and 169 deletions

View File

@ -334,7 +334,7 @@ int freerdp_client_settings_parse_assistance_file(rdpSettings* settings,
if (status < 0)
goto out;
if (!freerdp_client_populate_settings_from_assistance_file(file, settings))
if (!freerdp_assistance_populate_settings_from_assistance_file(file, settings))
goto out;
ret = 0;

View File

@ -37,12 +37,15 @@ FREERDP_API char* freerdp_assistance_construct_expert_blob(const char* name, con
FREERDP_API BYTE* freerdp_assistance_encrypt_pass_stub(const char* password, const char* passStub,
size_t* pEncryptedSize);
FREERDP_API int freerdp_assistance_set_connection_string2(rdpAssistanceFile* file,
const char* string, const char* password);
FREERDP_API int freerdp_assistance_parse_file_buffer(rdpAssistanceFile* file, const char* buffer,
size_t size, const char* password);
FREERDP_API int freerdp_assistance_parse_file(rdpAssistanceFile* file, const char* name,
const char* password);
FREERDP_API BOOL freerdp_client_populate_settings_from_assistance_file(rdpAssistanceFile* file,
FREERDP_API BOOL freerdp_assistance_populate_settings_from_assistance_file(rdpAssistanceFile* file,
rdpSettings* settings);
FREERDP_API BOOL freerdp_assistance_get_encrypted_pass_stub(rdpAssistanceFile* file,
const char** pwd, size_t* size);

View File

@ -1045,7 +1045,7 @@ int freerdp_assistance_parse_file(rdpAssistanceFile* file, const char* name, con
return status;
}
BOOL freerdp_client_populate_settings_from_assistance_file(rdpAssistanceFile* file,
BOOL freerdp_assistance_populate_settings_from_assistance_file(rdpAssistanceFile* file,
rdpSettings* settings)
{
UINT32 i;
@ -1057,9 +1057,17 @@ BOOL freerdp_client_populate_settings_from_assistance_file(rdpAssistanceFile* fi
if (freerdp_set_param_string(settings, FreeRDP_RemoteAssistanceSessionId, file->RASessionId) != 0)
return FALSE;
if (file->RCTicket &&
(freerdp_set_param_string(settings, FreeRDP_RemoteAssistanceRCTicket, file->RCTicket) != 0))
return FALSE;
if (file->RCTicket)
{
if (freerdp_set_param_string(settings, FreeRDP_RemoteAssistanceRCTicket, file->RCTicket) != 0)
return FALSE;
}
else
{
if (freerdp_set_param_string(settings, FreeRDP_RemoteAssistanceRCTicket,
file->ConnectionString2) != 0)
return FALSE;
}
if (file->PassStub)
{
@ -1171,3 +1179,16 @@ BOOL freerdp_assistance_get_encrypted_pass_stub(rdpAssistanceFile* file, const c
*size = file->EncryptedPassStubLength;
return TRUE;
}
int freerdp_assistance_set_connection_string2(rdpAssistanceFile* file, const char* string,
const char* password)
{
if (!file || !string || !password)
return -1;
free(file->ConnectionString2);
free(file->password);
file->ConnectionString2 = _strdup(string);
file->password = _strdup(password);
return freerdp_assistance_parse_connection_string2(file);
}

View File

@ -47,16 +47,26 @@
#include <initguid.h>
#include <freerdp/assistance.h>
#define TAG SERVER_TAG("shadow.win")
DEFINE_GUID(CLSID_RDPSession,0x9B78F0E6,0x3E05,0x4A5B,0xB2,0xE8,0xE7,0x43,0xA8,0x95,0x6B,0x65);
DEFINE_GUID(DIID__IRDPSessionEvents,0x98a97042,0x6698,0x40e9,0x8e,0xfd,0xb3,0x20,0x09,0x90,0x00,0x4b);
DEFINE_GUID(IID_IRDPSRAPISharingSession,0xeeb20886,0xe470,0x4cf6,0x84,0x2b,0x27,0x39,0xc0,0xec,0x5c,0xfb);
DEFINE_GUID(IID_IRDPSRAPIAttendee,0xec0671b3,0x1b78,0x4b80,0xa4,0x64,0x91,0x32,0x24,0x75,0x43,0xe3);
DEFINE_GUID(IID_IRDPSRAPIAttendeeManager,0xba3a37e8,0x33da,0x4749,0x8d,0xa0,0x07,0xfa,0x34,0xda,0x79,0x44);
DEFINE_GUID(IID_IRDPSRAPISessionProperties,0x339b24f2,0x9bc0,0x4f16,0x9a,0xac,0xf1,0x65,0x43,0x3d,0x13,0xd4);
DEFINE_GUID(CLSID_RDPSRAPIApplicationFilter,0xe35ace89,0xc7e8,0x427e,0xa4,0xf9,0xb9,0xda,0x07,0x28,0x26,0xbd);
DEFINE_GUID(CLSID_RDPSRAPIInvitationManager,0x53d9c9db,0x75ab,0x4271,0x94,0x8a,0x4c,0x4e,0xb3,0x6a,0x8f,0x2b);
DEFINE_GUID(CLSID_RDPSession, 0x9B78F0E6, 0x3E05, 0x4A5B, 0xB2, 0xE8, 0xE7, 0x43, 0xA8, 0x95, 0x6B,
0x65);
DEFINE_GUID(DIID__IRDPSessionEvents, 0x98a97042, 0x6698, 0x40e9, 0x8e, 0xfd, 0xb3, 0x20, 0x09, 0x90,
0x00, 0x4b);
DEFINE_GUID(IID_IRDPSRAPISharingSession, 0xeeb20886, 0xe470, 0x4cf6, 0x84, 0x2b, 0x27, 0x39, 0xc0,
0xec, 0x5c, 0xfb);
DEFINE_GUID(IID_IRDPSRAPIAttendee, 0xec0671b3, 0x1b78, 0x4b80, 0xa4, 0x64, 0x91, 0x32, 0x24, 0x75,
0x43, 0xe3);
DEFINE_GUID(IID_IRDPSRAPIAttendeeManager, 0xba3a37e8, 0x33da, 0x4749, 0x8d, 0xa0, 0x07, 0xfa, 0x34,
0xda, 0x79, 0x44);
DEFINE_GUID(IID_IRDPSRAPISessionProperties, 0x339b24f2, 0x9bc0, 0x4f16, 0x9a, 0xac, 0xf1, 0x65,
0x43, 0x3d, 0x13, 0xd4);
DEFINE_GUID(CLSID_RDPSRAPIApplicationFilter, 0xe35ace89, 0xc7e8, 0x427e, 0xa4, 0xf9, 0xb9, 0xda,
0x07, 0x28, 0x26, 0xbd);
DEFINE_GUID(CLSID_RDPSRAPIInvitationManager, 0x53d9c9db, 0x75ab, 0x4271, 0x94, 0x8a, 0x4c, 0x4e,
0xb3, 0x6a, 0x8f, 0x2b);
static ULONG Shadow_IRDPSessionEvents_RefCount = 0;
@ -172,16 +182,16 @@ const char* GetRDPSessionEventString(DISPID id)
return "OnUnknown";
}
static HRESULT STDMETHODCALLTYPE Shadow_IRDPSessionEvents_QueryInterface(
__RPC__in _IRDPSessionEvents * This,
/* [in] */ __RPC__in REFIID riid,
/* [annotation][iid_is][out] */
_COM_Outptr_ void **ppvObject)
static HRESULT STDMETHODCALLTYPE Shadow_IRDPSessionEvents_QueryInterface(
__RPC__in _IRDPSessionEvents* This,
/* [in] */ __RPC__in REFIID riid,
/* [annotation][iid_is][out] */
_COM_Outptr_ void** ppvObject)
{
*ppvObject = NULL;
if (IsEqualIID(riid, &DIID__IRDPSessionEvents) ||
IsEqualIID(riid, &IID_IDispatch) || IsEqualIID(riid, &IID_IUnknown))
IsEqualIID(riid, &IID_IDispatch) || IsEqualIID(riid, &IID_IUnknown))
{
*ppvObject = This;
}
@ -190,82 +200,79 @@ static HRESULT STDMETHODCALLTYPE Shadow_IRDPSessionEvents_QueryInterface(
return E_NOINTERFACE;
This->lpVtbl->AddRef(This);
return S_OK;
}
static ULONG STDMETHODCALLTYPE Shadow_IRDPSessionEvents_AddRef(
__RPC__in _IRDPSessionEvents * This)
static ULONG STDMETHODCALLTYPE Shadow_IRDPSessionEvents_AddRef(
__RPC__in _IRDPSessionEvents* This)
{
Shadow_IRDPSessionEvents_RefCount++;
return Shadow_IRDPSessionEvents_RefCount;
}
static ULONG STDMETHODCALLTYPE Shadow_IRDPSessionEvents_Release(
__RPC__in _IRDPSessionEvents * This)
static ULONG STDMETHODCALLTYPE Shadow_IRDPSessionEvents_Release(
__RPC__in _IRDPSessionEvents* This)
{
if (!Shadow_IRDPSessionEvents_RefCount)
return 0;
Shadow_IRDPSessionEvents_RefCount--;
return Shadow_IRDPSessionEvents_RefCount;
}
static HRESULT STDMETHODCALLTYPE Shadow_IRDPSessionEvents_GetTypeInfoCount(
__RPC__in _IRDPSessionEvents * This,
/* [out] */ __RPC__out UINT *pctinfo)
static HRESULT STDMETHODCALLTYPE Shadow_IRDPSessionEvents_GetTypeInfoCount(
__RPC__in _IRDPSessionEvents* This,
/* [out] */ __RPC__out UINT* pctinfo)
{
WLog_INFO(TAG, "Shadow_IRDPSessionEvents_GetTypeInfoCount");
*pctinfo = 1;
return S_OK;
}
static HRESULT STDMETHODCALLTYPE Shadow_IRDPSessionEvents_GetTypeInfo(
__RPC__in _IRDPSessionEvents * This,
/* [in] */ UINT iTInfo,
/* [in] */ LCID lcid,
/* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo)
static HRESULT STDMETHODCALLTYPE Shadow_IRDPSessionEvents_GetTypeInfo(
__RPC__in _IRDPSessionEvents* This,
/* [in] */ UINT iTInfo,
/* [in] */ LCID lcid,
/* [out] */ __RPC__deref_out_opt ITypeInfo** ppTInfo)
{
WLog_INFO(TAG, "Shadow_IRDPSessionEvents_GetTypeInfo");
return E_NOTIMPL;
}
static HRESULT STDMETHODCALLTYPE Shadow_IRDPSessionEvents_GetIDsOfNames(
__RPC__in _IRDPSessionEvents * This,
/* [in] */ __RPC__in REFIID riid,
/* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames,
/* [range][in] */ __RPC__in_range(0,16384) UINT cNames,
/* [in] */ LCID lcid,
/* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId)
static HRESULT STDMETHODCALLTYPE Shadow_IRDPSessionEvents_GetIDsOfNames(
__RPC__in _IRDPSessionEvents* This,
/* [in] */ __RPC__in REFIID riid,
/* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR* rgszNames,
/* [range][in] */ __RPC__in_range(0, 16384) UINT cNames,
/* [in] */ LCID lcid,
/* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID* rgDispId)
{
WLog_INFO(TAG, "Shadow_IRDPSessionEvents_GetIDsOfNames");
return E_NOTIMPL;
}
static HRESULT STDMETHODCALLTYPE Shadow_IRDPSessionEvents_Invoke(
_IRDPSessionEvents * This,
/* [annotation][in] */
_In_ DISPID dispIdMember,
/* [annotation][in] */
_In_ REFIID riid,
/* [annotation][in] */
_In_ LCID lcid,
/* [annotation][in] */
_In_ WORD wFlags,
/* [annotation][out][in] */
_In_ DISPPARAMS *pDispParams,
/* [annotation][out] */
_Out_opt_ VARIANT *pVarResult,
/* [annotation][out] */
_Out_opt_ EXCEPINFO *pExcepInfo,
/* [annotation][out] */
_Out_opt_ UINT *puArgErr)
static HRESULT STDMETHODCALLTYPE Shadow_IRDPSessionEvents_Invoke(
_IRDPSessionEvents* This,
/* [annotation][in] */
_In_ DISPID dispIdMember,
/* [annotation][in] */
_In_ REFIID riid,
/* [annotation][in] */
_In_ LCID lcid,
/* [annotation][in] */
_In_ WORD wFlags,
/* [annotation][out][in] */
_In_ DISPPARAMS* pDispParams,
/* [annotation][out] */
_Out_opt_ VARIANT* pVarResult,
/* [annotation][out] */
_Out_opt_ EXCEPINFO* pExcepInfo,
/* [annotation][out] */
_Out_opt_ UINT* puArgErr)
{
HRESULT hr;
VARIANT vr;
UINT uArgErr;
WLog_INFO(TAG, "%s (%ld)", GetRDPSessionEventString(dispIdMember), dispIdMember);
switch (dispIdMember)
@ -275,39 +282,35 @@ static HRESULT STDMETHODCALLTYPE Shadow_IRDPSessionEvents_Invoke(
int level;
IDispatch* pDispatch;
IRDPSRAPIAttendee* pAttendee;
vr.vt = VT_DISPATCH;
vr.pdispVal = NULL;
hr = DispGetParam(pDispParams, 0, VT_DISPATCH, &vr, &uArgErr);
if (FAILED(hr))
{
WLog_ERR(TAG, "%s DispGetParam(0, VT_DISPATCH) failure: 0x%08lX",
GetRDPSessionEventString(dispIdMember), hr);
GetRDPSessionEventString(dispIdMember), hr);
return hr;
}
pDispatch = vr.pdispVal;
pDispatch = vr.pdispVal;
hr = pDispatch->lpVtbl->QueryInterface(pDispatch, &IID_IRDPSRAPIAttendee, (void**) &pAttendee);
if (FAILED(hr))
{
WLog_INFO(TAG, "%s IDispatch::QueryInterface(IRDPSRAPIAttendee) failure: 0x%08lX",
GetRDPSessionEventString(dispIdMember), hr);
GetRDPSessionEventString(dispIdMember), hr);
return hr;
}
level = CTRL_LEVEL_VIEW;
//level = CTRL_LEVEL_INTERACTIVE;
hr = pAttendee->lpVtbl->put_ControlLevel(pAttendee, level);
if (FAILED(hr))
{
WLog_INFO(TAG, "%s IRDPSRAPIAttendee::put_ControlLevel() failure: 0x%08lX",
GetRDPSessionEventString(dispIdMember), hr);
GetRDPSessionEventString(dispIdMember), hr);
return hr;
}
@ -341,41 +344,36 @@ static HRESULT STDMETHODCALLTYPE Shadow_IRDPSessionEvents_Invoke(
int level;
IDispatch* pDispatch;
IRDPSRAPIAttendee* pAttendee;
vr.vt = VT_INT;
vr.pdispVal = NULL;
hr = DispGetParam(pDispParams, 1, VT_INT, &vr, &uArgErr);
if (FAILED(hr))
{
WLog_INFO(TAG, "%s DispGetParam(1, VT_INT) failure: 0x%08lX",
GetRDPSessionEventString(dispIdMember), hr);
GetRDPSessionEventString(dispIdMember), hr);
return hr;
}
level = vr.intVal;
vr.vt = VT_DISPATCH;
vr.pdispVal = NULL;
hr = DispGetParam(pDispParams, 0, VT_DISPATCH, &vr, &uArgErr);
if (FAILED(hr))
{
WLog_ERR(TAG, "%s DispGetParam(0, VT_DISPATCH) failure: 0x%08lX",
GetRDPSessionEventString(dispIdMember), hr);
GetRDPSessionEventString(dispIdMember), hr);
return hr;
}
pDispatch = vr.pdispVal;
pDispatch = vr.pdispVal;
hr = pDispatch->lpVtbl->QueryInterface(pDispatch, &IID_IRDPSRAPIAttendee, (void**) &pAttendee);
if (FAILED(hr))
{
WLog_INFO(TAG, "%s IDispatch::QueryInterface(IRDPSRAPIAttendee) failure: 0x%08lX",
GetRDPSessionEventString(dispIdMember), hr);
GetRDPSessionEventString(dispIdMember), hr);
return hr;
}
@ -384,7 +382,7 @@ static HRESULT STDMETHODCALLTYPE Shadow_IRDPSessionEvents_Invoke(
if (FAILED(hr))
{
WLog_INFO(TAG, "%s IRDPSRAPIAttendee::put_ControlLevel() failure: 0x%08lX",
GetRDPSessionEventString(dispIdMember), hr);
GetRDPSessionEventString(dispIdMember), hr);
return hr;
}
@ -491,9 +489,7 @@ int win_shadow_wds_wnd_init(winShadowSubsystem* subsystem)
HMODULE hModule;
HINSTANCE hInstance;
WNDCLASSEX wndClassEx;
hModule = GetModuleHandle(NULL);
ZeroMemory(&wndClassEx, sizeof(WNDCLASSEX));
wndClassEx.cbSize = sizeof(WNDCLASSEX);
wndClassEx.style = 0;
@ -515,9 +511,8 @@ int win_shadow_wds_wnd_init(winShadowSubsystem* subsystem)
}
hInstance = wndClassEx.hInstance;
subsystem->hWnd = CreateWindowEx(0, wndClassEx.lpszClassName,
0, 0, 0, 0, 0, 0, HWND_MESSAGE, 0, hInstance, NULL);
0, 0, 0, 0, 0, 0, HWND_MESSAGE, 0, hInstance, NULL);
if (!subsystem->hWnd)
{
@ -541,15 +536,12 @@ int win_shadow_wds_init(winShadowSubsystem* subsystem)
BSTR bstrAuthString;
BSTR bstrGroupName;
BSTR bstrPassword;
BSTR bstrConnectionString;
BSTR bstrPropertyName;
VARIANT varPropertyValue;
rdpAssistanceFile* file;
IConnectionPoint* pCP;
IConnectionPointContainer* pCPC;
win_shadow_wds_wnd_init(subsystem);
hr = OleInitialize(NULL);
if (FAILED(hr))
@ -567,7 +559,7 @@ int win_shadow_wds_init(winShadowSubsystem* subsystem)
}
hr = CoCreateInstance(&CLSID_RDPSession, NULL, CLSCTX_ALL,
&IID_IRDPSRAPISharingSession, (void**) &(subsystem->pSharingSession));
&IID_IRDPSRAPISharingSession, (void**) & (subsystem->pSharingSession));
if (FAILED(hr))
{
@ -588,14 +580,14 @@ int win_shadow_wds_init(winShadowSubsystem* subsystem)
if (FAILED(hr))
{
WLog_ERR(TAG, "IConnectionPointContainer::FindConnectionPoint(_IRDPSessionEvents) failure: 0x%08lX", hr);
WLog_ERR(TAG, "IConnectionPointContainer::FindConnectionPoint(_IRDPSessionEvents) failure: 0x%08lX",
hr);
return -1;
}
dwCookie = 0;
subsystem->pSessionEvents = &Shadow_IRDPSessionEvents;
subsystem->pSessionEvents->lpVtbl->AddRef(subsystem->pSessionEvents);
hr = pCP->lpVtbl->Advise(pCP, (IUnknown*) subsystem->pSessionEvents, &dwCookie);
if (FAILED(hr))
@ -613,7 +605,7 @@ int win_shadow_wds_init(winShadowSubsystem* subsystem)
}
hr = subsystem->pSharingSession->lpVtbl->GetDesktopSharedRect(subsystem->pSharingSession,
&left, &top, &right, &bottom);
&left, &top, &right, &bottom);
if (FAILED(hr))
{
@ -623,12 +615,11 @@ int win_shadow_wds_init(winShadowSubsystem* subsystem)
width = right - left;
height = bottom - top;
WLog_INFO(TAG, "GetDesktopSharedRect(): left: %ld top: %ld right: %ld bottom: %ld width: %ld height: %ld",
left, top, right, bottom, width, height);
WLog_INFO(TAG,
"GetDesktopSharedRect(): left: %ld top: %ld right: %ld bottom: %ld width: %ld height: %ld",
left, top, right, bottom, width, height);
hr = subsystem->pSharingSession->lpVtbl->get_VirtualChannelManager(subsystem->pSharingSession,
&(subsystem->pVirtualChannelMgr));
&(subsystem->pVirtualChannelMgr));
if (FAILED(hr))
{
@ -637,7 +628,7 @@ int win_shadow_wds_init(winShadowSubsystem* subsystem)
}
hr = subsystem->pSharingSession->lpVtbl->get_ApplicationFilter(subsystem->pSharingSession,
&(subsystem->pApplicationFilter));
&(subsystem->pApplicationFilter));
if (FAILED(hr))
{
@ -646,7 +637,7 @@ int win_shadow_wds_init(winShadowSubsystem* subsystem)
}
hr = subsystem->pSharingSession->lpVtbl->get_Attendees(subsystem->pSharingSession,
&(subsystem->pAttendeeMgr));
&(subsystem->pAttendeeMgr));
if (FAILED(hr))
{
@ -654,7 +645,8 @@ int win_shadow_wds_init(winShadowSubsystem* subsystem)
return -1;
}
hr = subsystem->pSharingSession->lpVtbl->get_Properties(subsystem->pSharingSession, &(subsystem->pSessionProperties));
hr = subsystem->pSharingSession->lpVtbl->get_Properties(subsystem->pSharingSession,
&(subsystem->pSessionProperties));
if (FAILED(hr))
{
@ -665,10 +657,8 @@ int win_shadow_wds_init(winShadowSubsystem* subsystem)
bstrPropertyName = SysAllocString(L"PortId");
varPropertyValue.vt = VT_I4;
varPropertyValue.intVal = 40000;
hr = subsystem->pSessionProperties->lpVtbl->put_Property(subsystem->pSessionProperties,
bstrPropertyName, varPropertyValue);
bstrPropertyName, varPropertyValue);
SysFreeString(bstrPropertyName);
if (FAILED(hr))
@ -680,10 +670,8 @@ int win_shadow_wds_init(winShadowSubsystem* subsystem)
bstrPropertyName = SysAllocString(L"DrvConAttach");
varPropertyValue.vt = VT_BOOL;
varPropertyValue.boolVal = VARIANT_TRUE;
hr = subsystem->pSessionProperties->lpVtbl->put_Property(subsystem->pSessionProperties,
bstrPropertyName, varPropertyValue);
bstrPropertyName, varPropertyValue);
SysFreeString(bstrPropertyName);
if (FAILED(hr))
@ -694,14 +682,11 @@ int win_shadow_wds_init(winShadowSubsystem* subsystem)
bstrPropertyName = SysAllocString(L"PortProtocol");
varPropertyValue.vt = VT_I4;
//varPropertyValue.intVal = 0; // AF_UNSPEC
varPropertyValue.intVal = 2; // AF_INET
//varPropertyValue.intVal = 23; // AF_INET6
hr = subsystem->pSessionProperties->lpVtbl->put_Property(subsystem->pSessionProperties,
bstrPropertyName, varPropertyValue);
bstrPropertyName, varPropertyValue);
SysFreeString(bstrPropertyName);
if (FAILED(hr))
@ -719,7 +704,7 @@ int win_shadow_wds_init(winShadowSubsystem* subsystem)
}
hr = subsystem->pSharingSession->lpVtbl->get_Invitations(subsystem->pSharingSession,
&(subsystem->pInvitationMgr));
&(subsystem->pInvitationMgr));
if (FAILED(hr))
{
@ -730,10 +715,8 @@ int win_shadow_wds_init(winShadowSubsystem* subsystem)
bstrAuthString = SysAllocString(L"Shadow");
bstrGroupName = SysAllocString(L"ShadowGroup");
bstrPassword = SysAllocString(L"Shadow123!");
hr = subsystem->pInvitationMgr->lpVtbl->CreateInvitation(subsystem->pInvitationMgr, bstrAuthString,
bstrGroupName, bstrPassword, 5, &(subsystem->pInvitation));
bstrGroupName, bstrPassword, 5, &(subsystem->pInvitation));
SysFreeString(bstrAuthString);
SysFreeString(bstrGroupName);
SysFreeString(bstrPassword);
@ -744,14 +727,6 @@ int win_shadow_wds_init(winShadowSubsystem* subsystem)
return -1;
}
hr = subsystem->pInvitation->lpVtbl->get_ConnectionString(subsystem->pInvitation, &bstrConnectionString);
if (FAILED(hr))
{
WLog_ERR(TAG, "IRDPSRAPIInvitation::get_ConnectionString() failure: 0x%08lX", hr);
return -1;
}
file = subsystem->pAssistanceFile = freerdp_assistance_file_new();
if (!file)
@ -760,43 +735,33 @@ int win_shadow_wds_init(winShadowSubsystem* subsystem)
return -1;
}
status = ConvertFromUnicode(CP_UTF8, 0, (WCHAR*) bstrConnectionString,
((UINT32*) bstrConnectionString)[-1], &(file->ConnectionString2), 0, NULL, NULL);
SysFreeString(bstrConnectionString);
if (status < 1)
{
WLog_ERR(TAG, "failed to convert connection string");
return -1;
}
int status1 = -1, status2 = -1;
char* ConnectionString2;
BSTR bstrConnectionString;
hr = subsystem->pInvitation->lpVtbl->get_ConnectionString(subsystem->pInvitation,
&bstrConnectionString);
status = freerdp_assistance_parse_connection_string2(file);
if (status < 0)
return -1;
WLog_INFO(TAG, "ConnectionString: %s", file->ConnectionString2);
#if 0
FILE* fp;
size_t size;
fp = fopen("inv.xml", "w+b");
if (fp)
{
size = strlen(file->ConnectionString2);
if (fwrite(file->ConnectionString2, size, 1, fp) != 1 || fwrite("\r\n", 2, 1, fp) != 1)
if (FAILED(hr))
{
fclose(fp);
WLog_ERR(TAG, "Problem writing to inv.xml");
WLog_ERR(TAG, "IRDPSRAPIInvitation::get_ConnectionString() failure: 0x%08lX", hr);
return -1;
}
fclose(fp);
}
#endif
status1 = ConvertFromUnicode(CP_UTF8, 0, (WCHAR*) bstrConnectionString,
((UINT32*) bstrConnectionString)[-1], &(ConnectionString2), 0, NULL, NULL);
SysFreeString(bstrConnectionString);
status2 = freerdp_assistance_set_connection_string2(file, ConnectionString2, "Shadow123!");
free(ConnectionString2);
if ((status1 < 1) || (status < 0))
{
WLog_ERR(TAG, "failed to convert connection string");
return -1;
}
}
freerdp_assistance_print_file(file, WLog_Get(TAG), WLOG_INFO);
status = win_shadow_rdp_init(subsystem);
if (status < 0)
@ -806,24 +771,12 @@ int win_shadow_wds_init(winShadowSubsystem* subsystem)
}
settings = subsystem->shw->settings;
freerdp_set_param_bool(settings, FreeRDP_RemoteAssistanceMode, TRUE);
freerdp_set_param_string(settings, FreeRDP_RemoteAssistanceSessionId, file->RASessionId);
freerdp_set_param_string(settings, FreeRDP_RemoteAssistanceRCTicket, file->ConnectionString2);
status = freerdp_assistance_populate_settings_from_assistance_file(file, settings);
freerdp_set_param_string(settings, FreeRDP_Domain, "RDP");
freerdp_set_param_string(settings, FreeRDP_Username, "Shadow");
freerdp_set_param_string(settings, FreeRDP_RemoteAssistancePassword, "Shadow123!");
freerdp_set_param_bool(settings, FreeRDP_AutoLogonEnabled, TRUE);
freerdp_set_param_string(settings, FreeRDP_ServerHostname, file->MachineAddress);
freerdp_set_param_uint32(settings, FreeRDP_ServerPort, file->MachinePort);
freerdp_set_param_uint32(settings, FreeRDP_DesktopWidth, width);
freerdp_set_param_uint32(settings, FreeRDP_DesktopHeight, height);
status = win_shadow_rdp_start(subsystem);
if (status < 0)