Module: wine Branch: refs/heads/master Commit: 72caaad6cc3a2eaebf884d751368f9768924c00f URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=72caaad6cc3a2eaebf884d75...
Author: Rein Klazes wijn@wanadoo.nl Date: Mon Dec 5 20:40:42 2005 +0100
ddraw: Catch access violations when calling DirectDrawEnumerateProc.
---
dlls/ddraw/Makefile.in | 2 +- dlls/ddraw/main.c | 32 ++++++++++++++++++++++++++------ 2 files changed, 27 insertions(+), 7 deletions(-)
diff --git a/dlls/ddraw/Makefile.in b/dlls/ddraw/Makefile.in index 361d0d0..88a7ff4 100644 --- a/dlls/ddraw/Makefile.in +++ b/dlls/ddraw/Makefile.in @@ -4,7 +4,7 @@ SRCDIR = @srcdir@ VPATH = @srcdir@ MODULE = ddraw.dll IMPORTLIB = libddraw.$(IMPLIBEXT) -IMPORTS = ole32 user32 gdi32 advapi32 kernel32 +IMPORTS = ole32 user32 gdi32 advapi32 kernel32 ntdll EXTRAINCL = @X_CFLAGS@ EXTRALIBS = -ldxguid -luuid @X_LIBS@ @X_PRE_LIBS@ @XLIB@ @X_EXTRA_LIBS@
diff --git a/dlls/ddraw/main.c b/dlls/ddraw/main.c index e2912b6..25c3e05 100644 --- a/dlls/ddraw/main.c +++ b/dlls/ddraw/main.c @@ -39,6 +39,8 @@ #include "winnls.h" #include "winerror.h" #include "wingdi.h" +#include "wine/exception.h" +#include "excpt.h"
#include "ddraw.h" #include "d3d.h" @@ -62,6 +64,14 @@ void (*wine_tsx11_unlock_ptr)(void) = NU
WINE_DEFAULT_DEBUG_CHANNEL(ddraw);
+/* filter for page-fault exceptions */ +static WINE_EXCEPTION_FILTER(page_fault) +{ + if (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION) + return EXCEPTION_EXECUTE_HANDLER; + return EXCEPTION_CONTINUE_SEARCH; +} + /**********************************************************************/
typedef struct { @@ -180,6 +190,7 @@ HRESULT WINAPI DirectDrawEnumerateExA( LPDDENUMCALLBACKEXA lpCallback, LPVOID lpContext, DWORD dwFlags) { int i; + BOOL stop = FALSE; TRACE("(%p,%p, %08lx)\n", lpCallback, lpContext, dwFlags);
if (TRACE_ON(ddraw)) { @@ -201,12 +212,21 @@ HRESULT WINAPI DirectDrawEnumerateExA(
/* We have to pass NULL from the primary display device. * RoadRage chapter 6's enumeration routine expects it. */ - if (!lpCallback((DDRAW_default_driver == i) ? NULL - :(LPGUID)&DDRAW_drivers[i]->info->guidDeviceIdentifier, - (LPSTR)DDRAW_drivers[i]->info->szDescription, - (LPSTR)DDRAW_drivers[i]->info->szDriver, - lpContext, 0)) - return DD_OK; + __TRY + { + if (!lpCallback((DDRAW_default_driver == i) ? NULL + :(LPGUID)&DDRAW_drivers[i]->info->guidDeviceIdentifier, + (LPSTR)DDRAW_drivers[i]->info->szDescription, + (LPSTR)DDRAW_drivers[i]->info->szDriver, + lpContext, 0)) + stop = TRUE; + } + __EXCEPT(page_fault) + { + return E_INVALIDARG; + } + __ENDTRY + if (stop) return DD_OK; }
/* Unsupported flags */