]> git.sesse.net Git - vlc/blob - src/win32/plugin.c
udp: fix locking (fixes #14234) and cancellation
[vlc] / src / win32 / plugin.c
1 /*****************************************************************************
2  * plugin.c : Low-level dynamic library handling
3  *****************************************************************************
4  * Copyright (C) 2001-2011 VLC authors and VideoLAN
5  *
6  * Authors: Sam Hocevar <sam@zoy.org>
7  *          Ethan C. Baldridge <BaldridgeE@cadmus.com>
8  *          Hans-Peter Jansen <hpj@urpla.net>
9  *          Gildas Bazin <gbazin@videolan.org>
10  *
11  * This program is free software; you can redistribute it and/or modify it
12  * under the terms of the GNU Lesser General Public License as published by
13  * the Free Software Foundation; either version 2.1 of the License, or
14  * (at your option) any later version.
15  *
16  * This program is distributed in the hope that it will be useful,
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19  * GNU Lesser General Public License for more details.
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * along with this program; if not, write to the Free Software Foundation,
23  * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
24  *****************************************************************************/
25
26 #ifdef HAVE_CONFIG_H
27 # include "config.h"
28 #endif
29
30 #include <vlc_common.h>
31 #include <vlc_charset.h>
32 #include "modules/modules.h"
33 #include <windows.h>
34 #include <wchar.h>
35
36 static char *GetWindowsError( void )
37 {
38     wchar_t wmsg[256];
39     int i = 0, i_error = GetLastError();
40
41     FormatMessageW( FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
42                     NULL, i_error, MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT),
43                     wmsg, 256, NULL );
44
45     /* Go to the end of the string */
46     while( !wmemchr( L"\r\n\0", wmsg[i], 3 ) )
47         i++;
48
49     snwprintf( wmsg + i, 256 - i, L" (error %i)", i_error );
50     return FromWide( wmsg );
51 }
52
53 int module_Load( vlc_object_t *p_this, const char *psz_file,
54                  module_handle_t *p_handle, bool lazy )
55 {
56     wchar_t *wfile = ToWide (psz_file);
57     if (wfile == NULL)
58         return -1;
59
60     module_handle_t handle = NULL;
61 #if (_WIN32_WINNT >= 0x601) && !VLC_WINSTORE_APP
62     DWORD mode;
63
64     if (SetThreadErrorMode (SEM_FAILCRITICALERRORS, &mode) == 0)
65 #endif
66     {
67         handle = LoadLibraryW (wfile);
68 #if (_WIN32_WINNT >= 0x601) && !VLC_WINSTORE_APP
69         SetThreadErrorMode (mode, NULL);
70 #endif
71     }
72     free (wfile);
73
74     if( handle == NULL )
75     {
76         char *psz_err = GetWindowsError();
77         msg_Warn( p_this, "cannot load module `%s' (%s)", psz_file, psz_err );
78         free( psz_err );
79         return -1;
80     }
81
82     *p_handle = handle;
83     (void) lazy;
84     return 0;
85 }
86
87 void module_Unload( module_handle_t handle )
88 {
89     FreeLibrary( handle );
90 }
91
92 void *module_Lookup( module_handle_t handle, const char *psz_function )
93 {
94     return (void *)GetProcAddress( handle, (char *)psz_function );
95 }