rdpGlyphCache* glyph_cache_new(rdpSettings* settings) { rdpGlyphCache* glyphCache; glyphCache = (rdpGlyphCache*) calloc(1, sizeof(rdpGlyphCache)); if (glyphCache) { int i; WLog_Init(); glyphCache->log = WLog_Get("com.freerdp.cache.glyph"); glyphCache->settings = settings; glyphCache->context = ((freerdp*) settings->instance)->update->context; for (i = 0; i < 10; i++) { glyphCache->glyphCache[i].number = settings->GlyphCache[i].cacheEntries; glyphCache->glyphCache[i].maxCellSize = settings->GlyphCache[i].cacheMaximumCellSize; glyphCache->glyphCache[i].entries = (rdpGlyph**) calloc(glyphCache->glyphCache[i].number, sizeof(rdpGlyph*)); } glyphCache->fragCache.entries = calloc(256, sizeof(FRAGMENT_CACHE_ENTRY)); } return glyphCache; }
int TestWLogCallback(int argc, char* argv[]) { wLog* root; wLog* logA; wLog* logB; wLogLayout* layout; wLogAppender* appender; wLogCallbacks callbacks; function = __FUNCTION__; WLog_Init(); root = WLog_GetRoot(); WLog_SetLogAppenderType(root, WLOG_APPENDER_CALLBACK); appender = WLog_GetLogAppender(root); callbacks.data = CallbackAppenderData; callbacks.image = CallbackAppenderImage; callbacks.message = CallbackAppenderMessage; callbacks.package = CallbackAppenderPackage; if (!WLog_ConfigureAppender(appender, "callbacks", (void *)&callbacks)) return -1; layout = WLog_GetLogLayout(root); WLog_Layout_SetPrefixFormat(root, layout, "%mn"); WLog_OpenAppender(root); logA = WLog_Get(channels[0]); logB = WLog_Get(channels[1]); WLog_SetLogLevel(logA, WLOG_TRACE); WLog_SetLogLevel(logB, WLOG_TRACE); WLog_Print(logA, messages[0].level, messages[0].msg); WLog_Print(logB, messages[1].level, messages[1].msg); WLog_Print(logA, messages[2].level, messages[2].msg, 2, "test"); WLog_Print(logB, messages[3].level, messages[3].msg, 2, "time"); WLog_Print(logA, messages[4].level, messages[4].msg); WLog_Print(logB, messages[5].level, messages[5].msg); WLog_Print(logA, messages[6].level, messages[6].msg); WLog_Print(logB, messages[7].level, messages[7].msg); WLog_CloseAppender(root); WLog_Uninit(); return success ? 0 : -1; }
rdpUpdate* update_new(rdpRdp* rdp) { const wObject cb = { NULL, NULL, NULL, update_free_queued_message, NULL }; rdpUpdate* update; update = (rdpUpdate*) malloc(sizeof(rdpUpdate)); if (update) { OFFSCREEN_DELETE_LIST* deleteList; ZeroMemory(update, sizeof(rdpUpdate)); WLog_Init(); update->log = WLog_Get("com.freerdp.core.update"); update->bitmap_update.count = 64; update->bitmap_update.rectangles = (BITMAP_DATA*) malloc(sizeof(BITMAP_DATA) * update->bitmap_update.count); ZeroMemory(update->bitmap_update.rectangles, sizeof(BITMAP_DATA) * update->bitmap_update.count); update->pointer = (rdpPointerUpdate*) malloc(sizeof(rdpPointerUpdate)); ZeroMemory(update->pointer, sizeof(rdpPointerUpdate)); update->primary = (rdpPrimaryUpdate*) malloc(sizeof(rdpPrimaryUpdate)); ZeroMemory(update->primary, sizeof(rdpPrimaryUpdate)); update->secondary = (rdpSecondaryUpdate*) malloc(sizeof(rdpSecondaryUpdate)); ZeroMemory(update->secondary, sizeof(rdpSecondaryUpdate)); update->altsec = (rdpAltSecUpdate*) malloc(sizeof(rdpAltSecUpdate)); ZeroMemory(update->altsec, sizeof(rdpAltSecUpdate)); update->window = (rdpWindowUpdate*) malloc(sizeof(rdpWindowUpdate)); ZeroMemory(update->window, sizeof(rdpWindowUpdate)); deleteList = &(update->altsec->create_offscreen_bitmap.deleteList); deleteList->sIndices = 64; deleteList->indices = malloc(deleteList->sIndices * 2); deleteList->cIndices = 0; update->SuppressOutput = update_send_suppress_output; update->initialState = TRUE; update->queue = MessageQueue_New(&cb); } return update; }
RDS_MODULE_COMMON* rdp_rds_module_new(void) { rdsModuleRdp* rdp; WLog_Init(); rdp = (rdsModuleRdp*) malloc(sizeof(rdsModuleRdp)); rdp->log = WLog_Get("com.freerds.module.rdp"); WLog_OpenAppender(rdp->log); WLog_Print(rdp->log, WLOG_DEBUG, "RdsModuleNew"); return (RDS_MODULE_COMMON*) rdp; }
rdpRedirection* redirection_new() { rdpRedirection* redirection; redirection = (rdpRedirection*) calloc(1, sizeof(rdpRedirection)); if (redirection) { WLog_Init(); redirection->log = WLog_Get("com.freerdp.core.redirection"); #ifdef WITH_DEBUG_REDIR WLog_SetLogLevel(redirection->log, WLOG_TRACE); #endif } return redirection; }
int cef_rds_module_new(rdsModule* module) { rdsModuleCef* cef; WLog_Init(); cef = (rdsModuleCef*) module; cef->log = WLog_Get("com.freerds.module.cef.connector"); WLog_OpenAppender(cef->log); WLog_SetLogLevel(cef->log, WLOG_DEBUG); WLog_Print(cef->log, WLOG_DEBUG, "RdsModuleNew"); return 0; }
rdpTransport* transport_new(rdpSettings* settings) { rdpTransport* transport; transport = (rdpTransport*) malloc(sizeof(rdpTransport)); if (transport) { ZeroMemory(transport, sizeof(rdpTransport)); WLog_Init(); transport->log = WLog_Get("com.freerdp.core.transport"); transport->TcpIn = tcp_new(settings); transport->settings = settings; /* a small 0.1ms delay when transport is blocking. */ transport->SleepInterval = 100; transport->ReceivePool = StreamPool_New(TRUE, BUFFER_SIZE); /* receive buffer for non-blocking read. */ transport->ReceiveBuffer = StreamPool_Take(transport->ReceivePool, 0); transport->ReceiveEvent = CreateEvent(NULL, TRUE, FALSE, NULL); transport->connectedEvent = CreateEvent(NULL, TRUE, FALSE, NULL); transport->blocking = TRUE; transport->ReadMutex = CreateMutex(NULL, FALSE, NULL); transport->WriteMutex = CreateMutex(NULL, FALSE, NULL); transport->layer = TRANSPORT_LAYER_TCP; } return transport; }
rdpTransport* transport_new(rdpSettings* settings) { rdpTransport* transport; transport = (rdpTransport *)calloc(1, sizeof(rdpTransport)); if (!transport) return NULL; WLog_Init(); transport->log = WLog_Get("com.freerdp.core.transport"); if (!transport->log) goto out_free; transport->TcpIn = tcp_new(settings); if (!transport->TcpIn) goto out_free; transport->settings = settings; /* a small 0.1ms delay when transport is blocking. */ transport->SleepInterval = 100; transport->ReceivePool = StreamPool_New(TRUE, BUFFER_SIZE); if (!transport->ReceivePool) goto out_free_tcpin; /* receive buffer for non-blocking read. */ transport->ReceiveBuffer = StreamPool_Take(transport->ReceivePool, 0); if (!transport->ReceiveBuffer) goto out_free_receivepool; transport->ReceiveEvent = CreateEvent(NULL, TRUE, FALSE, NULL); if (!transport->ReceiveEvent || transport->ReceiveEvent == INVALID_HANDLE_VALUE) goto out_free_receivebuffer; transport->connectedEvent = CreateEvent(NULL, TRUE, FALSE, NULL); if (!transport->connectedEvent || transport->connectedEvent == INVALID_HANDLE_VALUE) goto out_free_receiveEvent; transport->blocking = TRUE; transport->GatewayEnabled = FALSE; transport->layer = TRANSPORT_LAYER_TCP; if (!InitializeCriticalSectionAndSpinCount(&(transport->ReadLock), 4000)) goto out_free_connectedEvent; if (!InitializeCriticalSectionAndSpinCount(&(transport->WriteLock), 4000)) goto out_free_readlock; return transport; out_free_readlock: DeleteCriticalSection(&(transport->ReadLock)); out_free_connectedEvent: CloseHandle(transport->connectedEvent); out_free_receiveEvent: CloseHandle(transport->ReceiveEvent); out_free_receivebuffer: StreamPool_Return(transport->ReceivePool, transport->ReceiveBuffer); out_free_receivepool: StreamPool_Free(transport->ReceivePool); out_free_tcpin: tcp_free(transport->TcpIn); out_free: free(transport); return NULL; }
BOOL VCAPITYPE VirtualChannelEntry(PCHANNEL_ENTRY_POINTS pEntryPoints) { UINT rc; railPlugin* rail; RailClientContext* context; CHANNEL_ENTRY_POINTS_FREERDP* pEntryPointsEx; rail = (railPlugin*) calloc(1, sizeof(railPlugin)); if (!rail) return FALSE; rail->channelDef.options = CHANNEL_OPTION_INITIALIZED | CHANNEL_OPTION_ENCRYPT_RDP | CHANNEL_OPTION_COMPRESS_RDP | CHANNEL_OPTION_SHOW_PROTOCOL; strcpy(rail->channelDef.name, "rail"); pEntryPointsEx = (CHANNEL_ENTRY_POINTS_FREERDP*) pEntryPoints; if ((pEntryPointsEx->cbSize >= sizeof(CHANNEL_ENTRY_POINTS_FREERDP)) && (pEntryPointsEx->MagicNumber == FREERDP_CHANNEL_MAGIC_NUMBER)) { context = (RailClientContext*) calloc(1, sizeof(RailClientContext)); if (!context) { free(rail); return FALSE; } context->handle = (void*) rail; context->custom = NULL; context->ClientExecute = rail_client_execute; context->ClientActivate = rail_client_activate; context->ClientSystemParam = rail_client_system_param; context->ServerSystemParam = rail_server_system_param; context->ClientSystemCommand = rail_client_system_command; context->ClientHandshake = rail_client_handshake; context->ServerHandshake = rail_server_handshake; context->ClientHandshakeEx = rail_client_handshake_ex; context->ServerHandshakeEx = rail_server_handshake_ex; context->ClientNotifyEvent = rail_client_notify_event; context->ClientWindowMove = rail_client_window_move; context->ServerLocalMoveSize = rail_server_local_move_size; context->ServerMinMaxInfo = rail_server_min_max_info; context->ClientInformation = rail_client_information; context->ClientSystemMenu = rail_client_system_menu; context->ClientLanguageBarInfo = rail_client_language_bar_info; context->ServerLanguageBarInfo = rail_server_language_bar_info; context->ServerExecuteResult = rail_server_execute_result; context->ClientGetAppIdRequest = rail_client_get_appid_request; context->ServerGetAppIdResponse = rail_server_get_appid_response; *(pEntryPointsEx->ppInterface) = (void*) context; rail->context = context; } WLog_Init(); rail->log = WLog_Get("com.freerdp.channels.rail.client"); WLog_Print(rail->log, WLOG_DEBUG, "VirtualChannelEntry"); CopyMemory(&(rail->channelEntryPoints), pEntryPoints, sizeof(CHANNEL_ENTRY_POINTS_FREERDP)); rc = rail->channelEntryPoints.pVirtualChannelInit(&rail->InitHandle, &rail->channelDef, 1, VIRTUAL_CHANNEL_VERSION_WIN2000, rail_virtual_channel_init_event); if (CHANNEL_RC_OK != rc) { WLog_ERR(TAG, "pVirtualChannelInit failed with %s [%08X]", WTSErrorToString(rc), rc); free(rail); return -1; } rail->channelEntryPoints.pInterface = *(rail->channelEntryPoints.ppInterface); rail->channelEntryPoints.ppInterface = &(rail->channelEntryPoints.pInterface); return rail_add_init_handle_data(rail->InitHandle, (void*) rail); }
/** * Function description * * @return 0 on success, otherwise a Win32 error code */ UINT DeviceServiceEntry(PDEVICE_SERVICE_ENTRY_POINTS pEntryPoints) { char* name; char* path; char* driver; RDPDR_SERIAL* device; #if defined __linux__ && !defined ANDROID int i, len; SERIAL_DEVICE* serial; #endif /* __linux__ */ UINT error = CHANNEL_RC_OK; device = (RDPDR_SERIAL*) pEntryPoints->device; name = device->Name; path = device->Path; driver = device->Driver; if (!name || (name[0] == '*')) { /* TODO: implement auto detection of serial ports */ return CHANNEL_RC_OK; } if ((name && name[0]) && (path && path[0])) { wLog* log; WLog_Init(); log = WLog_Get("com.freerdp.channel.serial.client"); WLog_Print(log, WLOG_DEBUG, "initializing"); #ifndef __linux__ /* to be removed */ WLog_Print(log, WLOG_WARN, "Serial ports redirection not supported on this platform."); return CHANNEL_RC_INITIALIZATION_ERROR; #else /* __linux __ */ WLog_Print(log, WLOG_DEBUG, "Defining %s as %s", name, path); if (!DefineCommDevice(name /* eg: COM1 */, path /* eg: /dev/ttyS0 */)) { WLog_ERR(TAG, "DefineCommDevice failed!"); return ERROR_INTERNAL_ERROR; } serial = (SERIAL_DEVICE*) calloc(1, sizeof(SERIAL_DEVICE)); if (!serial) { WLog_ERR(TAG, "calloc failed!"); return CHANNEL_RC_NO_MEMORY; } serial->log = log; serial->device.type = RDPDR_DTYP_SERIAL; serial->device.name = name; serial->device.IRPRequest = serial_irp_request; serial->device.Free = serial_free; serial->rdpcontext = pEntryPoints->rdpcontext; len = strlen(name); serial->device.data = Stream_New(NULL, len + 1); if (!serial->device.data) { WLog_ERR(TAG, "calloc failed!"); error = CHANNEL_RC_NO_MEMORY; goto error_out; } for (i = 0; i <= len; i++) Stream_Write_UINT8(serial->device.data, name[i] < 0 ? '_' : name[i]); if (driver != NULL) { if (_stricmp(driver, "Serial") == 0) serial->ServerSerialDriverId = SerialDriverSerialSys; else if (_stricmp(driver, "SerCx") == 0) serial->ServerSerialDriverId = SerialDriverSerCxSys; else if (_stricmp(driver, "SerCx2") == 0) serial->ServerSerialDriverId = SerialDriverSerCx2Sys; else { assert(FALSE); WLog_Print(serial->log, WLOG_DEBUG, "Unknown server's serial driver: %s. SerCx2 will be used", driver); serial->ServerSerialDriverId = SerialDriverSerialSys; } } else { /* default driver */ serial->ServerSerialDriverId = SerialDriverSerialSys; } if (device->Permissive != NULL) { if (_stricmp(device->Permissive, "permissive") == 0) { serial->permissive = TRUE; } else { WLog_Print(serial->log, WLOG_DEBUG, "Unknown flag: %s", device->Permissive); assert(FALSE); } } WLog_Print(serial->log, WLOG_DEBUG, "Server's serial driver: %s (id: %d)", driver, serial->ServerSerialDriverId); /* TODO: implement auto detection of the server's serial driver */ serial->MainIrpQueue = MessageQueue_New(NULL); if (!serial->MainIrpQueue) { WLog_ERR(TAG, "MessageQueue_New failed!"); error = CHANNEL_RC_NO_MEMORY; goto error_out; } /* IrpThreads content only modified by create_irp_thread() */ serial->IrpThreads = ListDictionary_New(FALSE); if (!serial->IrpThreads) { WLog_ERR(TAG, "ListDictionary_New failed!"); error = CHANNEL_RC_NO_MEMORY; goto error_out; } serial->IrpThreadToBeTerminatedCount = 0; InitializeCriticalSection(&serial->TerminatingIrpThreadsLock); if ((error = pEntryPoints->RegisterDevice(pEntryPoints->devman, (DEVICE*) serial))) { WLog_ERR(TAG, "EntryPoints->RegisterDevice failed with error %"PRIu32"!", error); goto error_out; } if (!(serial->MainThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) serial_thread_func, (void*) serial, 0, NULL))) { WLog_ERR(TAG, "CreateThread failed!"); error = ERROR_INTERNAL_ERROR; goto error_out; } #endif /* __linux __ */ } return error; error_out: #ifdef __linux__ /* to be removed */ ListDictionary_Free(serial->IrpThreads); MessageQueue_Free(serial->MainIrpQueue); Stream_Free(serial->device.data, TRUE); free(serial); #endif /* __linux __ */ return error; }
RFX_CONTEXT* rfx_context_new(BOOL encoder) { HKEY hKey; LONG status; DWORD dwType; DWORD dwSize; DWORD dwValue; SYSTEM_INFO sysinfo; RFX_CONTEXT* context; wObject *pool; RFX_CONTEXT_PRIV *priv; context = (RFX_CONTEXT*)calloc(1, sizeof(RFX_CONTEXT)); if (!context) return NULL; context->encoder = encoder; context->priv = priv = (RFX_CONTEXT_PRIV *)calloc(1, sizeof(RFX_CONTEXT_PRIV) ); if (!priv) goto error_priv; WLog_Init(); priv->log = WLog_Get("com.freerdp.codec.rfx"); WLog_OpenAppender(priv->log); #ifdef WITH_DEBUG_RFX WLog_SetLogLevel(priv->log, WLOG_DEBUG); #endif priv->TilePool = ObjectPool_New(TRUE); if (!priv->TilePool) goto error_tilePool; pool = ObjectPool_Object(priv->TilePool); pool->fnObjectInit = (OBJECT_INIT_FN) rfx_tile_init; if (context->encoder) { pool->fnObjectNew = (OBJECT_NEW_FN) rfx_encoder_tile_new; pool->fnObjectFree = (OBJECT_FREE_FN) rfx_encoder_tile_free; } else { pool->fnObjectNew = (OBJECT_NEW_FN) rfx_decoder_tile_new; pool->fnObjectFree = (OBJECT_FREE_FN) rfx_decoder_tile_free; } /* * align buffers to 16 byte boundary (needed for SSE/NEON instructions) * * y_r_buffer, cb_g_buffer, cr_b_buffer: 64 * 64 * sizeof(INT16) = 8192 (0x2000) * dwt_buffer: 32 * 32 * 2 * 2 * sizeof(INT16) = 8192, maximum sub-band width is 32 * * Additionally we add 32 bytes (16 in front and 16 at the back of the buffer) * in order to allow optimized functions (SEE, NEON) to read from positions * that are actually in front/beyond the buffer. Offset calculations are * performed at the BufferPool_Take function calls in rfx_encode/decode.c. * * We then multiply by 3 to use a single, partioned buffer for all 3 channels. */ priv->BufferPool = BufferPool_New(TRUE, (8192 + 32) * 3, 16); if (!priv->BufferPool) goto error_BufferPool; #ifdef _WIN32 { BOOL isVistaOrLater; OSVERSIONINFOA verinfo; ZeroMemory(&verinfo, sizeof(OSVERSIONINFOA)); verinfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFOA); GetVersionExA(&verinfo); isVistaOrLater = ((verinfo.dwMajorVersion >= 6) && (verinfo.dwMinorVersion >= 0)) ? TRUE : FALSE; priv->UseThreads = isVistaOrLater; } #else priv->UseThreads = TRUE; #endif GetNativeSystemInfo(&sysinfo); priv->MinThreadCount = sysinfo.dwNumberOfProcessors; priv->MaxThreadCount = 0; status = RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("Software\\FreeRDP\\RemoteFX"), 0, KEY_READ | KEY_WOW64_64KEY, &hKey); if (status == ERROR_SUCCESS) { dwSize = sizeof(dwValue); if (RegQueryValueEx(hKey, _T("UseThreads"), NULL, &dwType, (BYTE*) &dwValue, &dwSize) == ERROR_SUCCESS) priv->UseThreads = dwValue ? 1 : 0; if (RegQueryValueEx(hKey, _T("MinThreadCount"), NULL, &dwType, (BYTE*) &dwValue, &dwSize) == ERROR_SUCCESS) priv->MinThreadCount = dwValue; if (RegQueryValueEx(hKey, _T("MaxThreadCount"), NULL, &dwType, (BYTE*) &dwValue, &dwSize) == ERROR_SUCCESS) priv->MaxThreadCount = dwValue; RegCloseKey(hKey); } if (priv->UseThreads) { /* Call primitives_get here in order to avoid race conditions when using primitives_get */ /* from multiple threads. This call will initialize all function pointers correctly */ /* before any decoding threads are started */ primitives_get(); priv->ThreadPool = CreateThreadpool(NULL); if (!priv->ThreadPool) goto error_threadPool; InitializeThreadpoolEnvironment(&priv->ThreadPoolEnv); SetThreadpoolCallbackPool(&priv->ThreadPoolEnv, priv->ThreadPool); if (priv->MinThreadCount) if (!SetThreadpoolThreadMinimum(priv->ThreadPool, priv->MinThreadCount)) goto error_threadPool_minimum; if (priv->MaxThreadCount) SetThreadpoolThreadMaximum(priv->ThreadPool, priv->MaxThreadCount); } /* initialize the default pixel format */ rfx_context_set_pixel_format(context, RDP_PIXEL_FORMAT_B8G8R8A8); /* create profilers for default decoding routines */ rfx_profiler_create(context); /* set up default routines */ context->quantization_decode = rfx_quantization_decode; context->quantization_encode = rfx_quantization_encode; context->dwt_2d_decode = rfx_dwt_2d_decode; context->dwt_2d_encode = rfx_dwt_2d_encode; RFX_INIT_SIMD(context); context->state = RFX_STATE_SEND_HEADERS; return context; error_threadPool_minimum: CloseThreadpool(priv->ThreadPool); error_threadPool: BufferPool_Free(priv->BufferPool); error_BufferPool: ObjectPool_Free(priv->TilePool); error_tilePool: free(priv); error_priv: free(context); return NULL; }
int TestWLog(int argc, char* argv[]) { wLog* root; wLog* logA; wLog* logB; wLogLayout* layout; wLogAppender* appender; char* tmp_path; char* wlog_file; if (!(tmp_path = GetKnownPath(KNOWN_PATH_TEMP))) { fprintf(stderr, "Failed to get temporary directory!\n"); return -1; } WLog_Init(); root = WLog_GetRoot(); WLog_SetLogAppenderType(root, WLOG_APPENDER_BINARY); appender = WLog_GetLogAppender(root); if(!WLog_ConfigureAppender(appender, "outputfilename", "test_w.log")) return 1; if(!WLog_ConfigureAppender(appender, "outputfilepath", tmp_path)) return 1; layout = WLog_GetLogLayout(root); WLog_Layout_SetPrefixFormat(root, layout, "[%lv:%mn] [%fl|%fn|%ln] - "); WLog_OpenAppender(root); logA = WLog_Get("com.test.ChannelA"); logB = WLog_Get("com.test.ChannelB"); WLog_SetLogLevel(logA, WLOG_INFO); WLog_SetLogLevel(logB, WLOG_ERROR); WLog_Print(logA, WLOG_INFO, "this is a test"); WLog_Print(logA, WLOG_WARN, "this is a %dnd %s", 2, "test"); WLog_Print(logA, WLOG_ERROR, "this is an error"); WLog_Print(logA, WLOG_TRACE, "this is a trace output"); WLog_Print(logB, WLOG_INFO, "just some info"); WLog_Print(logB, WLOG_WARN, "we're warning a %dnd %s", 2, "time"); WLog_Print(logB, WLOG_ERROR, "we've got an error"); WLog_Print(logB, WLOG_TRACE, "leaving a trace behind"); WLog_CloseAppender(root); WLog_Uninit(); if ((wlog_file = GetCombinedPath(tmp_path, "test_w.log"))) { DeleteFileA(wlog_file); free(wlog_file); } return 0; }
BOOL VCAPITYPE VirtualChannelEntry(PCHANNEL_ENTRY_POINTS pEntryPoints) { railPlugin* rail; RailClientContext* context; CHANNEL_ENTRY_POINTS_FREERDP* pEntryPointsEx; rail = (railPlugin*) malloc(sizeof(railPlugin)); ZeroMemory(rail, sizeof(railPlugin)); rail->plugin.channel_def.options = CHANNEL_OPTION_INITIALIZED | CHANNEL_OPTION_ENCRYPT_RDP | CHANNEL_OPTION_COMPRESS_RDP | CHANNEL_OPTION_SHOW_PROTOCOL; strcpy(rail->plugin.channel_def.name, "rail"); rail->plugin.connect_callback = rail_process_connect; rail->plugin.receive_callback = rail_process_receive; rail->plugin.event_callback = rail_process_event; rail->plugin.terminate_callback = rail_process_terminate; pEntryPointsEx = (CHANNEL_ENTRY_POINTS_FREERDP*) pEntryPoints; if ((pEntryPointsEx->cbSize >= sizeof(CHANNEL_ENTRY_POINTS_FREERDP)) && (pEntryPointsEx->MagicNumber == FREERDP_CHANNEL_MAGIC_NUMBER)) { context = (RailClientContext*) malloc(sizeof(RailClientContext)); context->handle = (void*) rail; context->ClientExecute = rail_client_execute; context->ClientActivate = rail_client_activate; context->ClientSystemParam = rail_client_system_param; context->ServerSystemParam = rail_server_system_param; context->ClientSystemCommand = rail_client_system_command; context->ClientHandshake = rail_client_handshake; context->ServerHandshake = rail_server_handshake; context->ClientHandshakeEx = rail_client_handshake_ex; context->ServerHandshakeEx = rail_server_handshake_ex; context->ClientNotifyEvent = rail_client_notify_event; context->ClientWindowMove = rail_client_window_move; context->ServerLocalMoveSize = rail_server_local_move_size; context->ServerMinMaxInfo = rail_server_min_max_info; context->ClientInformation = rail_client_information; context->ClientSystemMenu = rail_client_system_menu; context->ClientLanguageBarInfo = rail_client_language_bar_info; context->ServerLanguageBarInfo = rail_server_language_bar_info; context->ServerExecuteResult = rail_server_execute_result; context->ClientGetAppIdRequest = rail_client_get_appid_request; context->ServerGetAppIdResponse = rail_server_get_appid_response; *(pEntryPointsEx->ppInterface) = (void*) context; } WLog_Init(); rail->log = WLog_Get("com.freerdp.channels.rail.client"); WLog_Print(rail->log, WLOG_DEBUG, "VirtualChannelEntry"); svc_plugin_init((rdpSvcPlugin*) rail, pEntryPoints); return 1; }