From 8ef0a1282d4db721e925bded26ed63a190dd130f Mon Sep 17 00:00:00 2001 From: Magnus Olsen Date: Sun, 4 May 2008 14:31:20 +0000 Subject: [PATCH] Speed optimize NtUserEnumDisplaySettings bit by remove COPY_DEVMODE_VALUE_TO_CALLER macro and using SEH directly svn path=/trunk/; revision=33270 --- .../subsystems/win32/win32k/ntuser/windc.c | 35 ++++++++++--------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/reactos/subsystems/win32/win32k/ntuser/windc.c b/reactos/subsystems/win32/win32k/ntuser/windc.c index 6ed9ed99481..6099bd6367f 100644 --- a/reactos/subsystems/win32/win32k/ntuser/windc.c +++ b/reactos/subsystems/win32/win32k/ntuser/windc.c @@ -890,15 +890,6 @@ NtUserGetDC(HWND hWnd) return NtUserGetDCEx(hWnd, NULL, NULL == hWnd ? DCX_CACHE | DCX_WINDOW : DCX_USESTYLE); } -#define COPY_DEVMODE_VALUE_TO_CALLER(dst, src, member) \ - Status = MmCopyToCaller(&(dst)->member, &(src)->member, sizeof ((src)->member)); \ - if (!NT_SUCCESS(Status)) \ - { \ - SetLastNtError(Status); \ - ExFreePool(src); \ - return FALSE; \ - } - BOOL STDCALL NtUserEnumDisplaySettings( @@ -916,7 +907,7 @@ NtUserEnumDisplaySettings( /* Copy the devmode */ _SEH_TRY { - ProbeForRead(&lpDevMode->dmSize, sizeof(DEVMODEW), 1); + ProbeForRead(lpDevMode, sizeof(DEVMODEW), 1); Size = lpDevMode->dmSize; ExtraSize = lpDevMode->dmDriverExtra; } @@ -963,11 +954,23 @@ NtUserEnumDisplaySettings( RtlFreeUnicodeString(pSafeDeviceName); /* Copy some information back */ - COPY_DEVMODE_VALUE_TO_CALLER(lpDevMode, pSafeDevMode, dmPelsWidth); - COPY_DEVMODE_VALUE_TO_CALLER(lpDevMode, pSafeDevMode, dmPelsHeight); - COPY_DEVMODE_VALUE_TO_CALLER(lpDevMode, pSafeDevMode, dmBitsPerPel); - COPY_DEVMODE_VALUE_TO_CALLER(lpDevMode, pSafeDevMode, dmDisplayFrequency); - COPY_DEVMODE_VALUE_TO_CALLER(lpDevMode, pSafeDevMode, dmDisplayFlags); + _SEH_TRY + { + ProbeForWrite(lpDevMode,Size, 1); + lpDevMode->dmPelsWidth = pSafeDevMode->dmPelsWidth; + lpDevMode->dmPelsHeight = pSafeDevMode->dmPelsHeight; + lpDevMode->dmBitsPerPel = pSafeDevMode->dmBitsPerPel; + lpDevMode->dmDisplayFrequency = pSafeDevMode->dmDisplayFrequency; + lpDevMode->dmDisplayFlags = pSafeDevMode->dmDisplayFlags; + } + _SEH_HANDLE + { + DPRINT1("Warning crash here \n"); + SetLastNtError(_SEH_GetExceptionCode()); + _SEH_YIELD(return FALSE); + } + _SEH_END; + /* output private/extra driver data */ if (ExtraSize > 0) @@ -985,8 +988,6 @@ NtUserEnumDisplaySettings( return TRUE; } -#undef COPY_DEVMODE_VALUE_TO_CALLER - LONG STDCALL NtUserChangeDisplaySettings(