mirror of
https://github.com/morgan9e/FreeRDP
synced 2026-04-15 00:44:19 +09:00
Fixed missing LoadChannels calls and settings on redirect
This commit is contained in:
@@ -303,7 +303,7 @@ UINT freerdp_channels_attach(freerdp* instance)
|
||||
WINPR_ASSERT(instance->context->settings);
|
||||
|
||||
channels = instance->context->channels;
|
||||
hostname = instance->context->settings->ServerHostname;
|
||||
hostname = freerdp_settings_get_string(instance->context->settings, FreeRDP_ServerHostname);
|
||||
hostnameLength = strlen(hostname);
|
||||
|
||||
for (index = 0; index < channels->clientDataCount; index++)
|
||||
@@ -366,7 +366,7 @@ UINT freerdp_channels_detach(freerdp* instance)
|
||||
WINPR_ASSERT(channels);
|
||||
|
||||
WINPR_ASSERT(context->settings);
|
||||
hostname = context->settings->ServerHostname;
|
||||
hostname = freerdp_settings_get_string(context->settings, FreeRDP_ServerHostname);
|
||||
hostnameLength = strlen(hostname);
|
||||
|
||||
for (index = 0; index < channels->clientDataCount; index++)
|
||||
@@ -429,7 +429,7 @@ UINT freerdp_channels_post_connect(rdpChannels* channels, freerdp* instance)
|
||||
WINPR_ASSERT(instance->context->settings);
|
||||
|
||||
channels->connected = TRUE;
|
||||
hostname = instance->context->settings->ServerHostname;
|
||||
hostname = freerdp_settings_get_string(instance->context->settings, FreeRDP_ServerHostname);
|
||||
hostnameLength = strlen(hostname);
|
||||
|
||||
for (index = 0; index < channels->clientDataCount; index++)
|
||||
@@ -575,7 +575,7 @@ const char* freerdp_channels_get_name_by_id(freerdp* instance, UINT16 channelId)
|
||||
if (!mcsChannel)
|
||||
return NULL;
|
||||
|
||||
return (const char*)mcsChannel->Name;
|
||||
return mcsChannel->Name;
|
||||
}
|
||||
|
||||
BOOL freerdp_channels_process_message_free(wMessage* message, DWORD type)
|
||||
@@ -913,6 +913,8 @@ static UINT VCAPITYPE FreeRDP_VirtualChannelInitEx(
|
||||
{
|
||||
CHANNEL_DEF* channel = freerdp_settings_get_pointer_array_writable(
|
||||
settings, FreeRDP_ChannelDefArray, settings->ChannelCount);
|
||||
if (!channel)
|
||||
continue;
|
||||
strncpy(channel->name, pChannelDef->name, CHANNEL_NAME_LEN);
|
||||
channel->options = pChannelDef->options;
|
||||
settings->ChannelCount++;
|
||||
@@ -990,6 +992,8 @@ static UINT VCAPITYPE FreeRDP_VirtualChannelInit(LPVOID* ppInitHandle, PCHANNEL_
|
||||
|
||||
for (index = 0; index < channelCount; index++)
|
||||
{
|
||||
UINT32 ChannelCount = freerdp_settings_get_uint32(settings, FreeRDP_ChannelCount);
|
||||
|
||||
pChannelDef = &pChannel[index];
|
||||
pChannelOpenData = &channels->openDataList[channels->openDataCount];
|
||||
pChannelOpenData->OpenHandle = InterlockedIncrement(&g_OpenHandleSeq);
|
||||
@@ -1001,13 +1005,14 @@ static UINT VCAPITYPE FreeRDP_VirtualChannelInit(LPVOID* ppInitHandle, PCHANNEL_
|
||||
strncpy(pChannelOpenData->name, pChannelDef->name, CHANNEL_NAME_LEN);
|
||||
pChannelOpenData->options = pChannelDef->options;
|
||||
|
||||
if (settings->ChannelCount < CHANNEL_MAX_COUNT)
|
||||
if (ChannelCount < CHANNEL_MAX_COUNT)
|
||||
{
|
||||
channel = freerdp_settings_get_pointer_array_writable(settings, FreeRDP_ChannelDefArray,
|
||||
settings->ChannelCount);
|
||||
ChannelCount++);
|
||||
strncpy(channel->name, pChannelDef->name, CHANNEL_NAME_LEN);
|
||||
channel->options = pChannelDef->options;
|
||||
settings->ChannelCount++;
|
||||
if (!freerdp_settings_set_uint32(settings, FreeRDP_ChannelCount, ChannelCount))
|
||||
return ERROR_INTERNAL_ERROR;
|
||||
}
|
||||
|
||||
channels->openDataCount++;
|
||||
@@ -1273,6 +1278,11 @@ int freerdp_channels_client_load(rdpChannels* channels, rdpSettings* settings,
|
||||
CHANNEL_ENTRY_POINTS_FREERDP EntryPoints = { 0 };
|
||||
CHANNEL_CLIENT_DATA* pChannelClientData;
|
||||
|
||||
WINPR_ASSERT(channels);
|
||||
WINPR_ASSERT(channels->instance);
|
||||
WINPR_ASSERT(channels->instance->context);
|
||||
WINPR_ASSERT(entry);
|
||||
|
||||
if (channels->clientDataCount + 1 > CHANNEL_MAX_COUNT)
|
||||
{
|
||||
WLog_ERR(TAG, "error: too many channels");
|
||||
@@ -1296,7 +1306,7 @@ int freerdp_channels_client_load(rdpChannels* channels, rdpSettings* settings,
|
||||
EntryPoints.pVirtualChannelWrite = FreeRDP_VirtualChannelWrite;
|
||||
EntryPoints.MagicNumber = FREERDP_CHANNEL_MAGIC_NUMBER;
|
||||
EntryPoints.pExtendedData = data;
|
||||
EntryPoints.context = ((freerdp*)settings->instance)->context;
|
||||
EntryPoints.context = channels->instance->context;
|
||||
/* enable VirtualChannelInit */
|
||||
channels->can_call_init = TRUE;
|
||||
EnterCriticalSection(&channels->channelsLock);
|
||||
@@ -1323,6 +1333,11 @@ int freerdp_channels_client_load_ex(rdpChannels* channels, rdpSettings* settings
|
||||
CHANNEL_INIT_DATA* pChannelInitData = NULL;
|
||||
CHANNEL_CLIENT_DATA* pChannelClientData = NULL;
|
||||
|
||||
WINPR_ASSERT(channels);
|
||||
WINPR_ASSERT(channels->instance);
|
||||
WINPR_ASSERT(channels->instance->context);
|
||||
WINPR_ASSERT(entryEx);
|
||||
|
||||
if (channels->clientDataCount + 1 > CHANNEL_MAX_COUNT)
|
||||
{
|
||||
WLog_ERR(TAG, "error: too many channels");
|
||||
@@ -1348,7 +1363,7 @@ int freerdp_channels_client_load_ex(rdpChannels* channels, rdpSettings* settings
|
||||
EntryPointsEx.pVirtualChannelWriteEx = FreeRDP_VirtualChannelWriteEx;
|
||||
EntryPointsEx.MagicNumber = FREERDP_CHANNEL_MAGIC_NUMBER;
|
||||
EntryPointsEx.pExtendedData = data;
|
||||
EntryPointsEx.context = ((freerdp*)settings->instance)->context;
|
||||
EntryPointsEx.context = channels->instance->context;
|
||||
/* enable VirtualChannelInit */
|
||||
channels->can_call_init = TRUE;
|
||||
EnterCriticalSection(&channels->channelsLock);
|
||||
|
||||
@@ -549,6 +549,12 @@ BOOL rdp_client_redirect(rdpRdp* rdp)
|
||||
if (!rdp_client_disconnect_and_clear(rdp))
|
||||
return FALSE;
|
||||
|
||||
freerdp_channels_disconnect(rdp->context->channels, rdp->context->instance);
|
||||
freerdp_channels_close(rdp->context->channels, rdp->context->instance);
|
||||
freerdp_channels_free(rdp->context->channels);
|
||||
rdp->context->channels = freerdp_channels_new(rdp->context->instance);
|
||||
WINPR_ASSERT(rdp->context->channels);
|
||||
|
||||
if (rdp_redirection_apply_settings(rdp) != 0)
|
||||
return FALSE;
|
||||
|
||||
@@ -611,6 +617,14 @@ BOOL rdp_client_redirect(rdpRdp* rdp)
|
||||
if (!IFCALLRESULT(TRUE, rdp->context->instance->Redirect, rdp->context->instance))
|
||||
return FALSE;
|
||||
|
||||
BOOL ok = IFCALLRESULT(TRUE, rdp->context->instance->LoadChannels, rdp->context->instance);
|
||||
if (!ok)
|
||||
return FALSE;
|
||||
|
||||
if (CHANNEL_RC_OK !=
|
||||
freerdp_channels_pre_connect(rdp->context->channels, rdp->context->instance))
|
||||
return FALSE;
|
||||
|
||||
status = rdp_client_connect(rdp);
|
||||
|
||||
if (status)
|
||||
|
||||
@@ -103,7 +103,18 @@ BOOL freerdp_connect(freerdp* instance)
|
||||
instance->ConnectionCallbackState = CLIENT_STATE_PRECONNECT_PASSED;
|
||||
|
||||
if (status)
|
||||
{
|
||||
freerdp_settings_free(rdp->originalSettings);
|
||||
rdp->originalSettings = freerdp_settings_clone(settings);
|
||||
if (!rdp->originalSettings)
|
||||
return 0;
|
||||
|
||||
BOOL ok = IFCALLRESULT(TRUE, instance->LoadChannels, instance);
|
||||
if (!ok)
|
||||
return 0;
|
||||
|
||||
status2 = freerdp_channels_pre_connect(instance->context->channels, instance);
|
||||
}
|
||||
|
||||
if (settings->KeyboardLayout == KBD_JAPANESE ||
|
||||
settings->KeyboardLayout == KBD_JAPANESE_INPUT_SYSTEM_MS_IME2002)
|
||||
|
||||
@@ -1890,6 +1890,13 @@ rdpRdp* rdp_new(rdpContext* context)
|
||||
}
|
||||
else
|
||||
rdp->settings = context->settings;
|
||||
|
||||
/* Keep a backup copy of settings for later comparisons */
|
||||
freerdp_settings_free(rdp->originalSettings);
|
||||
rdp->originalSettings = freerdp_settings_clone(rdp->settings);
|
||||
if (!rdp->originalSettings)
|
||||
return FALSE;
|
||||
|
||||
rdp->settings->instance = context->instance;
|
||||
|
||||
context->settings = rdp->settings;
|
||||
@@ -2092,6 +2099,7 @@ void rdp_free(rdpRdp* rdp)
|
||||
rdp_reset_free(rdp);
|
||||
|
||||
freerdp_settings_free(rdp->settings);
|
||||
freerdp_settings_free(rdp->originalSettings);
|
||||
|
||||
input_free(rdp->input);
|
||||
update_free(rdp->update);
|
||||
|
||||
@@ -163,6 +163,7 @@ struct rdp_rdp
|
||||
rdpLicense* license;
|
||||
rdpRedirection* redirection;
|
||||
rdpSettings* settings;
|
||||
rdpSettings* originalSettings;
|
||||
rdpTransport* transport;
|
||||
rdpAutoDetect* autodetect;
|
||||
rdpHeartbeat* heartbeat;
|
||||
|
||||
Reference in New Issue
Block a user