From: Timo Kreuzer Date: Tue, 1 Jan 2013 11:57:58 +0000 (+0000) Subject: [WIN32K] X-Git-Tag: backups/ros-csrss@60644~85^2~58 X-Git-Url: https://git.reactos.org/?p=reactos.git;a=commitdiff_plain;h=46da7478295bbca085699d33637cda371f24f888;ds=inline [WIN32K] Exchange fields individually in PDEVOBJ_vSwitchPdev() instead of duplicating a full PDEV structure on the stack. This saves a lot of stack space. svn path=/trunk/; revision=58081 --- diff --git a/reactos/win32ss/gdi/eng/pdevobj.c b/reactos/win32ss/gdi/eng/pdevobj.c index 5214e0b7e78..5402a84c8c6 100644 --- a/reactos/win32ss/gdi/eng/pdevobj.c +++ b/reactos/win32ss/gdi/eng/pdevobj.c @@ -341,52 +341,68 @@ EngpCreatePDEV( return ppdev; } +VOID +FORCEINLINE +SwitchPointer( + _Inout_ PVOID pvPointer1, + _Inout_ PVOID pvPointer2) +{ + PVOID *ppvPointer1 = pvPointer1; + PVOID *ppvPointer2 = pvPointer2; + PVOID pvTemp; + + pvTemp = *ppvPointer1; + *ppvPointer1 = *ppvPointer2; + *ppvPointer2 = pvTemp; +} + VOID NTAPI PDEVOBJ_vSwitchPdev( PPDEVOBJ ppdev, PPDEVOBJ ppdev2) { - PDEVOBJ pdevTmp; - DWORD tmpStateFlags; - - /* Exchange data */ - pdevTmp = *ppdev; + union + { + DRIVER_FUNCTIONS pfn; + GDIINFO gdiinfo; + DEVINFO devinfo; + DWORD StateFlags; + } temp; /* Exchange driver functions */ + temp.pfn = ppdev->pfn; ppdev->pfn = ppdev2->pfn; - ppdev2->pfn = pdevTmp.pfn; + ppdev2->pfn = temp.pfn; /* Exchange LDEVs */ - ppdev->pldev = ppdev2->pldev; - ppdev2->pldev = pdevTmp.pldev; + SwitchPointer(&ppdev->pldev, &ppdev2->pldev); /* Exchange DHPDEV */ - ppdev->dhpdev = ppdev2->dhpdev; - ppdev2->dhpdev = pdevTmp.dhpdev; + SwitchPointer(&ppdev->dhpdev, &ppdev2->dhpdev); /* Exchange surfaces and associate them with their new PDEV */ - ppdev->pSurface = ppdev2->pSurface; - ppdev2->pSurface = pdevTmp.pSurface; + SwitchPointer(&ppdev->pSurface, &ppdev2->pSurface); ppdev->pSurface->SurfObj.hdev = (HDEV)ppdev; ppdev2->pSurface->SurfObj.hdev = (HDEV)ppdev2; /* Exchange devinfo */ + temp.devinfo = ppdev->devinfo; ppdev->devinfo = ppdev2->devinfo; - ppdev2->devinfo = pdevTmp.devinfo; + ppdev2->devinfo = temp.devinfo; /* Exchange gdiinfo */ + temp.gdiinfo = ppdev->gdiinfo; ppdev->gdiinfo = ppdev2->gdiinfo; - ppdev2->gdiinfo = pdevTmp.gdiinfo; + ppdev2->gdiinfo = temp.gdiinfo; /* Exchange DEVMODE */ - ppdev->pdmwDev = ppdev2->pdmwDev; - ppdev2->pdmwDev = pdevTmp.pdmwDev; + SwitchPointer(&ppdev->pdmwDev, &ppdev2->pdmwDev); /* Exchange state flags */ - tmpStateFlags = ppdev->pGraphicsDevice->StateFlags; + temp.StateFlags = ppdev->pGraphicsDevice->StateFlags; ppdev->pGraphicsDevice->StateFlags = ppdev2->pGraphicsDevice->StateFlags; - ppdev2->pGraphicsDevice->StateFlags = tmpStateFlags; + ppdev2->pGraphicsDevice->StateFlags = temp.StateFlags; /* Notify each driver instance of its new HDEV association */ ppdev->pfn.CompletePDEV(ppdev->dhpdev, (HDEV)ppdev); @@ -407,6 +423,7 @@ PDEVOBJ_bSwitchMode( /* Lock the PDEV */ EngAcquireSemaphore(ppdev->hsemDevLock); + /* And everything else */ EngAcquireSemaphore(ghsemPDEV); @@ -613,9 +630,10 @@ PDEVOBJ_vGetDeviceCaps( /** Exported functions ********************************************************/ +_Must_inspect_result_ _Ret_z_ LPWSTR APIENTRY -EngGetDriverName(IN HDEV hdev) +EngGetDriverName(_In_ HDEV hdev) { PPDEVOBJ ppdev = (PPDEVOBJ)hdev;