mirror of
https://github.com/reactos/reactos.git
synced 2025-02-24 01:15:09 +00:00
[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
This commit is contained in:
parent
febbf7f603
commit
46da747829
1 changed files with 37 additions and 19 deletions
|
@ -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;
|
||||
|
||||
|
|
Loading…
Reference in a new issue