[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 17:19:25 CET 2017
On March 9, 2017 5:55:34 PM GMT+02:00, Steve Lhomme <robux4 at gmail.com> wrote:
>On Thu, Mar 9, 2017 at 4:14 PM, Rémi Denis-Courmont <remi at remlab.net>
>wrote:
>> 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.
>
>It would be used multiple times in the core and in many modules. Also
>it might be useful on other OSes too. For example it may be possible
>to hack an OS X .app bundle by adding fake system shared libraries in
>it.
>
>> --
>> Rémi Denis-Courmont
>> _______________________________________________
>> vlc-devel mailing list
>> To unsubscribe or modify your subscription options:
>> https://mailman.videolan.org/listinfo/vlc-devel
>_______________________________________________
>vlc-devel mailing list
>To unsubscribe or modify your subscription options:
>https://mailman.videolan.org/listinfo/vlc-devel
Exactly which platform-independent code path can actually use that in generic way?? How do you deal with platform-specific flags, platform-specific file names, platform-specific call ABIs and platform-specific directories?
Sorry but I will believe that answer when I will see it working.
--
Rémi Denis-Courmont
More information about the vlc-devel
mailing list