int freerdp_channels_client_load(rdpChannels* channels, rdpSettings* settings, PVIRTUALCHANNELENTRY entry, void* data) { int status; CHANNEL_ENTRY_POINTS_FREERDP EntryPoints; CHANNEL_CLIENT_DATA* pChannelClientData; if (channels->clientDataCount + 1 >= CHANNEL_MAX_COUNT) { WLog_ERR(TAG, "error: too many channels"); return 1; } if (freerdp_channels_is_loaded(channels, entry)) { WLog_WARN(TAG, "Skipping, channel already loaded"); return 0; } pChannelClientData = &channels->clientDataList[channels->clientDataCount]; pChannelClientData->entry = entry; ZeroMemory(&EntryPoints, sizeof(CHANNEL_ENTRY_POINTS_FREERDP)); EntryPoints.cbSize = sizeof(EntryPoints); EntryPoints.protocolVersion = VIRTUAL_CHANNEL_VERSION_WIN2000; EntryPoints.pVirtualChannelInit = FreeRDP_VirtualChannelInit; EntryPoints.pVirtualChannelOpen = FreeRDP_VirtualChannelOpen; EntryPoints.pVirtualChannelClose = FreeRDP_VirtualChannelClose; EntryPoints.pVirtualChannelWrite = FreeRDP_VirtualChannelWrite; EntryPoints.MagicNumber = FREERDP_CHANNEL_MAGIC_NUMBER; EntryPoints.ppInterface = &g_pInterface; EntryPoints.pExtendedData = data; EntryPoints.context = ((freerdp*)settings->instance)->context; /* enable VirtualChannelInit */ channels->can_call_init = TRUE; channels->settings = settings; EnterCriticalSection(&g_channels_lock); g_pInterface = NULL; g_ChannelInitData.channels = channels; status = pChannelClientData->entry((PCHANNEL_ENTRY_POINTS) &EntryPoints); LeaveCriticalSection(&g_channels_lock); /* disable MyVirtualChannelInit */ channels->settings = NULL; channels->can_call_init = FALSE; if (!status) { WLog_ERR(TAG, "error: channel export function call failed"); return 1; } return 0; }
int freerdp_channels_client_load(rdpChannels* channels, rdpSettings* settings, void* entry, void* data) { int status; CHANNEL_ENTRY_POINTS_EX ep; CHANNEL_CLIENT_DATA* pChannelClientData; if (channels->clientDataCount + 1 >= CHANNEL_MAX_COUNT) { fprintf(stderr, "error: too many channels\n"); return 1; } pChannelClientData = &channels->clientDataList[channels->clientDataCount]; pChannelClientData->entry = (PVIRTUALCHANNELENTRY) entry; ep.cbSize = sizeof(ep); ep.protocolVersion = VIRTUAL_CHANNEL_VERSION_WIN2000; ep.pVirtualChannelInit = FreeRDP_VirtualChannelInit; ep.pVirtualChannelOpen = FreeRDP_VirtualChannelOpen; ep.pVirtualChannelClose = FreeRDP_VirtualChannelClose; ep.pVirtualChannelWrite = FreeRDP_VirtualChannelWrite; g_pInterface = NULL; ep.MagicNumber = FREERDP_CHANNEL_MAGIC_NUMBER; ep.ppInterface = &g_pInterface; ep.pExtendedData = data; ep.pVirtualChannelEventPush = FreeRDP_VirtualChannelEventPush; /* enable VirtualChannelInit */ channels->can_call_init = TRUE; channels->settings = settings; WaitForSingleObject(g_mutex_init, INFINITE); g_ChannelInitData.channels = channels; status = pChannelClientData->entry((PCHANNEL_ENTRY_POINTS) &ep); ReleaseMutex(g_mutex_init); /* disable MyVirtualChannelInit */ channels->settings = NULL; channels->can_call_init = FALSE; if (!status) { fprintf(stderr, "error: channel export function call failed\n"); return 1; } return 0; }