mirror of
https://github.com/morgan9e/FreeRDP
synced 2026-04-14 00:14:11 +09:00
libfreerdp-client: added loading of dynamic add-ins
This commit is contained in:
@@ -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} },")
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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");
|
||||
|
||||
|
||||
@@ -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 */
|
||||
|
||||
|
||||
Reference in New Issue
Block a user