[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