From 8c5a2928ed0b168c12a4dc76c0885fd3dd3f8803 Mon Sep 17 00:00:00 2001 From: Magnus Olsen Date: Thu, 7 Jun 2007 01:27:38 +0000 Subject: [PATCH] adding more seh, everthing need warp around seh in ddraw. svn path=/trunk/; revision=27032 --- .../directx/ddraw/Ddraw/ddraw_displaymode.c | 130 ++++++++++-------- reactos/dll/directx/ddraw/Ddraw/ddraw_main.c | 11 +- 2 files changed, 82 insertions(+), 59 deletions(-) diff --git a/reactos/dll/directx/ddraw/Ddraw/ddraw_displaymode.c b/reactos/dll/directx/ddraw/Ddraw/ddraw_displaymode.c index 4d94b3d9319..4514826e46c 100644 --- a/reactos/dll/directx/ddraw/Ddraw/ddraw_displaymode.c +++ b/reactos/dll/directx/ddraw/Ddraw/ddraw_displaymode.c @@ -4,84 +4,100 @@ * PROJECT: ReactOS DirectX * FILE: ddraw/ddraw/ddraw_displaymode.c * PURPOSE: IDirectDraw7 Implementation - * PROGRAMMER: Maarten Bosma + * PROGRAMMER: Maarten Bosma, Magnus Olsen (add seh support) * */ #include "rosdraw.h" +/* PSEH for SEH Support */ +#include + HRESULT WINAPI Main_DirectDraw_EnumDisplayModes(LPDIRECTDRAW7 iface, DWORD dwFlags, LPDDSURFACEDESC2 pDDSD, LPVOID pContext, LPDDENUMMODESCALLBACK2 pCallback) { + HRESULT ret = DD_OK; LPDDRAWI_DIRECTDRAW_INT This = (LPDDRAWI_DIRECTDRAW_INT)iface; INT iMode = 0; DEVMODE DevMode; DX_WINDBG_trace(); - if(!pCallback) - return DDERR_INVALIDPARAMS; - - DevMode.dmSize = sizeof(DEVMODE); - DevMode.dmDriverExtra = 0; - - while (EnumDisplaySettingsEx(NULL, iMode, &DevMode, 0) == TRUE) + _SEH_TRY { - DDSURFACEDESC2 SurfaceDesc; - - iMode++; - - SurfaceDesc.dwSize = sizeof (DDSURFACEDESC2); - SurfaceDesc.dwFlags = DDSD_HEIGHT | DDSD_WIDTH | DDSD_REFRESHRATE | DDSD_WIDTH | DDSD_PIXELFORMAT; - SurfaceDesc.dwHeight = DevMode.dmPelsHeight; - SurfaceDesc.dwWidth = DevMode.dmPelsWidth; - SurfaceDesc.lPitch = DevMode.dmPelsWidth * DevMode.dmBitsPerPel / 8; - SurfaceDesc.dwRefreshRate = DevMode.dmDisplayFrequency; - - SurfaceDesc.ddpfPixelFormat.dwSize = sizeof (DDPIXELFORMAT); - SurfaceDesc.ddpfPixelFormat.dwFlags = DDPF_RGB; - // FIXME: get these -/* - SurfaceDesc.ddpfPixelFormat.dwRBitMask = - SurfaceDesc.ddpfPixelFormat.dwGBitMask = - SurfaceDesc.ddpfPixelFormat.dwBBitMask = - SurfaceDesc.ddpfPixelFormat.dwRGBAlphaBitMask = -*/ - SurfaceDesc.ddpfPixelFormat.dwRGBBitCount = DevMode.dmBitsPerPel; - - // FIXME1: This->lpLcl->lpGbl->dwMonitorFrequency is not set ! - if(dwFlags & DDEDM_REFRESHRATES && SurfaceDesc.dwRefreshRate != This->lpLcl->lpGbl->dwMonitorFrequency) + if(!pCallback) { - //continue; // FIXME2: what is SurfaceDesc.dwRefreshRate supposed to be set to ? + ret = DDERR_INVALIDPARAMS; + } + else + { + + DevMode.dmSize = sizeof(DEVMODE); + DevMode.dmDriverExtra = 0; + + while (EnumDisplaySettingsEx(NULL, iMode, &DevMode, 0) == TRUE) + { + DDSURFACEDESC2 SurfaceDesc; + + iMode++; + + SurfaceDesc.dwSize = sizeof (DDSURFACEDESC2); + SurfaceDesc.dwFlags = DDSD_HEIGHT | DDSD_WIDTH | DDSD_REFRESHRATE | DDSD_WIDTH | DDSD_PIXELFORMAT; + SurfaceDesc.dwHeight = DevMode.dmPelsHeight; + SurfaceDesc.dwWidth = DevMode.dmPelsWidth; + SurfaceDesc.lPitch = DevMode.dmPelsWidth * DevMode.dmBitsPerPel / 8; + SurfaceDesc.dwRefreshRate = DevMode.dmDisplayFrequency; + + SurfaceDesc.ddpfPixelFormat.dwSize = sizeof (DDPIXELFORMAT); + SurfaceDesc.ddpfPixelFormat.dwFlags = DDPF_RGB; + // FIXME: get these + /* + SurfaceDesc.ddpfPixelFormat.dwRBitMask = + SurfaceDesc.ddpfPixelFormat.dwGBitMask = + SurfaceDesc.ddpfPixelFormat.dwBBitMask = + SurfaceDesc.ddpfPixelFormat.dwRGBAlphaBitMask = + */ + SurfaceDesc.ddpfPixelFormat.dwRGBBitCount = DevMode.dmBitsPerPel; + + // FIXME1: This->lpLcl->lpGbl->dwMonitorFrequency is not set ! + if(dwFlags & DDEDM_REFRESHRATES && SurfaceDesc.dwRefreshRate != This->lpLcl->lpGbl->dwMonitorFrequency) + { + //continue; // FIXME2: what is SurfaceDesc.dwRefreshRate supposed to be set to ? + } + + // FIXME: Take case when DDEDM_STANDARDVGAMODES flag is not set in account + + if(pDDSD) + { + if(pDDSD->dwFlags & DDSD_HEIGHT && pDDSD->dwHeight != SurfaceDesc.dwHeight) + continue; + + else if(pDDSD->dwFlags & DDSD_WIDTH && pDDSD->dwWidth != SurfaceDesc.dwWidth) + continue; + + else if(pDDSD->dwFlags & DDSD_PITCH && pDDSD->lPitch != SurfaceDesc.lPitch) + continue; + + else if(pDDSD->dwFlags & DDSD_REFRESHRATE && pDDSD->dwRefreshRate != SurfaceDesc.dwRefreshRate) + continue; + + else if(pDDSD->dwFlags & DDSD_PIXELFORMAT && pDDSD->ddpfPixelFormat.dwRGBBitCount != SurfaceDesc.ddpfPixelFormat.dwRGBBitCount) + continue; // FIXME: test for the other members of ddpfPixelFormat as well + } + + if((*pCallback)(&SurfaceDesc, pContext) == DDENUMRET_CANCEL) + break; + } } - // FIXME: Take case when DDEDM_STANDARDVGAMODES flag is not set in account - - if(pDDSD) - { - if(pDDSD->dwFlags & DDSD_HEIGHT && pDDSD->dwHeight != SurfaceDesc.dwHeight) - continue; - - else if(pDDSD->dwFlags & DDSD_WIDTH && pDDSD->dwWidth != SurfaceDesc.dwWidth) - continue; - - else if(pDDSD->dwFlags & DDSD_PITCH && pDDSD->lPitch != SurfaceDesc.lPitch) - continue; - - else if(pDDSD->dwFlags & DDSD_REFRESHRATE && pDDSD->dwRefreshRate != SurfaceDesc.dwRefreshRate) - continue; - - else if(pDDSD->dwFlags & DDSD_PIXELFORMAT && pDDSD->ddpfPixelFormat.dwRGBBitCount != SurfaceDesc.ddpfPixelFormat.dwRGBBitCount) - continue; // FIXME: test for the other members of ddpfPixelFormat as well - } - - if((*pCallback)(&SurfaceDesc, pContext) == DDENUMRET_CANCEL) - return DD_OK; } - - return DD_OK; + _SEH_HANDLE + { + } + _SEH_END; + return ret; } HRESULT WINAPI diff --git a/reactos/dll/directx/ddraw/Ddraw/ddraw_main.c b/reactos/dll/directx/ddraw/Ddraw/ddraw_main.c index e2e268817aa..2366074412a 100644 --- a/reactos/dll/directx/ddraw/Ddraw/ddraw_main.c +++ b/reactos/dll/directx/ddraw/Ddraw/ddraw_main.c @@ -137,10 +137,17 @@ Main_DirectDraw_Compact(LPDIRECTDRAW7 iface) DX_WINDBG_trace(); // EnterCriticalSection(&ddcs); - if (This->lpLcl->lpGbl->lpExclusiveOwner == This->lpLcl) + _SEH_TRY { - retVal = DDERR_NOEXCLUSIVEMODE; + if (This->lpLcl->lpGbl->lpExclusiveOwner == This->lpLcl) + { + retVal = DDERR_NOEXCLUSIVEMODE; + } } + _SEH_HANDLE + { + } + _SEH_END; // LeaveCriticalSection(&ddcs); return retVal; }