示例#1
0
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;
}
示例#2
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;
}