static void drdynvc_process_connect(rdpSvcPlugin* plugin) { drdynvcPlugin* drdynvc = (drdynvcPlugin*)plugin; DEBUG_DVC("connecting"); drdynvc->channel_mgr = dvcman_new(drdynvc); dvcman_load_plugin(drdynvc->channel_mgr, svc_plugin_get_data(plugin)); dvcman_init(drdynvc->channel_mgr); }
int VirtualChannelEntry(PCHANNEL_ENTRY_POINTS pEntryPoints) { drdynvcPlugin * plugin; RD_PLUGIN_DATA * data; LLOGLN(10, ("VirtualChannelEntry:")); plugin = (drdynvcPlugin *) malloc(sizeof(drdynvcPlugin)); memset(plugin, 0, sizeof(drdynvcPlugin)); chan_plugin_init((rdpChanPlugin *) plugin); plugin->data_in_size = 0; plugin->data_in = 0; plugin->ep = *pEntryPoints; memset(&(plugin->channel_def), 0, sizeof(plugin->channel_def)); plugin->channel_def.options = CHANNEL_OPTION_INITIALIZED | CHANNEL_OPTION_ENCRYPT_RDP | CHANNEL_OPTION_COMPRESS_RDP; strcpy(plugin->channel_def.name, "drdynvc"); plugin->in_mutex = (pthread_mutex_t *) malloc(sizeof(pthread_mutex_t)); pthread_mutex_init(plugin->in_mutex, 0); plugin->in_list_head = 0; plugin->in_list_tail = 0; plugin->term_event = wait_obj_new("freerdprdrynvcterm"); plugin->data_in_event = wait_obj_new("freerdpdrdynvcdatain"); plugin->thread_status = 0; plugin->ep.pVirtualChannelInit(&plugin->chan_plugin.init_handle, &plugin->channel_def, 1, VIRTUAL_CHANNEL_VERSION_WIN2000, InitEvent); plugin->channel_mgr = dvcman_new(plugin); if (pEntryPoints->cbSize >= sizeof(CHANNEL_ENTRY_POINTS_EX)) { data = (RD_PLUGIN_DATA *) (((PCHANNEL_ENTRY_POINTS_EX)pEntryPoints)->pExtendedData); while (data && data->size > 0) { dvcman_load_plugin(plugin->channel_mgr, (char*)data->data[0]); data = (RD_PLUGIN_DATA *) (((void *) data) + data->size); } } return 1; }
static void drdynvc_process_connect(rdpSvcPlugin* plugin) { int index; ADDIN_ARGV* args; rdpSettings* settings; drdynvcPlugin* drdynvc = (drdynvcPlugin*)plugin; DEBUG_DVC("connecting"); drdynvc->channel_mgr = dvcman_new(drdynvc); drdynvc->channel_error = 0; settings = (rdpSettings*) ((rdpSvcPlugin*) plugin)->channel_entry_points.pExtendedData; for (index = 0; index < settings->DynamicChannelCount; index++) { args = settings->DynamicChannelArray[index]; dvcman_load_addin(drdynvc->channel_mgr, args); } dvcman_init(drdynvc->channel_mgr); }
/** * Function description * * @return 0 on success, otherwise a Win32 error code */ static UINT drdynvc_virtual_channel_event_connected(drdynvcPlugin* drdynvc, LPVOID pData, UINT32 dataLength) { UINT error; UINT32 status; UINT32 index; ADDIN_ARGV* args; rdpSettings* settings; if (!drdynvc) return CHANNEL_RC_BAD_CHANNEL_HANDLE; status = drdynvc->channelEntryPoints.pVirtualChannelOpenEx(drdynvc->InitHandle, &drdynvc->OpenHandle, drdynvc->channelDef.name, drdynvc_virtual_channel_open_event_ex); if (status != CHANNEL_RC_OK) { WLog_Print(drdynvc->log, WLOG_ERROR, "pVirtualChannelOpen failed with %s [%08"PRIX32"]", WTSErrorToString(status), status); return status; } drdynvc->queue = MessageQueue_New(NULL); if (!drdynvc->queue) { error = CHANNEL_RC_NO_MEMORY; WLog_Print(drdynvc->log, WLOG_ERROR, "MessageQueue_New failed!"); goto error; } drdynvc->queue->object.fnObjectFree = drdynvc_queue_object_free; drdynvc->channel_mgr = dvcman_new(drdynvc); if (!drdynvc->channel_mgr) { error = CHANNEL_RC_NO_MEMORY; WLog_Print(drdynvc->log, WLOG_ERROR, "dvcman_new failed!"); goto error; } settings = (rdpSettings*) drdynvc->channelEntryPoints.pExtendedData; for (index = 0; index < settings->DynamicChannelCount; index++) { args = settings->DynamicChannelArray[index]; error = dvcman_load_addin(drdynvc, drdynvc->channel_mgr, args, settings); if (CHANNEL_RC_OK != error) goto error; } if ((error = dvcman_init(drdynvc, drdynvc->channel_mgr))) { WLog_Print(drdynvc->log, WLOG_ERROR, "dvcman_init failed with error %"PRIu32"!", error); goto error; } drdynvc->state = DRDYNVC_STATE_CAPABILITIES; if (!(drdynvc->thread = CreateThread(NULL, 0, drdynvc_virtual_channel_client_thread, (void*) drdynvc, 0, NULL))) { error = ERROR_INTERNAL_ERROR; WLog_Print(drdynvc->log, WLOG_ERROR, "CreateThread failed!"); goto error; } error: return error; }
/** * Function description * * @return 0 on success, otherwise a Win32 error code */ static UINT drdynvc_virtual_channel_event_connected(drdynvcPlugin* drdynvc, LPVOID pData, UINT32 dataLength) { UINT32 status; UINT32 index; ADDIN_ARGV* args; rdpSettings* settings; UINT error; status = drdynvc->channelEntryPoints.pVirtualChannelOpen(drdynvc->InitHandle, &drdynvc->OpenHandle, drdynvc->channelDef.name, drdynvc_virtual_channel_open_event); if (status != CHANNEL_RC_OK) { WLog_ERR(TAG, "pVirtualChannelOpen failed with %s [%08X]", WTSErrorToString(status), status); return status; } if ((error = drdynvc_add_open_handle_data(drdynvc->OpenHandle, drdynvc))) { WLog_ERR(TAG, "drdynvc_add_open_handle_data failed with error %lu!", error); return error; } drdynvc->queue = MessageQueue_New(NULL); if (!drdynvc->queue) { error = CHANNEL_RC_NO_MEMORY; WLog_ERR(TAG, "MessageQueue_New failed!"); goto error; } drdynvc->channel_mgr = dvcman_new(drdynvc); if (!drdynvc->channel_mgr) { error = CHANNEL_RC_NO_MEMORY; WLog_ERR(TAG, "dvcman_new failed!"); goto error; } settings = (rdpSettings*) drdynvc->channelEntryPoints.pExtendedData; for (index = 0; index < settings->DynamicChannelCount; index++) { args = settings->DynamicChannelArray[index]; error = dvcman_load_addin(drdynvc->channel_mgr, args, settings); if (CHANNEL_RC_OK != error) goto error; } if ((error = dvcman_init(drdynvc->channel_mgr))) { WLog_ERR(TAG, "dvcman_init failed with error %lu!", error); goto error; } drdynvc->state = DRDYNVC_STATE_CAPABILITIES; if (!(drdynvc->thread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) drdynvc_virtual_channel_client_thread, (void*) drdynvc, 0, NULL))) { error = ERROR_INTERNAL_ERROR; WLog_ERR(TAG, "CreateThread failed!"); goto error; } return CHANNEL_RC_OK; error: drdynvc_remove_open_handle_data(drdynvc->OpenHandle); return error; }