[vlc-commits] win32: fallback for SetThreadErrorMode()
Rémi Denis-Courmont
git at videolan.org
Mon Jul 20 21:27:59 CEST 2015
vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Mon Jul 20 22:23:58 2015 +0300| [371dda7105972f94065e49c6145960a6d9134fb9] | committer: Rémi Denis-Courmont
win32: fallback for SetThreadErrorMode()
SetThreadErrorMode() is necessary for correct plugin loader semantics,
but it is only available on Windows 7 and later, so it needs to be
loaded at run-time if it is to be used. On Windows 2008 and older,
a fallback is provided to the extent possible.
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=371dda7105972f94065e49c6145960a6d9134fb9
---
src/win32/plugin.c | 37 +++++++++++++++++++++++++++++++++++--
1 file changed, 35 insertions(+), 2 deletions(-)
diff --git a/src/win32/plugin.c b/src/win32/plugin.c
index a9e0e6c..3024f3d 100644
--- a/src/win32/plugin.c
+++ b/src/win32/plugin.c
@@ -33,6 +33,39 @@
#include <windows.h>
#include <wchar.h>
+#if (_WIN32_WINNT < 0x601)
+static BOOL WINAPI SetThreadErrorModeFallback(DWORD mode, DWORD *oldmode)
+{
+ /* TODO: cache the pointer */
+ HANDLE h = GetModuleHandle(_T("kernel32.dll"));
+ if (unlikely(h == NULL))
+ return FALSE;
+
+ BOOL WINAPI (*SetThreadErrorModeReal)(DWORD, DWORD *);
+
+ SetThreadErrorModeReal = GetProcAddress(h, "SetThreadErrorMode");
+ if (SetThreadErrorModeReal != NULL)
+ return SetThreadErrorModeReal(mode, oldmode);
+
+# if (_WIN32_WINNT >= 0x600)
+ DWORD curmode = GetErrorMode();
+# else
+ UINT WINAPI (*GetErrorModeReal)(void);
+ DWORD curmode = 0;
+
+ GetErrorModeReal = (void *)GetProcAddress(h, "GetErrorMode");
+ if (GetErrorModeReal != NULL)
+ curmode = GetErrorModeReal();
+# endif
+ if ((mode & SEM_FAILCRITICALERRORS) != (curmode & SEM_FAILCRITICALERRORS))
+ return FALSE;
+ if (oldmode != NULL)
+ *oldmode = curmode;
+ return TRUE;
+}
+# define SetThreadErrorMode SetThreadErrorModeFallback
+#endif
+
static char *GetWindowsError( void )
{
wchar_t wmsg[256];
@@ -58,14 +91,14 @@ int module_Load( vlc_object_t *p_this, const char *psz_file,
return -1;
module_handle_t handle = NULL;
-#if (_WIN32_WINNT >= 0x601) && !VLC_WINSTORE_APP
+#if !VLC_WINSTORE_APP
DWORD mode;
if (SetThreadErrorMode (SEM_FAILCRITICALERRORS, &mode) != 0)
#endif
{
handle = LoadLibraryW (wfile);
-#if (_WIN32_WINNT >= 0x601) && !VLC_WINSTORE_APP
+#if !VLC_WINSTORE_APP
SetThreadErrorMode (mode, NULL);
#endif
}
More information about the vlc-commits
mailing list