[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