From a0624a040f1b39bbe71f7f4fa28e7bf2e95595a6 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Mon, 29 Dec 2014 13:11:48 +0000 Subject: [PATCH] [GDI32] Improve client object code svn path=/trunk/; revision=65882 --- reactos/win32ss/gdi/gdi32/include/gdi32p.h | 20 ++++- reactos/win32ss/gdi/gdi32/objects/clientobj.c | 82 ++++++++++++++----- 2 files changed, 79 insertions(+), 23 deletions(-) diff --git a/reactos/win32ss/gdi/gdi32/include/gdi32p.h b/reactos/win32ss/gdi/gdi32/include/gdi32p.h index 4c2b1451402..7c855d61a5b 100644 --- a/reactos/win32ss/gdi/gdi32/include/gdi32p.h +++ b/reactos/win32ss/gdi/gdi32/include/gdi32p.h @@ -446,18 +446,32 @@ _lrintf(float f) HGDIOBJ WINAPI -GdiInsertClientObj( +GdiCreateClientObj( _In_ PVOID pvObject, _In_ GDILOOBJTYPE eObjType); PVOID WINAPI -GdiGetClientObject( +GdiDeleteClientObj( + _In_ HGDIOBJ hobj); + +BOOL +WINAPI +GdiCreateClientObjLink( + _In_ HGDIOBJ hobj, + _In_ PVOID pvObject); + +PVOID +WINAPI +GdiGetClientObjLink( _In_ HGDIOBJ hobj); PVOID WINAPI -GdiRemoveClientObject( +GdiRemoveClientObjLink( _In_ HGDIOBJ hobj); +extern ULONG gcClientObj; + + /* EOF */ diff --git a/reactos/win32ss/gdi/gdi32/objects/clientobj.c b/reactos/win32ss/gdi/gdi32/objects/clientobj.c index e59006f35a9..c4ac9114d4b 100644 --- a/reactos/win32ss/gdi/gdi32/objects/clientobj.c +++ b/reactos/win32ss/gdi/gdi32/objects/clientobj.c @@ -8,6 +8,7 @@ #include CRITICAL_SECTION gcsClientObjLinks; +ULONG gcClientObj; typedef struct _CLIENTOBJLINK { @@ -18,54 +19,46 @@ typedef struct _CLIENTOBJLINK PCLIENTOBJLINK gapcolHashTable[127]; -HGDIOBJ +BOOL WINAPI -GdiInsertClientObj( - _In_ PVOID pvObject, - _In_ GDILOOBJTYPE eObjType) +GdiCreateClientObjLink( + _In_ HGDIOBJ hobj, + _In_ PVOID pvObject) { PCLIENTOBJLINK pcol; ULONG iHashIndex; - HGDIOBJ hobj; - - /* Call win32k to create a client object handle */ - hobj = NtGdiCreateClientObj(eObjType); - if (hobj == NULL) - { - return NULL; - } - - /* Calculate the hash index */ - iHashIndex = (ULONG_PTR)hobj % _countof(gapcolHashTable); /* Allocate a link structure */ pcol = HeapAlloc(GetProcessHeap(), 0, sizeof(*pcol)); if (pcol == NULL) { - NtGdiDeleteClientObj(hobj); - return NULL; + return FALSE; } /* Setup the link structure */ pcol->hobj = hobj; pcol->pvObj = pvObject; + /* Calculate the hash index */ + iHashIndex = (ULONG_PTR)hobj % _countof(gapcolHashTable); + /* Enter the critical section */ EnterCriticalSection(&gcsClientObjLinks); /* Insert the link structure */ pcol->pcolNext = gapcolHashTable[iHashIndex]; gapcolHashTable[iHashIndex] = pcol; + gcClientObj++; /* Leave the critical section */ LeaveCriticalSection(&gcsClientObjLinks); - return hobj; + return TRUE; } PVOID WINAPI -GdiGetClientObject( +GdiGetClientObjLink( _In_ HGDIOBJ hobj) { ULONG iHashIndex; @@ -102,7 +95,7 @@ GdiGetClientObject( PVOID WINAPI -GdiRemoveClientObject( +GdiRemoveClientObjLink( _In_ HGDIOBJ hobj) { PCLIENTOBJLINK pcol, *ppcol; @@ -127,6 +120,7 @@ GdiRemoveClientObject( { /* Update the link pointer, removing this link */ *ppcol = pcol->pcolNext; + gcClientObj--; /* Get the object pointer */ pvObject = pcol->pvObj; @@ -148,3 +142,51 @@ GdiRemoveClientObject( /* Return the object pointer, or NULL if we did not find it */ return pvObject; } + +HGDIOBJ +WINAPI +GdiCreateClientObj( + _In_ PVOID pvObject, + _In_ GDILOOBJTYPE eObjType) +{ + HGDIOBJ hobj; + + /* Call win32k to create a client object handle */ + hobj = NtGdiCreateClientObj(eObjType); + if (hobj == NULL) + { + return NULL; + } + + /* Create the client object link */ + if (!GdiCreateClientObjLink(hobj, pvObject)) + { + NtGdiDeleteClientObj(hobj); + return NULL; + } + + return hobj; +} + +PVOID +WINAPI +GdiDeleteClientObj( + _In_ HGDIOBJ hobj) +{ + PVOID pvObject; + + /* Remove the client object link */ + pvObject = GdiRemoveClientObjLink(hobj); + if (pvObject == NULL) + { + return NULL; + } + + /* Call win32k to delete the handle */ + if (!NtGdiDeleteClientObj(hobj)) + { + ASSERT(FALSE); + } + + return pvObject; +}