Commit 72caaad6 authored by Rein Klazes's avatar Rein Klazes Committed by Alexandre Julliard

ddraw: Catch access violations when calling DirectDrawEnumerateProc.

parent ae4eafbe
...@@ -4,7 +4,7 @@ SRCDIR = @srcdir@ ...@@ -4,7 +4,7 @@ SRCDIR = @srcdir@
VPATH = @srcdir@ VPATH = @srcdir@
MODULE = ddraw.dll MODULE = ddraw.dll
IMPORTLIB = libddraw.$(IMPLIBEXT) IMPORTLIB = libddraw.$(IMPLIBEXT)
IMPORTS = ole32 user32 gdi32 advapi32 kernel32 IMPORTS = ole32 user32 gdi32 advapi32 kernel32 ntdll
EXTRAINCL = @X_CFLAGS@ EXTRAINCL = @X_CFLAGS@
EXTRALIBS = -ldxguid -luuid @X_LIBS@ @X_PRE_LIBS@ @XLIB@ @X_EXTRA_LIBS@ EXTRALIBS = -ldxguid -luuid @X_LIBS@ @X_PRE_LIBS@ @XLIB@ @X_EXTRA_LIBS@
......
...@@ -39,6 +39,8 @@ ...@@ -39,6 +39,8 @@
#include "winnls.h" #include "winnls.h"
#include "winerror.h" #include "winerror.h"
#include "wingdi.h" #include "wingdi.h"
#include "wine/exception.h"
#include "excpt.h"
#include "ddraw.h" #include "ddraw.h"
#include "d3d.h" #include "d3d.h"
...@@ -62,6 +64,14 @@ void (*wine_tsx11_unlock_ptr)(void) = NULL; ...@@ -62,6 +64,14 @@ void (*wine_tsx11_unlock_ptr)(void) = NULL;
WINE_DEFAULT_DEBUG_CHANNEL(ddraw); 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 { typedef struct {
...@@ -180,6 +190,7 @@ HRESULT WINAPI DirectDrawEnumerateExA( ...@@ -180,6 +190,7 @@ HRESULT WINAPI DirectDrawEnumerateExA(
LPDDENUMCALLBACKEXA lpCallback, LPVOID lpContext, DWORD dwFlags) LPDDENUMCALLBACKEXA lpCallback, LPVOID lpContext, DWORD dwFlags)
{ {
int i; int i;
BOOL stop = FALSE;
TRACE("(%p,%p, %08lx)\n", lpCallback, lpContext, dwFlags); TRACE("(%p,%p, %08lx)\n", lpCallback, lpContext, dwFlags);
if (TRACE_ON(ddraw)) { if (TRACE_ON(ddraw)) {
...@@ -201,12 +212,21 @@ HRESULT WINAPI DirectDrawEnumerateExA( ...@@ -201,12 +212,21 @@ HRESULT WINAPI DirectDrawEnumerateExA(
/* We have to pass NULL from the primary display device. /* We have to pass NULL from the primary display device.
* RoadRage chapter 6's enumeration routine expects it. */ * RoadRage chapter 6's enumeration routine expects it. */
if (!lpCallback((DDRAW_default_driver == i) ? NULL __TRY
:(LPGUID)&DDRAW_drivers[i]->info->guidDeviceIdentifier, {
(LPSTR)DDRAW_drivers[i]->info->szDescription, if (!lpCallback((DDRAW_default_driver == i) ? NULL
(LPSTR)DDRAW_drivers[i]->info->szDriver, :(LPGUID)&DDRAW_drivers[i]->info->guidDeviceIdentifier,
lpContext, 0)) (LPSTR)DDRAW_drivers[i]->info->szDescription,
return DD_OK; (LPSTR)DDRAW_drivers[i]->info->szDriver,
lpContext, 0))
stop = TRUE;
}
__EXCEPT(page_fault)
{
return E_INVALIDARG;
}
__ENDTRY
if (stop) return DD_OK;
} }
/* Unsupported flags */ /* Unsupported flags */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment