From 72caaad6cc3a2eaebf884d751368f9768924c00f Mon Sep 17 00:00:00 2001 From: Rein Klazes Date: Mon, 5 Dec 2005 20:40:42 +0100 Subject: [PATCH] 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 361d0d07f8..88a7ff4c95 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 e2912b660d..25c3e05cc2 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) = NULL; 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 */ -- 2.32.0.93.g670b81a890