diff --git a/channels/audin/client/audin_main.c b/channels/audin/client/audin_main.c index b059ce75d..737c82844 100644 --- a/channels/audin/client/audin_main.c +++ b/channels/audin/client/audin_main.c @@ -832,23 +832,21 @@ UINT DVCPluginEntry(IDRDYNVC_ENTRY_POINTS* pEntryPoints) assert(pEntryPoints->GetPlugin); audin = (AUDIN_PLUGIN*) pEntryPoints->GetPlugin(pEntryPoints, "audin"); - if (audin == NULL) + if (audin != NULL) + return CHANNEL_RC_ALREADY_INITIALIZED; + + audin = (AUDIN_PLUGIN*) calloc(1, sizeof(AUDIN_PLUGIN)); + if (!audin) { - audin = (AUDIN_PLUGIN*) calloc(1, sizeof(AUDIN_PLUGIN)); - if (!audin) - { - WLog_ERR(TAG, "calloc failed!"); - return CHANNEL_RC_NO_MEMORY; - } - - audin->iface.Initialize = audin_plugin_initialize; - audin->iface.Connected = NULL; - audin->iface.Disconnected = NULL; - audin->iface.Terminated = audin_plugin_terminated; - - error = pEntryPoints->RegisterPlugin(pEntryPoints, "audin", (IWTSPlugin*) audin); + WLog_ERR(TAG, "calloc failed!"); + return CHANNEL_RC_NO_MEMORY; } + audin->iface.Initialize = audin_plugin_initialize; + audin->iface.Connected = NULL; + audin->iface.Disconnected = NULL; + audin->iface.Terminated = audin_plugin_terminated; + args = pEntryPoints->GetPluginData(pEntryPoints); audin->rdpcontext = ((freerdp*)((rdpSettings*) pEntryPoints->GetRdpSettings(pEntryPoints))->instance)->context; @@ -894,7 +892,7 @@ UINT DVCPluginEntry(IDRDYNVC_ENTRY_POINTS* pEntryPoints) if (audin->device == NULL) WLog_ERR(TAG, "no sound device."); - error = CHANNEL_RC_OK; + error = pEntryPoints->RegisterPlugin(pEntryPoints, "audin", (IWTSPlugin*) audin); out: if (error != CHANNEL_RC_OK) diff --git a/channels/cliprdr/client/cliprdr_main.c b/channels/cliprdr/client/cliprdr_main.c index 18b594ed0..da81b082f 100644 --- a/channels/cliprdr/client/cliprdr_main.c +++ b/channels/cliprdr/client/cliprdr_main.c @@ -159,10 +159,10 @@ static UINT cliprdr_process_general_capability(cliprdrPlugin* cliprdr, wStream* WLog_ERR(TAG, "cliprdr_get_client_interface failed!"); return ERROR_INTERNAL_ERROR; } - + Stream_Read_UINT32(s, version); /* version (4 bytes) */ Stream_Read_UINT32(s, generalFlags); /* generalFlags (4 bytes) */ - + DEBUG_CLIPRDR("Version: %d", version); #ifdef WITH_DEBUG_CLIPRDR cliprdr_print_general_capability_flags(generalFlags); @@ -179,7 +179,7 @@ static UINT cliprdr_process_general_capability(cliprdrPlugin* cliprdr, wStream* if (cliprdr->canLockClipData) cliprdr->canLockClipData = (generalFlags & CB_CAN_LOCK_CLIPDATA) ? TRUE : FALSE; - + cliprdr->capabilitiesReceived = TRUE; if (!context->custom) @@ -187,7 +187,7 @@ static UINT cliprdr_process_general_capability(cliprdrPlugin* cliprdr, wStream* WLog_ERR(TAG, "context->custom not set!"); return ERROR_INTERNAL_ERROR; } - + capabilities.cCapabilitiesSets = 1; capabilities.capabilitySets = (CLIPRDR_CAPABILITY_SET*) &(generalCapabilitySet); generalCapabilitySet.capabilitySetType = CB_CAPSTYPE_GENERAL; @@ -215,7 +215,7 @@ static UINT cliprdr_process_clip_caps(cliprdrPlugin* cliprdr, wStream* s, UINT16 UINT16 cCapabilitiesSets; UINT16 capabilitySetType; UINT error = CHANNEL_RC_OK; - + Stream_Read_UINT16(s, cCapabilitiesSets); /* cCapabilitiesSets (2 bytes) */ Stream_Seek_UINT16(s); /* pad1 (2 bytes) */ @@ -235,7 +235,7 @@ static UINT cliprdr_process_clip_caps(cliprdrPlugin* cliprdr, wStream* s, UINT16 return error; } break; - + default: WLog_ERR(TAG, "unknown cliprdr capability set: %d", capabilitySetType); return CHANNEL_RC_BAD_PROC; @@ -273,13 +273,13 @@ static UINT cliprdr_process_monitor_ready(cliprdrPlugin* cliprdr, wStream* s, UI * When the server capabilities pdu is not used, default capabilities * corresponding to a generalFlags field set to zero are assumed. */ - + cliprdr->useLongFormatNames = FALSE; cliprdr->streamFileClipEnabled = FALSE; cliprdr->fileClipNoFilePaths = TRUE; cliprdr->canLockClipData = FALSE; } - + monitorReady.msgType = CB_MONITOR_READY; monitorReady.msgFlags = flags; monitorReady.dataLen = length; @@ -354,7 +354,7 @@ static UINT cliprdr_process_filecontents_response(cliprdrPlugin* cliprdr, wStrea WLog_ERR(TAG, "context->custom not set!"); return ERROR_INTERNAL_ERROR; } - + if (Stream_GetRemainingLength(s) < 4) { WLog_ERR(TAG, "not enought remaining data"); @@ -366,7 +366,7 @@ static UINT cliprdr_process_filecontents_response(cliprdrPlugin* cliprdr, wStrea response.dataLen = length; Stream_Read_UINT32(s, response.streamId); /* streamId (4 bytes) */ - + response.cbRequested = length - 4; response.requestedData = Stream_Pointer(s); /* requestedFileContentsData */ @@ -434,7 +434,7 @@ static UINT cliprdr_process_unlock_clipdata(cliprdrPlugin* cliprdr, wStream* s, WLog_ERR(TAG, "context->custom not set!"); return ERROR_INTERNAL_ERROR; } - + if (Stream_GetRemainingLength(s) < 4) { WLog_ERR(TAG, "not enought remaining data"); @@ -637,7 +637,7 @@ UINT cliprdr_client_format_list(CliprdrClientContext* context, CLIPRDR_FORMAT_LI if (!cliprdr->useLongFormatNames) { length = formatList->numFormats * 36; - + s = cliprdr_packet_new(CB_FORMAT_LIST, 0, length); if (!s) @@ -649,40 +649,40 @@ UINT cliprdr_client_format_list(CliprdrClientContext* context, CLIPRDR_FORMAT_LI for (index = 0; index < formatList->numFormats; index++) { format = (CLIPRDR_FORMAT*) &(formatList->formats[index]); - + Stream_Write_UINT32(s, format->formatId); /* formatId (4 bytes) */ - + formatNameSize = 0; formatNameLength = 0; szFormatName = format->formatName; - + if (asciiNames) { if (szFormatName) formatNameLength = strlen(szFormatName); - + if (formatNameLength > 31) formatNameLength = 31; - + Stream_Write(s, szFormatName, formatNameLength); Stream_Zero(s, 32 - formatNameLength); } else { wszFormatName = NULL; - + if (szFormatName) formatNameSize = ConvertToUnicode(CP_UTF8, 0, szFormatName, -1, &wszFormatName, 0); - + if (formatNameSize > 15) formatNameSize = 15; - - if (wszFormatName) + + if (wszFormatName) Stream_Write(s, wszFormatName, formatNameSize * 2); Stream_Zero(s, 32 - (formatNameSize * 2)); - + free(wszFormatName); } } @@ -1218,9 +1218,9 @@ static UINT cliprdr_virtual_channel_event_disconnected(cliprdrPlugin* cliprdr) if (MessageQueue_PostQuit(cliprdr->queue, 0) && (WaitForSingleObject(cliprdr->thread, INFINITE) == WAIT_FAILED)) { - rc = GetLastError(); - WLog_ERR(TAG, "WaitForSingleObject failed with error %lu", rc); - return rc; + rc = GetLastError(); + WLog_ERR(TAG, "WaitForSingleObject failed with error %lu", rc); + return rc; } MessageQueue_Free(cliprdr->queue); @@ -1257,7 +1257,9 @@ static UINT cliprdr_virtual_channel_event_terminated(cliprdrPlugin* cliprdr) return CHANNEL_RC_OK; } -static VOID VCAPITYPE cliprdr_virtual_channel_init_event(LPVOID pInitHandle, UINT event, LPVOID pData, UINT dataLength) +static UINT VCAPITYPE cliprdr_virtual_channel_init_event(LPVOID pInitHandle, + UINT event, LPVOID pData, + UINT dataLength) { cliprdrPlugin* cliprdr; UINT error = CHANNEL_RC_OK; @@ -1267,7 +1269,7 @@ static VOID VCAPITYPE cliprdr_virtual_channel_init_event(LPVOID pInitHandle, UIN if (!cliprdr) { WLog_ERR(TAG, "error no match"); - return; + return CHANNEL_RC_BAD_INIT_HANDLE; } switch (event) @@ -1290,7 +1292,7 @@ static VOID VCAPITYPE cliprdr_virtual_channel_init_event(LPVOID pInitHandle, UIN if (error && cliprdr->context->rdpcontext) setChannelError(cliprdr->context->rdpcontext, error, "cliprdr_virtual_channel_init_event reported an error"); - return; + return error; } /* cliprdr is always built-in */ @@ -1358,14 +1360,14 @@ BOOL VCAPITYPE VirtualChannelEntry(PCHANNEL_ENTRY_POINTS pEntryPoints) cliprdr->streamFileClipEnabled = FALSE; cliprdr->fileClipNoFilePaths = TRUE; cliprdr->canLockClipData = FALSE; - + WLog_Print(cliprdr->log, WLOG_DEBUG, "VirtualChannelEntry"); CopyMemory(&(cliprdr->channelEntryPoints), pEntryPoints, sizeof(CHANNEL_ENTRY_POINTS_FREERDP)); rc = cliprdr->channelEntryPoints.pVirtualChannelInit(&cliprdr->InitHandle, &cliprdr->channelDef, 1, VIRTUAL_CHANNEL_VERSION_WIN2000, cliprdr_virtual_channel_init_event); - + if (CHANNEL_RC_OK != rc) { WLog_ERR(TAG, "pVirtualChannelInit failed with %s [%08X]", diff --git a/channels/drdynvc/client/drdynvc_main.c b/channels/drdynvc/client/drdynvc_main.c index 676dfb960..26419add5 100644 --- a/channels/drdynvc/client/drdynvc_main.c +++ b/channels/drdynvc/client/drdynvc_main.c @@ -241,7 +241,7 @@ IWTSVirtualChannelManager* dvcman_new(drdynvcPlugin* plugin) * * @return 0 on success, otherwise a Win32 error code */ -UINT dvcman_load_addin(IWTSVirtualChannelManager* pChannelMgr, ADDIN_ARGV* args, rdpSettings* settings) +static UINT dvcman_load_addin(IWTSVirtualChannelManager* pChannelMgr, ADDIN_ARGV* args, rdpSettings* settings) { DVCMAN_ENTRY_POINTS entryPoints; PDVC_PLUGIN_ENTRY pDVCPluginEntry = NULL; @@ -261,7 +261,7 @@ UINT dvcman_load_addin(IWTSVirtualChannelManager* pChannelMgr, ADDIN_ARGV* args, entryPoints.args = args; entryPoints.settings = settings; - pDVCPluginEntry((IDRDYNVC_ENTRY_POINTS*) &entryPoints); + return pDVCPluginEntry((IDRDYNVC_ENTRY_POINTS*) &entryPoints); } return CHANNEL_RC_OK; @@ -478,8 +478,8 @@ UINT dvcman_create_channel(IWTSVirtualChannelManager* pChannelMgr, UINT32 Channe context = dvcman->drdynvc->context; IFCALLRET(context->OnChannelConnected, error, context, ChannelName, listener->iface.pInterface); - if (error) - WLog_ERR(TAG, "context.ReceiveSamples failed with error %lu", error); + if (error) + WLog_ERR(TAG, "context.ReceiveSamples failed with error %lu", error); return error; } @@ -1056,7 +1056,7 @@ static UINT drdynvc_process_close_request(drdynvcPlugin* drdynvc, int Sp, int cb WLog_ERR(TAG, "dvcman_close_channel failed with error %lu!", error); return error; } - + data_out = Stream_New(NULL, 4); if (!data_out) @@ -1214,6 +1214,10 @@ void* drdynvc_get_open_handle_data(DWORD openHandle) void drdynvc_remove_open_handle_data(DWORD openHandle) { void* pOpenHandle = (void*) (size_t) openHandle; + + if (!g_OpenHandles) + return; + ListDictionary_Remove(g_OpenHandles, pOpenHandle); if (ListDictionary_Count(g_OpenHandles) < 1) @@ -1411,7 +1415,9 @@ static UINT drdynvc_virtual_channel_event_connected(drdynvcPlugin* drdynvc, LPVO for (index = 0; index < settings->DynamicChannelCount; index++) { args = settings->DynamicChannelArray[index]; - dvcman_load_addin(drdynvc->channel_mgr, args, settings); + error = dvcman_load_addin(drdynvc->channel_mgr, args, settings); + if (CHANNEL_RC_OK != error) + goto error; } if ((error = dvcman_init(drdynvc->channel_mgr))) @@ -1434,8 +1440,6 @@ static UINT drdynvc_virtual_channel_event_connected(drdynvcPlugin* drdynvc, LPVO error: drdynvc_remove_open_handle_data(drdynvc->OpenHandle); - MessageQueue_Free(drdynvc->queue); - drdynvc->queue = NULL; return error; } @@ -1449,11 +1453,11 @@ static UINT drdynvc_virtual_channel_event_disconnected(drdynvcPlugin* drdynvc) UINT status; if (MessageQueue_PostQuit(drdynvc->queue, 0) && (WaitForSingleObject(drdynvc->thread, INFINITE) == WAIT_FAILED)) - { - status = GetLastError(); - WLog_ERR(TAG, "WaitForSingleObject failed with error %lu", status); - return status; - } + { + status = GetLastError(); + WLog_ERR(TAG, "WaitForSingleObject failed with error %lu", status); + return status; + } MessageQueue_Free(drdynvc->queue); CloseHandle(drdynvc->thread); @@ -1497,7 +1501,9 @@ static UINT drdynvc_virtual_channel_event_terminated(drdynvcPlugin* drdynvc) return CHANNEL_RC_OK; } -static void VCAPITYPE drdynvc_virtual_channel_init_event(LPVOID pInitHandle, UINT event, LPVOID pData, UINT dataLength) +static UINT VCAPITYPE drdynvc_virtual_channel_init_event(LPVOID pInitHandle, + UINT event, LPVOID pData, + UINT dataLength) { drdynvcPlugin* drdynvc; UINT error = CHANNEL_RC_OK; @@ -1507,7 +1513,7 @@ static void VCAPITYPE drdynvc_virtual_channel_init_event(LPVOID pInitHandle, UIN if (!drdynvc) { WLog_ERR(TAG, "drdynvc_virtual_channel_init_event: error no match"); - return; + return CHANNEL_RC_BAD_INIT_HANDLE; } switch (event) @@ -1530,6 +1536,7 @@ static void VCAPITYPE drdynvc_virtual_channel_init_event(LPVOID pInitHandle, UIN if (error && drdynvc->rdpcontext) setChannelError(drdynvc->rdpcontext, error, "drdynvc_virtual_channel_init_event reported an error"); + return error; } /** diff --git a/channels/encomsp/client/encomsp_main.c b/channels/encomsp/client/encomsp_main.c index 3386c6384..af1d4b183 100644 --- a/channels/encomsp/client/encomsp_main.c +++ b/channels/encomsp/client/encomsp_main.c @@ -1217,9 +1217,9 @@ static UINT encomsp_virtual_channel_event_disconnected(encomspPlugin* encomsp) if (MessageQueue_PostQuit(encomsp->queue, 0) && (WaitForSingleObject(encomsp->thread, INFINITE) == WAIT_FAILED)) { - rc = GetLastError(); - WLog_ERR(TAG, "WaitForSingleObject failed with error %lu", rc); - return rc; + rc = GetLastError(); + WLog_ERR(TAG, "WaitForSingleObject failed with error %lu", rc); + return rc; } MessageQueue_Free(encomsp->queue); @@ -1259,7 +1259,9 @@ static UINT encomsp_virtual_channel_event_terminated(encomspPlugin* encomsp) return CHANNEL_RC_OK; } -static void VCAPITYPE encomsp_virtual_channel_init_event(LPVOID pInitHandle, UINT event, LPVOID pData, UINT dataLength) +static UINT VCAPITYPE encomsp_virtual_channel_init_event(LPVOID pInitHandle, + UINT event, LPVOID pData, + UINT dataLength) { encomspPlugin* encomsp; UINT error = CHANNEL_RC_OK; @@ -1269,7 +1271,7 @@ static void VCAPITYPE encomsp_virtual_channel_init_event(LPVOID pInitHandle, UIN if (!encomsp) { WLog_ERR(TAG, "encomsp_virtual_channel_init_event: error no match"); - return; + return CHANNEL_RC_BAD_INIT_HANDLE; } switch (event) @@ -1294,7 +1296,7 @@ static void VCAPITYPE encomsp_virtual_channel_init_event(LPVOID pInitHandle, UIN if (error && encomsp->rdpcontext) setChannelError(encomsp->rdpcontext, error, "encomsp_virtual_channel_init_event reported an error"); - return; + return error; } /* encomsp is always built-in */ diff --git a/channels/rail/client/rail_main.c b/channels/rail/client/rail_main.c index 4294cf64a..1ba1b2391 100644 --- a/channels/rail/client/rail_main.c +++ b/channels/rail/client/rail_main.c @@ -741,9 +741,9 @@ static UINT rail_virtual_channel_event_disconnected(railPlugin* rail) UINT rc; if (MessageQueue_PostQuit(rail->queue, 0) && (WaitForSingleObject(rail->thread, INFINITE) == WAIT_FAILED)) { - rc = GetLastError(); - WLog_ERR(TAG, "WaitForSingleObject failed with error %lu", rc); - return rc; + rc = GetLastError(); + WLog_ERR(TAG, "WaitForSingleObject failed with error %lu", rc); + return rc; } MessageQueue_Free(rail->queue); @@ -757,7 +757,7 @@ static UINT rail_virtual_channel_event_disconnected(railPlugin* rail) { WLog_ERR(TAG, "pVirtualChannelClose failed with %s [%08X]", WTSErrorToString(rc), rc); - return rc; + return rc; } if (rail->data_in) @@ -776,7 +776,7 @@ static void rail_virtual_channel_event_terminated(railPlugin* rail) free(rail); } -static VOID VCAPITYPE rail_virtual_channel_init_event(LPVOID pInitHandle, UINT event, LPVOID pData, UINT dataLength) +static UINT VCAPITYPE rail_virtual_channel_init_event(LPVOID pInitHandle, UINT event, LPVOID pData, UINT dataLength) { railPlugin* rail; UINT error = CHANNEL_RC_OK; @@ -786,7 +786,7 @@ static VOID VCAPITYPE rail_virtual_channel_init_event(LPVOID pInitHandle, UINT e if (!rail) { WLog_ERR(TAG, "rail_virtual_channel_init_event: error no match"); - return; + return CHANNEL_RC_BAD_INIT_HANDLE; } switch (event) @@ -798,7 +798,7 @@ static VOID VCAPITYPE rail_virtual_channel_init_event(LPVOID pInitHandle, UINT e case CHANNEL_EVENT_DISCONNECTED: if ((error = rail_virtual_channel_event_disconnected(rail))) - WLog_ERR(TAG, "rail_virtual_channel_event_disconnected failed with error %lu!", error); + WLog_ERR(TAG, "rail_virtual_channel_event_disconnected failed with error %lu!", error); break; case CHANNEL_EVENT_TERMINATED: @@ -809,7 +809,7 @@ static VOID VCAPITYPE rail_virtual_channel_init_event(LPVOID pInitHandle, UINT e if(error && rail->rdpcontext) setChannelError(rail->rdpcontext, error, "rail_virtual_channel_init_event reported an error"); - return; + return error; } /* rail is always built-in */ diff --git a/channels/rdpdr/client/rdpdr_main.c b/channels/rdpdr/client/rdpdr_main.c index d18cc5b1b..8f614c6df 100644 --- a/channels/rdpdr/client/rdpdr_main.c +++ b/channels/rdpdr/client/rdpdr_main.c @@ -480,8 +480,8 @@ cleanup: static void drive_hotplug_fsevent_callback(ConstFSEventStreamRef streamRef, void *clientCallBackInfo, - size_t numEvents, void *eventPaths, const FSEventStreamEventFlags eventFlags[], - const FSEventStreamEventId eventIds[]) + size_t numEvents, void *eventPaths, const FSEventStreamEventFlags eventFlags[], + const FSEventStreamEventId eventIds[]) { rdpdrPlugin* rdpdr; int i; @@ -649,13 +649,13 @@ static char* get_word(char* str, unsigned int* offset) (*offset)++; word = malloc(wlen + 1); - + if (word != NULL) { CopyMemory(word, p, wlen); word[wlen] = '\0'; } - + return word; } @@ -1720,7 +1720,8 @@ static void rdpdr_virtual_channel_event_terminated(rdpdrPlugin* rdpdr) free(rdpdr); } -static VOID VCAPITYPE rdpdr_virtual_channel_init_event(LPVOID pInitHandle, UINT event, LPVOID pData, UINT dataLength) +static UINT VCAPITYPE rdpdr_virtual_channel_init_event(LPVOID pInitHandle, UINT event, + LPVOID pData, UINT dataLength) { rdpdrPlugin* rdpdr; UINT error = CHANNEL_RC_OK; @@ -1730,7 +1731,7 @@ static VOID VCAPITYPE rdpdr_virtual_channel_init_event(LPVOID pInitHandle, UINT if (!rdpdr) { WLog_ERR(TAG, "error no match"); - return; + return CHANNEL_RC_BAD_INIT_HANDLE; } switch (event) @@ -1758,7 +1759,7 @@ static VOID VCAPITYPE rdpdr_virtual_channel_init_event(LPVOID pInitHandle, UINT if (error && rdpdr->rdpcontext) setChannelError(rdpdr->rdpcontext, error, "rdpdr_virtual_channel_init_event reported an error"); - return; + return error; } /* rdpdr is always built-in */ diff --git a/channels/rdpsnd/client/rdpsnd_main.c b/channels/rdpsnd/client/rdpsnd_main.c index 155dd22c8..c6a67674f 100644 --- a/channels/rdpsnd/client/rdpsnd_main.c +++ b/channels/rdpsnd/client/rdpsnd_main.c @@ -116,39 +116,39 @@ static void* rdpsnd_schedule_thread(void* arg) while (1) { - status = WaitForMultipleObjects(2, events, FALSE, INFINITE); + status = WaitForMultipleObjects(2, events, FALSE, INFINITE); - if (status == WAIT_FAILED) - { - error = GetLastError(); - WLog_ERR(TAG, "WaitForMultipleObjects failed with error %lu!", error); - break; - } + if (status == WAIT_FAILED) + { + error = GetLastError(); + WLog_ERR(TAG, "WaitForMultipleObjects failed with error %lu!", error); + break; + } - status = WaitForSingleObject(rdpsnd->stopEvent, 0); + status = WaitForSingleObject(rdpsnd->stopEvent, 0); - if (status == WAIT_FAILED) - { - error = GetLastError(); - WLog_ERR(TAG, "WaitForSingleObject failed with error %lu!", error); - break; - } + if (status == WAIT_FAILED) + { + error = GetLastError(); + WLog_ERR(TAG, "WaitForSingleObject failed with error %lu!", error); + break; + } - if (status == WAIT_OBJECT_0) - break; + if (status == WAIT_OBJECT_0) + break; - status = WaitForSingleObject(events[0], 0); + status = WaitForSingleObject(events[0], 0); - if (status == WAIT_FAILED) - { - error = GetLastError(); - WLog_ERR(TAG, "WaitForSingleObject failed with error %lu!", error); - break; - } + if (status == WAIT_FAILED) + { + error = GetLastError(); + WLog_ERR(TAG, "WaitForSingleObject failed with error %lu!", error); + break; + } - if (!MessageQueue_Peek(rdpsnd->MsgPipe->Out, &message, TRUE)) + if (!MessageQueue_Peek(rdpsnd->MsgPipe->Out, &message, TRUE)) { WLog_ERR(TAG, "MessageQueue_Peek failed!"); error = ERROR_INTERNAL_ERROR; @@ -811,6 +811,7 @@ static UINT rdpsnd_load_device_plugin(rdpsndPlugin* rdpsnd, const char* name, AD if ((error = entry(&entryPoints))) WLog_ERR(TAG, "%s entry returns error %lu", name, error); + WLog_INFO(TAG, "Loaded %s backend for rdpsnd", name); return error; } @@ -828,7 +829,7 @@ BOOL rdpsnd_set_device_name(rdpsndPlugin* rdpsnd, const char* device_name) return (rdpsnd->device_name != NULL); } -COMMAND_LINE_ARGUMENT_A rdpsnd_args[] = +static COMMAND_LINE_ARGUMENT_A rdpsnd_args[] = { { "sys", COMMAND_LINE_VALUE_REQUIRED, "", NULL, NULL, -1, NULL, "subsystem" }, { "dev", COMMAND_LINE_VALUE_REQUIRED, "", NULL, NULL, -1, NULL, "device" }, @@ -1078,10 +1079,10 @@ static void rdpsnd_process_disconnect(rdpsndPlugin* rdpsnd) { SetEvent(rdpsnd->stopEvent); if (WaitForSingleObject(rdpsnd->ScheduleThread, INFINITE) == WAIT_FAILED) - { - WLog_ERR(TAG, "WaitForSingleObject failed with error %lu!", GetLastError()); - return; - } + { + WLog_ERR(TAG, "WaitForSingleObject failed with error %lu!", GetLastError()); + return; + } CloseHandle(rdpsnd->ScheduleThread); CloseHandle(rdpsnd->stopEvent); } @@ -1386,9 +1387,9 @@ static UINT rdpsnd_virtual_channel_event_disconnected(rdpsndPlugin* rdpsnd) MessagePipe_PostQuit(rdpsnd->MsgPipe, 0); if (WaitForSingleObject(rdpsnd->thread, INFINITE) == WAIT_FAILED) { - error = GetLastError(); - WLog_ERR(TAG, "WaitForSingleObject failed with error %lu!", error); - return error; + error = GetLastError(); + WLog_ERR(TAG, "WaitForSingleObject failed with error %lu!", error); + return error; } CloseHandle(rdpsnd->thread); @@ -1449,7 +1450,7 @@ static void rdpsnd_virtual_channel_event_terminated(rdpsndPlugin* rdpsnd) free(rdpsnd); } -static VOID VCAPITYPE rdpsnd_virtual_channel_init_event(LPVOID pInitHandle, UINT event, LPVOID pData, UINT dataLength) +static UINT VCAPITYPE rdpsnd_virtual_channel_init_event(LPVOID pInitHandle, UINT event, LPVOID pData, UINT dataLength) { rdpsndPlugin* plugin; UINT error = CHANNEL_RC_OK; @@ -1459,7 +1460,7 @@ static VOID VCAPITYPE rdpsnd_virtual_channel_init_event(LPVOID pInitHandle, UINT if (!plugin) { WLog_ERR(TAG, "rdpsnd_virtual_channel_init_event: error no match"); - return; + return CHANNEL_RC_BAD_INIT_HANDLE; } switch (event) @@ -1480,6 +1481,7 @@ static VOID VCAPITYPE rdpsnd_virtual_channel_init_event(LPVOID pInitHandle, UINT } if (error && plugin->rdpcontext) setChannelError(plugin->rdpcontext, error, "rdpsnd_virtual_channel_init_event reported an error"); + return error; } /* rdpsnd is always built-in */ diff --git a/channels/remdesk/client/remdesk_main.c b/channels/remdesk/client/remdesk_main.c index 7a74705a8..5c5d46236 100644 --- a/channels/remdesk/client/remdesk_main.c +++ b/channels/remdesk/client/remdesk_main.c @@ -1030,11 +1030,11 @@ static UINT remdesk_virtual_channel_event_disconnected(remdeskPlugin* remdesk) UINT rc; if (MessageQueue_PostQuit(remdesk->queue, 0) && (WaitForSingleObject(remdesk->thread, INFINITE) == WAIT_FAILED)) - { - rc = GetLastError(); - WLog_ERR(TAG, "WaitForSingleObject failed with error %lu", rc); - return rc; - } + { + rc = GetLastError(); + WLog_ERR(TAG, "WaitForSingleObject failed with error %lu", rc); + return rc; + } MessageQueue_Free(remdesk->queue); CloseHandle(remdesk->thread); @@ -1066,7 +1066,9 @@ static void remdesk_virtual_channel_event_terminated(remdeskPlugin* remdesk) free(remdesk); } -static VOID VCAPITYPE remdesk_virtual_channel_init_event(LPVOID pInitHandle, UINT event, LPVOID pData, UINT dataLength) +static UINT VCAPITYPE remdesk_virtual_channel_init_event(LPVOID pInitHandle, + UINT event, LPVOID pData, + UINT dataLength) { remdeskPlugin* remdesk; UINT error = CHANNEL_RC_OK; @@ -1076,7 +1078,7 @@ static VOID VCAPITYPE remdesk_virtual_channel_init_event(LPVOID pInitHandle, UIN if (!remdesk) { WLog_ERR(TAG, "error no match"); - return; + return CHANNEL_RC_BAD_INIT_HANDLE; } switch (event) @@ -1097,6 +1099,8 @@ static VOID VCAPITYPE remdesk_virtual_channel_init_event(LPVOID pInitHandle, UIN } if (error && remdesk->rdpcontext) setChannelError(remdesk->rdpcontext, error, "remdesk_virtual_channel_init_event reported an error"); + + return error; } /* remdesk is always built-in */ diff --git a/client/Android/android_freerdp.c b/client/Android/android_freerdp.c index 8253f30d7..b3a548d34 100644 --- a/client/Android/android_freerdp.c +++ b/client/Android/android_freerdp.c @@ -357,7 +357,7 @@ static BOOL android_post_connect(freerdp* instance) instance->update->EndPaint = android_end_paint; instance->update->DesktopResize = android_desktop_resize; - if (freerdp_channels_post_connect(instance->context->channels, instance) < 0) + if (freerdp_channels_post_connect(instance->context->channels, instance) != CHANNEL_RC_OK) return FALSE; freerdp_callback("OnSettingsChanged", "(IIII)V", instance, diff --git a/client/DirectFB/dfreerdp.c b/client/DirectFB/dfreerdp.c index 56b9ff645..5c801cda4 100644 --- a/client/DirectFB/dfreerdp.c +++ b/client/DirectFB/dfreerdp.c @@ -177,7 +177,8 @@ BOOL df_pre_connect(freerdp* instance) dfi->clrconv->palette = (rdpPalette*) malloc(sizeof(rdpPalette)); ZeroMemory(dfi->clrconv->palette, sizeof(rdpPalette)); - freerdp_channels_pre_connect(instance->context->channels, instance); + if (freerdp_channels_pre_connect(instance->context->channels, instance) != CHANNEL_RC_OK) + return FALSE; return (instance->context->cache = cache_new(instance->settings)) != NULL; } @@ -235,7 +236,7 @@ BOOL df_post_connect(freerdp* instance) pointer_cache_register_callbacks(instance->update); df_register_graphics(instance->context->graphics); - return freerdp_channels_post_connect(instance->context->channels, instance) >= 0; + return freerdp_channels_post_connect(instance->context->channels, instance) == CHANNEL_RC_OK; } BOOL df_verify_certificate(freerdp* instance, char* subject, char* issuer, char* fingerprint) @@ -487,7 +488,8 @@ int main(int argc, char* argv[]) if (status < 0) exit(0); - freerdp_client_load_addins(instance->context->channels, instance->settings); + if (!freerdp_client_load_addins(instance->context->channels, instance->settings)) + exit(-1); data = (struct thread_data*) malloc(sizeof(struct thread_data)); ZeroMemory(data, sizeof(sizeof(struct thread_data))); diff --git a/client/Mac/MRDPView.m b/client/Mac/MRDPView.m index a4786dc6f..b1f2c240c 100644 --- a/client/Mac/MRDPView.m +++ b/client/Mac/MRDPView.m @@ -967,9 +967,11 @@ BOOL mac_pre_connect(freerdp* instance) PubSub_SubscribeChannelDisconnected(instance->context->pubSub, (pChannelDisconnectedEventHandler) mac_OnChannelDisconnectedEventHandler); - freerdp_client_load_addins(instance->context->channels, instance->settings); + if (!freerdp_client_load_addins(instance->context->channels, instance->settings)) + return FALSE; - freerdp_channels_pre_connect(instance->context->channels, instance); + if (freerdp_channels_pre_connect(instance->context->channels, instance) != CHANNEL_RC_OK) + return FALSE; return TRUE; } @@ -1011,7 +1013,8 @@ BOOL mac_post_connect(freerdp* instance) pointer_cache_register_callbacks(instance->update); graphics_register_pointer(instance->context->graphics, &rdp_pointer); - freerdp_channels_post_connect(instance->context->channels, instance); + if (freerdp_channels_post_connect(instance->context->channels, instance) != CHANNEL_RC_OK) + return FALSE; /* setup pasteboard (aka clipboard) for copy operations (write only) */ view->pasteboard_wr = [NSPasteboard generalPasteboard]; diff --git a/client/Sample/freerdp.c b/client/Sample/freerdp.c index 5291cb78b..2e0d92b91 100644 --- a/client/Sample/freerdp.c +++ b/client/Sample/freerdp.c @@ -109,7 +109,8 @@ static BOOL tf_pre_connect(freerdp* instance) settings->OrderSupport[NEG_ELLIPSE_SC_INDEX] = TRUE; settings->OrderSupport[NEG_ELLIPSE_CB_INDEX] = TRUE; - freerdp_channels_pre_connect(instance->context->channels, instance); + if (freerdp_channels_pre_connect(instance->context->channels, instance) != CHANNEL_RC_OK) + return FALSE; return TRUE; } @@ -122,7 +123,7 @@ static BOOL tf_post_connect(freerdp* instance) instance->update->BeginPaint = tf_begin_paint; instance->update->EndPaint = tf_end_paint; - return (freerdp_channels_post_connect(instance->context->channels, instance) >= 0); + return (freerdp_channels_post_connect(instance->context->channels, instance) == CHANNEL_RC_OK); } static void* tf_client_thread_proc(freerdp* instance) @@ -200,7 +201,8 @@ int main(int argc, char* argv[]) exit(0); } - freerdp_client_load_addins(instance->context->channels, instance->settings); + if (!freerdp_client_load_addins(instance->context->channels, instance->settings)) + exit (-1); if (!(thread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) tf_client_thread_proc, instance, 0, NULL))) diff --git a/client/Wayland/wlfreerdp.c b/client/Wayland/wlfreerdp.c index 308147cab..988b5d59c 100644 --- a/client/Wayland/wlfreerdp.c +++ b/client/Wayland/wlfreerdp.c @@ -114,7 +114,7 @@ static BOOL wl_pre_connect(freerdp* instance) { wlfContext* context; - if (freerdp_channels_pre_connect(instance->context->channels, instance)) + if (freerdp_channels_pre_connect(instance->context->channels, instance) != CHANNEL_RC_OK) return FALSE; context = (wlfContext*) instance->context; @@ -149,7 +149,7 @@ static BOOL wl_post_connect(freerdp* instance) instance->update->BeginPaint = wl_begin_paint; instance->update->EndPaint = wl_end_paint; - if (freerdp_channels_post_connect(instance->context->channels, instance) < 0) + if (freerdp_channels_post_connect(instance->context->channels, instance) != CHANNEL_RC_OK) return FALSE; @@ -324,7 +324,8 @@ int main(int argc, char* argv[]) if (status) exit(0); - freerdp_client_load_addins(instance->context->channels, instance->settings); + if (!freerdp_client_load_addins(instance->context->channels, instance->settings)) + exit(-1); wlfreerdp_run(instance); diff --git a/client/Windows/wf_client.c b/client/Windows/wf_client.c index eb80961d1..f224af3a7 100644 --- a/client/Windows/wf_client.c +++ b/client/Windows/wf_client.c @@ -333,7 +333,8 @@ BOOL wf_pre_connect(freerdp* instance) PubSub_SubscribeChannelDisconnected(instance->context->pubSub, (pChannelDisconnectedEventHandler) wf_OnChannelDisconnectedEventHandler); - freerdp_channels_pre_connect(instance->context->channels, instance); + if (freerdp_channels_pre_connect(instance->context->channels, instance) != CHANNEL_RC_OK) + return FALSE; return TRUE; } @@ -485,7 +486,7 @@ BOOL wf_post_connect(freerdp* instance) instance->update->BitmapUpdate = wf_gdi_bitmap_update; } - if (freerdp_channels_post_connect(context->channels, instance) < 0) + if (freerdp_channels_post_connect(context->channels, instance) != CHANNEL_RC_OK) return FALSE; if (wfc->fullscreen) @@ -1169,7 +1170,8 @@ int wfreerdp_client_start(rdpContext* context) if (!wfc->keyboardThread) return -1; - freerdp_client_load_addins(context->channels, instance->settings); + if (!freerdp_client_load_addins(context->channels, instance->settings)) + return -1; wfc->thread = CreateThread(NULL, 0, wf_client_thread, (void*) instance, 0, &wfc->mainThreadId); diff --git a/client/X11/xf_client.c b/client/X11/xf_client.c index baaf7e75b..16c1a5804 100644 --- a/client/X11/xf_client.c +++ b/client/X11/xf_client.c @@ -1127,8 +1127,11 @@ BOOL xf_pre_connect(freerdp* instance) PubSub_SubscribeChannelDisconnected(instance->context->pubSub, (pChannelDisconnectedEventHandler) xf_OnChannelDisconnectedEventHandler); - freerdp_client_load_addins(channels, instance->settings); - freerdp_channels_pre_connect(channels, instance); + if (!freerdp_client_load_addins(channels, instance->settings)) + return FALSE; + + if (freerdp_channels_pre_connect(channels, instance) != CHANNEL_RC_OK) + return FALSE; if (!settings->Username && !settings->CredentialsFromStdin) { @@ -1312,7 +1315,7 @@ BOOL xf_post_connect(freerdp* instance) if (!(xfc->clipboard = xf_clipboard_new(xfc))) return FALSE; - if (freerdp_channels_post_connect(channels, instance) < 0) + if (freerdp_channels_post_connect(channels, instance) != CHANNEL_RC_OK) return FALSE; EventArgsInit(&e, "xfreerdp"); diff --git a/client/iOS/FreeRDP/ios_freerdp.m b/client/iOS/FreeRDP/ios_freerdp.m index f4ef32aab..463843123 100644 --- a/client/iOS/FreeRDP/ios_freerdp.m +++ b/client/iOS/FreeRDP/ios_freerdp.m @@ -64,9 +64,11 @@ static BOOL ios_pre_connect(freerdp* instance) settings->FrameAcknowledge = 10; - freerdp_client_load_addins(instance->context->channels, instance->settings); + if (!freerdp_client_load_addins(instance->context->channels, instance->settings)) + return FALSE; - freerdp_channels_pre_connect(instance->context->channels, instance); + if (freerdp_channels_pre_connect(instance->context->channels, instance) != CHANNEL_RC_OK) + return FALSE; return TRUE; } @@ -84,7 +86,8 @@ static BOOL ios_post_connect(freerdp* instance) instance->update->DesktopResize = ios_ui_resize_window; // Channel allocation - freerdp_channels_post_connect(instance->context->channels, instance); + if (freerdp_channels_post_connect(instance->context->channels, instance) != CHANNEL_RC_OK) + return FALSE; [mfi->session performSelectorOnMainThread:@selector(sessionDidConnect) withObject:nil waitUntilDone:YES]; return TRUE; diff --git a/include/freerdp/channels/channels.h b/include/freerdp/channels/channels.h index 7e408f104..816afbb2e 100644 --- a/include/freerdp/channels/channels.h +++ b/include/freerdp/channels/channels.h @@ -38,9 +38,9 @@ FREERDP_API int freerdp_channels_client_load(rdpChannels* channels, rdpSettings* PVIRTUALCHANNELENTRY entry, void* data); FREERDP_API int freerdp_channels_load_plugin(rdpChannels* channels, rdpSettings* settings, const char* name, void* data); -FREERDP_API int freerdp_channels_pre_connect(rdpChannels* channels, freerdp* instance); -FREERDP_API int freerdp_channels_post_connect(rdpChannels* channels, freerdp* instance); -FREERDP_API int freerdp_channels_disconnect(rdpChannels* channels, freerdp* instance); +FREERDP_API UINT freerdp_channels_pre_connect(rdpChannels* channels, freerdp* instance); +FREERDP_API UINT freerdp_channels_post_connect(rdpChannels* channels, freerdp* instance); +FREERDP_API UINT freerdp_channels_disconnect(rdpChannels* channels, freerdp* instance); FREERDP_API BOOL freerdp_channels_get_fds(rdpChannels* channels, freerdp* instance, void** read_fds, int* read_count, void** write_fds, int* write_count); FREERDP_API BOOL freerdp_channels_check_fds(rdpChannels* channels, freerdp* instance); diff --git a/libfreerdp/core/client.c b/libfreerdp/core/client.c index 604f1923f..8c2723793 100644 --- a/libfreerdp/core/client.c +++ b/libfreerdp/core/client.c @@ -200,8 +200,9 @@ UINT freerdp_drdynvc_on_channel_disconnected(DrdynvcClientContext* context, cons * go through and inform all the libraries that we are initialized * called only from main thread */ -int freerdp_channels_pre_connect(rdpChannels* channels, freerdp* instance) +UINT freerdp_channels_pre_connect(rdpChannels* channels, freerdp* instance) { + UINT error = CHANNEL_RC_OK; int index; CHANNEL_CLIENT_DATA* pChannelClientData; @@ -212,10 +213,14 @@ int freerdp_channels_pre_connect(rdpChannels* channels, freerdp* instance) pChannelClientData = &channels->clientDataList[index]; if (pChannelClientData->pChannelInitEventProc) - pChannelClientData->pChannelInitEventProc(pChannelClientData->pInitHandle, CHANNEL_EVENT_INITIALIZED, 0, 0); + error = pChannelClientData->pChannelInitEventProc( + pChannelClientData->pInitHandle, + CHANNEL_EVENT_INITIALIZED, 0, 0); + if (CHANNEL_RC_OK != error) + break; } - return 0; + return error; } /** @@ -223,8 +228,9 @@ int freerdp_channels_pre_connect(rdpChannels* channels, freerdp* instance) * this will tell the libraries that its ok to call MyVirtualChannelOpen * called only from main thread */ -int freerdp_channels_post_connect(rdpChannels* channels, freerdp* instance) +UINT freerdp_channels_post_connect(rdpChannels* channels, freerdp* instance) { + UINT error = CHANNEL_RC_OK; int index; char* name; char* hostname; @@ -246,7 +252,10 @@ int freerdp_channels_post_connect(rdpChannels* channels, freerdp* instance) pChannelOpenData = &channels->openDataList[index]; - pChannelClientData->pChannelInitEventProc(pChannelClientData->pInitHandle, CHANNEL_EVENT_CONNECTED, hostname, hostnameLength); + error = pChannelClientData->pChannelInitEventProc(pChannelClientData->pInitHandle, + CHANNEL_EVENT_CONNECTED, hostname, hostnameLength); + if (error != CHANNEL_RC_OK) + goto fail; name = (char*) malloc(9); if (!name) @@ -272,7 +281,8 @@ int freerdp_channels_post_connect(rdpChannels* channels, freerdp* instance) channels->drdynvc->OnChannelDisconnected = freerdp_drdynvc_on_channel_disconnected; } - return 0; +fail: + return error; } int freerdp_channels_data(freerdp* instance, UINT16 channelId, BYTE* data, int dataSize, int flags, int totalSize) @@ -437,8 +447,9 @@ BOOL freerdp_channels_check_fds(rdpChannels* channels, freerdp* instance) return TRUE; } -int freerdp_channels_disconnect(rdpChannels* channels, freerdp* instance) +UINT freerdp_channels_disconnect(rdpChannels* channels, freerdp* instance) { + UINT error = CHANNEL_RC_OK; int index; char* name; CHANNEL_OPEN_DATA* pChannelOpenData; @@ -458,7 +469,11 @@ int freerdp_channels_disconnect(rdpChannels* channels, freerdp* instance) pChannelClientData = &channels->clientDataList[index]; if (pChannelClientData->pChannelInitEventProc) - pChannelClientData->pChannelInitEventProc(pChannelClientData->pInitHandle, CHANNEL_EVENT_DISCONNECTED, 0, 0); + error = pChannelClientData->pChannelInitEventProc( + pChannelClientData->pInitHandle, + CHANNEL_EVENT_DISCONNECTED, 0, 0); + if (error != CHANNEL_RC_OK) + goto fail; pChannelOpenData = &channels->openDataList[index]; @@ -476,7 +491,8 @@ int freerdp_channels_disconnect(rdpChannels* channels, freerdp* instance) free(name); } - return 0; +fail: + return error; } void freerdp_channels_close(rdpChannels* channels, freerdp* instance) diff --git a/libfreerdp/core/connection.c b/libfreerdp/core/connection.c index 99b2e59f3..f3a13f983 100644 --- a/libfreerdp/core/connection.c +++ b/libfreerdp/core/connection.c @@ -400,7 +400,7 @@ BOOL rdp_client_reconnect(rdpRdp* rdp) status = rdp_client_connect(rdp); if (status) - status = (freerdp_channels_post_connect(channels, context->instance) >= 0); + status = (freerdp_channels_post_connect(channels, context->instance) == CHANNEL_RC_OK); return status; } diff --git a/server/shadow/Win/win_rdp.c b/server/shadow/Win/win_rdp.c index b254f2aec..231996ed7 100644 --- a/server/shadow/Win/win_rdp.c +++ b/server/shadow/Win/win_rdp.c @@ -133,9 +133,11 @@ BOOL shw_pre_connect(freerdp* instance) PubSub_SubscribeChannelDisconnected(context->pubSub, (pChannelDisconnectedEventHandler) shw_OnChannelDisconnectedEventHandler); - freerdp_client_load_addins(context->channels, instance->settings); + if (!freerdp_client_load_addins(context->channels, instance->settings)) + return FALSE; - freerdp_channels_pre_connect(context->channels, instance); + if (freerdp_channels_pre_connect(context->channels, instance) != CHANNEL_RC_OK) + return FALSE; return TRUE; } @@ -159,7 +161,7 @@ BOOL shw_post_connect(freerdp* instance) instance->update->DesktopResize = shw_desktop_resize; instance->update->SurfaceFrameMarker = shw_surface_frame_marker; - return (freerdp_channels_post_connect(instance->context->channels, instance) >= 0) ; + return (freerdp_channels_post_connect(instance->context->channels, instance) == CHANNEL_RC_OK) ; } void* shw_client_thread(void* arg) diff --git a/server/shadow/shadow_channels.c b/server/shadow/shadow_channels.c index eaf787e34..bc90ab494 100644 --- a/server/shadow/shadow_channels.c +++ b/server/shadow/shadow_channels.c @@ -24,7 +24,7 @@ #include "shadow_channels.h" -int shadow_client_channels_post_connect(rdpShadowClient* client) +UINT shadow_client_channels_post_connect(rdpShadowClient* client) { if (WTSVirtualChannelManagerIsChannelJoined(client->vcm, ENCOMSP_SVC_CHANNEL_NAME)) { @@ -43,7 +43,7 @@ int shadow_client_channels_post_connect(rdpShadowClient* client) shadow_client_audin_init(client); - return 1; + return CHANNEL_RC_OK; } void shadow_client_channels_free(rdpShadowClient* client) diff --git a/server/shadow/shadow_channels.h b/server/shadow/shadow_channels.h index d6abef9c7..edba39cb7 100644 --- a/server/shadow/shadow_channels.h +++ b/server/shadow/shadow_channels.h @@ -33,7 +33,7 @@ extern "C" { #endif -int shadow_client_channels_post_connect(rdpShadowClient* client); +UINT shadow_client_channels_post_connect(rdpShadowClient* client); void shadow_client_channels_free(rdpShadowClient* client); #ifdef __cplusplus diff --git a/server/shadow/shadow_client.c b/server/shadow/shadow_client.c index 6c5d80bc3..9c48579ff 100644 --- a/server/shadow/shadow_client.c +++ b/server/shadow/shadow_client.c @@ -235,7 +235,8 @@ BOOL shadow_client_post_connect(freerdp_peer* peer) peer->update->DesktopResize(peer->update->context); - shadow_client_channels_post_connect(client); + if (shadow_client_channels_post_connect(client) != CHANNEL_RC_OK) + return FALSE; invalidRect.left = 0; invalidRect.top = 0; diff --git a/winpr/include/winpr/wtsapi.h b/winpr/include/winpr/wtsapi.h index 4b83c5e44..df11e57ae 100644 --- a/winpr/include/winpr/wtsapi.h +++ b/winpr/include/winpr/wtsapi.h @@ -116,7 +116,7 @@ typedef struct tagCHANNEL_PDU_HEADER #define VCEXPORT __export #endif -typedef VOID VCAPITYPE CHANNEL_INIT_EVENT_FN(LPVOID pInitHandle, +typedef UINT VCAPITYPE CHANNEL_INIT_EVENT_FN(LPVOID pInitHandle, UINT event, LPVOID pData, UINT dataLength); typedef CHANNEL_INIT_EVENT_FN *PCHANNEL_INIT_EVENT_FN;