Rein Klazes : ddraw: Catch access violations when calling
DirectDrawEnumerateProc.
Alexandre Julliard
julliard at wine.codeweavers.com
Mon Dec 5 14:06:03 CST 2005
Module: wine
Branch: refs/heads/master
Commit: 72caaad6cc3a2eaebf884d751368f9768924c00f
URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=72caaad6cc3a2eaebf884d751368f9768924c00f
Author: Rein Klazes <wijn at 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 */
More information about the wine-cvs
mailing list