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); }
/** * 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; }
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); }