예제 #1
0
static void remdesk_virtual_channel_event_disconnected(remdeskPlugin* remdesk)
{
    UINT rc;

    MessageQueue_PostQuit(remdesk->queue, 0);
    WaitForSingleObject(remdesk->thread, INFINITE);

    MessageQueue_Free(remdesk->queue);
    CloseHandle(remdesk->thread);

    remdesk->queue = NULL;
    remdesk->thread = NULL;

    rc = remdesk->channelEntryPoints.pVirtualChannelClose(remdesk->OpenHandle);
    if (CHANNEL_RC_OK != rc)
    {
        WLog_ERR(TAG, "pVirtualChannelClose failed with %s [%08X]",
                 WTSErrorToString(rc), rc);
    }

    if (remdesk->data_in)
    {
        Stream_Free(remdesk->data_in, TRUE);
        remdesk->data_in = NULL;
    }

    remdesk_remove_open_handle_data(remdesk->OpenHandle);
}
예제 #2
0
/**
 * Function description
 *
 * @return 0 on success, otherwise a Win32 error code
 */
static UINT remdesk_virtual_channel_event_connected(remdeskPlugin* remdesk, LPVOID pData, UINT32 dataLength)
{
	UINT32 status;
	UINT error;

	status = remdesk->channelEntryPoints.pVirtualChannelOpen(remdesk->InitHandle,
		&remdesk->OpenHandle, remdesk->channelDef.name, remdesk_virtual_channel_open_event);

	if (status != CHANNEL_RC_OK)
	{
		WLog_ERR(TAG,  "pVirtualChannelOpen failed with %s [%08X]",
				 WTSErrorToString(status), status);
		return status;
	}

	if ((error = remdesk_add_open_handle_data(remdesk->OpenHandle, remdesk)))
	{
		WLog_ERR(TAG, "remdesk_add_open_handle_data failed with error %lu", error);
		return error;
	}

	remdesk->queue = MessageQueue_New(NULL);
	if (!remdesk->queue)
	{
		WLog_ERR(TAG, "MessageQueue_New failed!");
		error = CHANNEL_RC_NO_MEMORY;
		goto error_out;
	}

	remdesk->thread = CreateThread(NULL, 0,
			(LPTHREAD_START_ROUTINE) remdesk_virtual_channel_client_thread, (void*) remdesk, 0, NULL);
	if (!remdesk->thread)
	{
		WLog_ERR(TAG, "CreateThread failed");
		error = ERROR_INTERNAL_ERROR;
		goto error_out;
	}
	return CHANNEL_RC_OK;
error_out:
	remdesk_remove_open_handle_data(remdesk->OpenHandle);
	MessageQueue_Free(remdesk->queue);
	remdesk->queue = NULL;
	return error;
}
예제 #3
0
static void remdesk_virtual_channel_event_terminated(remdeskPlugin* remdesk)
{
	MessagePipe_PostQuit(remdesk->MsgPipe, 0);
	WaitForSingleObject(remdesk->thread, INFINITE);

	MessagePipe_Free(remdesk->MsgPipe);
	CloseHandle(remdesk->thread);

	remdesk->channelEntryPoints.pVirtualChannelClose(remdesk->OpenHandle);

	if (remdesk->data_in)
	{
		Stream_Free(remdesk->data_in, TRUE);
		remdesk->data_in = NULL;
	}

	remdesk_remove_open_handle_data(remdesk->OpenHandle);
	remdesk_remove_init_handle_data(remdesk->InitHandle);
}