[vlc-devel] [PATCH 1/2] [RFC] core: add a function to load a system shared library

Hugo Beauzée-Luyssen hugo at beauzee.fr
Thu Mar 9 13:49:58 CET 2017


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?

> +    if (unlikely(tlibname==NULL))
> +        return NULL;
> +#else
> +    tlibname = libname;
> +#endif
> +
> +    if (false && has_KB2533623)

Left over debug?

> +        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


More information about the vlc-devel mailing list