diff --git a/channels/client/CMakeLists.txt b/channels/client/CMakeLists.txt index a5ccabba7..21b311747 100644 --- a/channels/client/CMakeLists.txt +++ b/channels/client/CMakeLists.txt @@ -72,7 +72,7 @@ foreach(STATIC_MODULE ${CHANNEL_STATIC_CLIENT_MODULES}) set(SUBSYSTEM_IMPORT "extern void ${STATIC_SUBSYSTEM_ENTRY}();") set(CLIENT_STATIC_SUBSYSTEM_IMPORTS "${CLIENT_STATIC_SUBSYSTEM_IMPORTS}\n${SUBSYSTEM_IMPORT}") endforeach() - set(SUBSYSTEM_TABLE "${SUBSYSTEM_TABLE}\n\t{ \"\", \"\", NULL }\n};") + set(SUBSYSTEM_TABLE "${SUBSYSTEM_TABLE}\n\t{ NULL, NULL, NULL }\n};") set(CLIENT_STATIC_SUBSYSTEM_TABLES "${CLIENT_STATIC_SUBSYSTEM_TABLES}\n${SUBSYSTEM_TABLE}") set(ENTRY_POINT_NAME "${STATIC_MODULE_CHANNEL}_${${STATIC_MODULE}_CLIENT_ENTRY}") set(CLIENT_STATIC_ADDIN_TABLE "${CLIENT_STATIC_ADDIN_TABLE}\n\t{ \"${STATIC_MODULE_CHANNEL}\", ${ENTRY_POINT_NAME}, ${SUBSYSTEM_TABLE_NAME} },") diff --git a/channels/client/channels.c b/channels/client/channels.c index c52dd5ab6..e4d0433c6 100644 --- a/channels/client/channels.c +++ b/channels/client/channels.c @@ -189,6 +189,8 @@ FREERDP_ADDIN** freerdp_channels_list_client_static_addins(LPSTR lpName, LPSTR l } } + ppAddins[nAddins] = NULL; + return ppAddins; } @@ -360,8 +362,43 @@ void freerdp_channels_addin_list_free(FREERDP_ADDIN** ppAddins) free(ppAddins); } -void* freerdp_channels_load_dynamic_addin_entry(LPSTR lpName, LPSTR lpSubsystem, LPSTR lpType, DWORD dwFlags) +void* freerdp_channels_load_static_addin_entry(LPCSTR lpName, LPSTR lpSubsystem, LPSTR lpType, DWORD dwFlags) { + int i, j; + STATIC_SUBSYSTEM_ENTRY* subsystems; + + for (i = 0; CLIENT_STATIC_ADDIN_TABLE[i].name != NULL; i++) + { + if ((lpSubsystem == NULL) && (lpType == NULL)) + { + return (void*) CLIENT_STATIC_ADDIN_TABLE[i].entry; + } + + subsystems = (STATIC_SUBSYSTEM_ENTRY*) CLIENT_STATIC_ADDIN_TABLE[i].table; + + for (j = 0; subsystems[j].name != NULL; j++) + { + if (strcmp(subsystems[j].name, lpSubsystem) == 0) + { + if (lpType) + { + if (strcmp(subsystems[j].type, lpType) == 0) + return (void*) subsystems[j].entry; + } + else + { + return (void*) subsystems[j].entry; + } + } + } + } + + return NULL; +} + +void* freerdp_channels_load_dynamic_addin_entry(LPCSTR lpName, LPSTR lpSubsystem, LPSTR lpType, DWORD dwFlags) +{ + void* entry; LPSTR lpFileName; LPSTR lpFilePath; size_t cchFileName; @@ -412,57 +449,47 @@ void* freerdp_channels_load_dynamic_addin_entry(LPSTR lpName, LPSTR lpSubsystem, NativePathCchAppendA(lpFilePath, cchFilePath + 1, lpFileName); cchFilePath = strlen(lpFilePath); - printf("lpFilePath: %s\n", lpFilePath); - library = LoadLibraryA(lpFilePath); if (!library) - printf("failed to load library\n"); + return NULL; - return NULL; -} - -void* freerdp_channels_load_static_addin_entry(LPSTR lpName, LPSTR lpSubsystem, LPSTR lpType, DWORD dwFlags) -{ - int i, j; - STATIC_SUBSYSTEM_ENTRY* subsystems; - - for (i = 0; CLIENT_STATIC_ADDIN_TABLE[i].name != NULL; i++) + if (lpSubsystem) { - if ((lpSubsystem == NULL) && (lpType == NULL)) - { - return (void*) CLIENT_STATIC_ADDIN_TABLE[i].entry; - } + LPSTR lpEntryName; + size_t cchEntryName; - subsystems = (STATIC_SUBSYSTEM_ENTRY*) CLIENT_STATIC_ADDIN_TABLE[i].table; + /* subsystem add-in */ - for (j = 0; subsystems[j].name != NULL; j++) - { - if (strcmp(subsystems[j].name, lpSubsystem) == 0) - { - if (lpType) - { - if (strcmp(subsystems[j].type, lpType) == 0) - return (void*) subsystems[j].entry; - } - else - { - return (void*) subsystems[j].entry; - } - } - } + cchEntryName = 64 + strlen(lpName); + lpEntryName = (LPSTR) malloc(cchEntryName + 1); + sprintf_s(lpEntryName, cchEntryName + 1, "freerdp_%s_client_subsystem_entry", lpName); + + entry = GetProcAddress(library, lpEntryName); + + if (entry) + return entry; + } + else + { + /* channel add-in */ + + entry = GetProcAddress(library, lpType); + + if (entry) + return entry; } return NULL; } -void* freerdp_channels_load_addin_entry(LPSTR lpName, LPSTR lpSubsystem, LPSTR lpType, DWORD dwFlags) +void* freerdp_channels_load_addin_entry(LPCSTR lpName, LPSTR lpSubsystem, LPSTR lpType, DWORD dwFlags) { void* entry = NULL; entry = freerdp_channels_load_static_addin_entry(lpName, lpSubsystem, lpType, dwFlags); - if (entry) + if (!entry) entry = freerdp_channels_load_dynamic_addin_entry(lpName, lpSubsystem, lpType, dwFlags); return entry; diff --git a/client/common/test/TestClientChannels.c b/client/common/test/TestClientChannels.c index a95de68e5..3793879fe 100644 --- a/client/common/test/TestClientChannels.c +++ b/client/common/test/TestClientChannels.c @@ -54,7 +54,6 @@ int TestClientChannels(int argc, char* argv[]) freerdp_channels_addin_list_free(ppAddins); - printf("Enumerate unknown\n"); ppAddins = freerdp_channels_list_client_addins("unknown", NULL, NULL, dwFlags); for (index = 0; ppAddins[index] != NULL; index++) @@ -67,8 +66,10 @@ int TestClientChannels(int argc, char* argv[]) freerdp_channels_addin_list_free(ppAddins); + printf("Enumerate static addins\n"); + dwFlags = FREERDP_ADDIN_STATIC; - freerdp_channels_list_client_addins(NULL, NULL, NULL, dwFlags); + ppAddins = freerdp_channels_list_client_addins(NULL, NULL, NULL, dwFlags); for (index = 0; ppAddins[index] != NULL; index++) { @@ -80,9 +81,9 @@ int TestClientChannels(int argc, char* argv[]) freerdp_channels_addin_list_free(ppAddins); - dwFlags = FREERDP_ADDIN_STATIC; + dwFlags = FREERDP_ADDIN_DYNAMIC; - entry = freerdp_channels_load_addin_entry("drive", NULL, NULL, dwFlags); + entry = freerdp_channels_load_addin_entry("drive", NULL, "DeviceServiceEntry", dwFlags); printf("drive entry: %s\n", entry ? "non-null" : "null"); diff --git a/include/freerdp/client/channels.h b/include/freerdp/client/channels.h index d5dcaff81..6be6160db 100644 --- a/include/freerdp/client/channels.h +++ b/include/freerdp/client/channels.h @@ -49,7 +49,7 @@ FREERDP_API void* freerdp_channels_client_find_entry(const char* name, const cha FREERDP_API FREERDP_ADDIN** freerdp_channels_list_client_addins(LPSTR lpName, LPSTR lpSubsystem, LPSTR lpType, DWORD dwFlags); FREERDP_API void freerdp_channels_addin_list_free(FREERDP_ADDIN** ppAddins); -FREERDP_API void* freerdp_channels_load_addin_entry(LPSTR lpName, LPSTR lpSubsystem, LPSTR lpType, DWORD dwFlags); +FREERDP_API void* freerdp_channels_load_addin_entry(LPCSTR lpName, LPSTR lpSubsystem, LPSTR lpType, DWORD dwFlags); #endif /* FREERDP_CHANNELS_CLIENT */