From 72bceaffc2850de2c6cba13ed2772c550be2de1c Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Thu, 18 Dec 2014 08:12:28 +0000 Subject: [PATCH] [WIN32K] Implement exclusive lock order checks for GDI objects in debug builds svn path=/trunk/; revision=65731 --- reactos/win32ss/gdi/ntgdi/gdiobj.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/reactos/win32ss/gdi/ntgdi/gdiobj.c b/reactos/win32ss/gdi/ntgdi/gdiobj.c index 8aa9703b760..c03d5c14d44 100644 --- a/reactos/win32ss/gdi/ntgdi/gdiobj.c +++ b/reactos/win32ss/gdi/ntgdi/gdiobj.c @@ -71,6 +71,22 @@ DECREASE_THREAD_LOCK_COUNT( } #if DBG +VOID +ASSERT_LOCK_ORDER( + _In_ UCHAR objt) +{ + PTHREADINFO pti = PsGetCurrentThreadWin32Thread(); + ULONG i; + + if (pti) + { + /* Ensure correct locking order! */ + for (i = objt + 1; i < GDIObjTypeTotal; i++) + { + NT_ASSERT(pti->acExclusiveLockCount[i] == 0); + } + } +} #define ASSERT_SHARED_OBJECT_TYPE(objt) \ ASSERT((objt) == GDIObjType_SURF_TYPE || \ (objt) == GDIObjType_PAL_TYPE || \ @@ -83,6 +99,7 @@ DECREASE_THREAD_LOCK_COUNT( #define ASSERT_TRYLOCK_OBJECT_TYPE(objt) \ ASSERT((objt) == GDIObjType_DRVOBJ_TYPE) #else +#define ASSERT_LOCK_ORDER(hobj) #define ASSERT_SHARED_OBJECT_TYPE(objt) #define ASSERT_EXCLUSIVE_OBJECT_TYPE(objt) #define ASSERT_TRYLOCK_OBJECT_TYPE(objt) @@ -669,6 +686,9 @@ GDIOBJ_TryLockObject( return NULL; } + /* Make sure lock order is correct */ + ASSERT_LOCK_ORDER(objt); + /* Reference the handle entry */ pentry = ENTRY_ReferenceEntryByHandle(hobj, 0); if (!pentry) @@ -735,6 +755,9 @@ GDIOBJ_LockObject( return NULL; } + /* Make sure lock order is correct */ + ASSERT_LOCK_ORDER(objt); + /* Reference the handle entry */ pentry = ENTRY_ReferenceEntryByHandle(hobj, 0); if (!pentry)