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

Rémi Denis-Courmont remi at remlab.net
Thu Mar 9 16:14:36 CET 2017


On March 9, 2017 12:50:14 PM GMT+02:00, Steve Lhomme <robux4 at videolabs.io> 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);
>+    if (unlikely(tlibname==NULL))
>+        return NULL;
>+#else
>+    tlibname = libname;
>+#endif
>+
>+    if (false && has_KB2533623)
>+        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

This looks rather out of place as it is too platform specific.
-- 
Rémi Denis-Courmont


More information about the vlc-devel mailing list