[vlc-devel] [PATCH 1/2] [RFC] core: add a function to load a system shared library
Steve Lhomme
robux4 at gmail.com
Thu Mar 9 14:16:50 CET 2017
On Thu, Mar 9, 2017 at 1:49 PM, Hugo Beauzée-Luyssen <hugo at beauzee.fr> wrote:
> Hi,
>
> On Thu, Mar 9, 2017, at 11:50 AM, Steve Lhomme wrote:
>> it cannot be loaded from anywhere but the system
>> ---
>> include/vlc_modules.h | 13 ++++++++++++
>> src/libvlccore.sym | 1 +
>> src/missing.c | 7 +++++++
>> src/network/udp.c | 3 ++-
>> src/text/url.c | 2 +-
>> src/win32/plugin.c | 57
>> +++++++++++++++++++++++++++++++++++++++++++++++++++
>> 6 files changed, 81 insertions(+), 2 deletions(-)
>>
>> diff --git a/include/vlc_modules.h b/include/vlc_modules.h
>> index 7f45217969..ec5c69c36a 100644
>> --- a/include/vlc_modules.h
>> +++ b/include/vlc_modules.h
>> @@ -65,6 +65,19 @@ VLC_API const char * module_get_capability( const
>> module_t *m ) VLC_USED;
>> VLC_API int module_get_score( const module_t *m ) VLC_USED;
>> VLC_API const char * module_gettext( const module_t *, const char * )
>> VLC_USED;
>>
>> +#ifdef _WIN32
>> +typedef HMODULE vlc_lib_handle_t;
>> +#else
>> +typedef void *vlc_lib_handle_t;
>> +#endif
>> +
>> +/**
>> + * Load a system library (DLL) in memory.
>> + *
>> + * @param libname the name of system library to load.
>> + */
>> +VLC_API vlc_lib_handle_t vlc_load_syslib(const char *libname);
>> +
>> VLC_USED static inline module_t *module_get_main (void)
>> {
>> return module_find ("core");
>> diff --git a/src/libvlccore.sym b/src/libvlccore.sym
>> index 57c83495a3..1c0e6ee0a3 100644
>> --- a/src/libvlccore.sym
>> +++ b/src/libvlccore.sym
>> @@ -462,6 +462,7 @@ us_vasprintf
>> vlc_close
>> vlc_fopen
>> utf8_fprintf
>> +vlc_load_syslib
>> vlc_loaddir
>> vlc_lstat
>> vlc_mkdir
>> diff --git a/src/missing.c b/src/missing.c
>> index c76e99a4bc..99670c8e95 100644
>> --- a/src/missing.c
>> +++ b/src/missing.c
>> @@ -442,3 +442,10 @@ update_release_t *update_GetRelease(update_t *u)
>> vlc_assert_unreachable();
>> }
>> #endif /* !UPDATE_CHECK */
>> +
>> +#ifndef _WIN32
>> +void *vlc_load_syslib(const char *libname)
>> +{
>> + return NULL;
>> +}
>> +#endif
>> diff --git a/src/network/udp.c b/src/network/udp.c
>> index d098fb1425..bf3dc2266a 100644
>> --- a/src/network/udp.c
>> +++ b/src/network/udp.c
>> @@ -36,6 +36,7 @@
>> #include <errno.h>
>> #include <assert.h>
>>
>> +#include <vlc_modules.h>
>> #include <vlc_network.h>
>>
>> #ifdef _WIN32
>> @@ -105,7 +106,7 @@ static int net_SetupDgramSocket (vlc_object_t *p_obj,
>> int fd,
>> * receive buffer if that isn't present
>> */
>> #if (_WIN32_WINNT < _WIN32_WINNT_WIN8)
>> - HINSTANCE h_Network = LoadLibrary(TEXT("Windows.Networking.dll"));
>> + HMODULE h_Network = vlc_load_syslib("Windows.Networking.dll");
>> if( (h_Network == NULL) ||
>> (GetProcAddress( h_Network, "SetSocketMediaStreamingMode" ) ==
>> NULL ) )
>> {
>> diff --git a/src/text/url.c b/src/text/url.c
>> index 1b602b599e..682ea9665d 100644
>> --- a/src/text/url.c
>> +++ b/src/text/url.c
>> @@ -837,7 +837,7 @@ char *vlc_uri_fixup(const char *str)
>> # define IDN_ALLOW_UNASSIGNED 0x01
>> static int IdnToAscii(DWORD flags, LPCWSTR str, int len, LPWSTR buf, int
>> size)
>> {
>> - HMODULE h = LoadLibrary(_T("Normaliz.dll"));
>> + HMODULE h = vlc_load_syslib("Normaliz.dll");
>> if (h == NULL)
>> {
>> errno = ENOSYS;
>> diff --git a/src/win32/plugin.c b/src/win32/plugin.c
>> index 1a65521fca..6bade68fbc 100644
>> --- a/src/win32/plugin.c
>> +++ b/src/win32/plugin.c
>> @@ -29,6 +29,7 @@
>>
>> #include <vlc_common.h>
>> #include <vlc_charset.h>
>> +#include <vlc_modules.h>
>> #include "modules/modules.h"
>> #include <windows.h>
>> #include <wchar.h>
>> @@ -133,3 +134,59 @@ void *module_Lookup( module_handle_t handle, const
>> char *psz_function )
>> {
>> return (void *)GetProcAddress( handle, (char *)psz_function );
>> }
>> +
>> +HMODULE vlc_load_syslib(const char *libname)
>> +{
>> + HMODULE module;
>> + bool has_KB2533623 = true;
>> + TCHAR *tlibname;
>> +#if (_WIN32_WINNT < _WIN32_WINNT_WIN8)
>> + /* check for KB2533623 */
>> + if (GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")),
>> + "SetDefaultDllDirectories") ==
>> NULL)
>> + has_KB2533623 = false;
>> +#endif
>> +
>> +#ifdef UNICODE
>> + tlibname = ToWide(libname);
>
> The library name is always hardcoded, shouldn't we use wchar_t directly
> (assuming we don't care about unicode not being defined) or could we try
> to replicate the A/W system for this call?
The API of libvlccore may be used on other systems where they only use
chars for library name. Otherwise yes, the API would be easier with a
wchar.
>> + if (unlikely(tlibname==NULL))
>> + return NULL;
>> +#else
>> + tlibname = libname;
>> +#endif
>> +
>> + if (false && has_KB2533623)
>
> Left over debug?
Yes, that was for testing.
>> + module = LoadLibraryEx(tlibname, NULL,
>> LOAD_LIBRARY_SEARCH_SYSTEM32);
>> + else
>> + {
>> + /* force the path of the DLL inside system32 */
>> + DWORD systemLen = GetSystemDirectory(NULL, 0);
>> + if (systemLen) {
>> + systemLen += 1 + _tcslen(tlibname);
>> + TCHAR *sysdir = malloc(systemLen * sizeof(*sysdir));
>> + if (likely(sysdir!=NULL)) {
>> + if (GetSystemDirectory(sysdir, systemLen)) {
>> + _tcsncat(sysdir, _T("\\"), systemLen);
>> + _tcsncat(sysdir, tlibname, systemLen);
>> +
>> +#ifdef UNICODE
>> + free(tlibname);
>> +#endif
>> + tlibname = sysdir;
>> + }
>> + }
>> + }
>> +
>> + module = LoadLibrary(tlibname);
>> +
>> + if ((const char*)tlibname != libname) {
>> + free(tlibname);
>> + tlibname = NULL; /* no double free on unicode */
>> + }
>> + }
>> +
>> +#ifdef UNICODE
>> + free(tlibname);
>> +#endif
>> + return module;
>> +}
>> --
>> 2.11.1
>>
>> _______________________________________________
>> vlc-devel mailing list
>> To unsubscribe or modify your subscription options:
>> https://mailman.videolan.org/listinfo/vlc-devel
>
>
> --
> Hugo Beauzée-Luyssen
> hugo at beauzee.fr
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> https://mailman.videolan.org/listinfo/vlc-devel
More information about the vlc-devel
mailing list