From 95f100163da303228add162dfefd80414f832dba Mon Sep 17 00:00:00 2001 From: James Tabor Date: Sat, 16 Jan 2010 05:56:22 +0000 Subject: [PATCH] [Win32k] - Fix the window handle De/Reference throttler issue. Used mIrc. svn path=/trunk/; revision=45096 --- .../subsystems/win32/win32k/ntuser/object.c | 54 ++++++++++--------- 1 file changed, 30 insertions(+), 24 deletions(-) diff --git a/reactos/subsystems/win32/win32k/ntuser/object.c b/reactos/subsystems/win32/win32k/ntuser/object.c index 2e913372a24..cd5f59101ed 100644 --- a/reactos/subsystems/win32/win32k/ntuser/object.c +++ b/reactos/subsystems/win32/win32k/ntuser/object.c @@ -396,37 +396,26 @@ UserCreateObject( PUSER_HANDLE_TABLE ht, BOOL FASTCALL -UserDereferenceObject(PVOID obj) -{ - ASSERT(((PHEAD)obj)->cLockObj >= 1); - - if (--((PHEAD)obj)->cLockObj <= 0) - { - return TRUE; - } - return FALSE; -} - -BOOL -FASTCALL -UserFreeHandle(PUSER_HANDLE_TABLE ht, HANDLE handle ) +UserDereferenceObject(PVOID object) { PUSER_HANDLE_ENTRY entry; - PVOID object; USER_OBJECT_TYPE type; - if (!(entry = handle_to_entry( ht, handle ))) - { - SetLastNtError( STATUS_INVALID_HANDLE ); - return FALSE; - } + ASSERT(((PHEAD)object)->cLockObj >= 1); - entry->flags = HANDLEENTRY_INDESTROY; - - if (UserDereferenceObject(entry->ptr)) + if ((INT)--((PHEAD)object)->cLockObj <= 0) { + entry = handle_to_entry(gHandleTable, ((PHEAD)object)->h ); + + DPRINT("warning! Dereference to zero! Obj -> 0x%x\n", object); + + ((PHEAD)object)->cLockObj = 0; + + if (!(entry->flags & HANDLEENTRY_INDESTROY)) + return TRUE; + type = entry->type; - object = free_user_entry(ht, entry ); + free_user_entry(gHandleTable, entry ); switch (type) { @@ -444,6 +433,23 @@ UserFreeHandle(PUSER_HANDLE_TABLE ht, HANDLE handle ) return FALSE; } +BOOL +FASTCALL +UserFreeHandle(PUSER_HANDLE_TABLE ht, HANDLE handle ) +{ + PUSER_HANDLE_ENTRY entry; + + if (!(entry = handle_to_entry( ht, handle ))) + { + SetLastNtError( STATUS_INVALID_HANDLE ); + return FALSE; + } + + entry->flags = HANDLEENTRY_INDESTROY; + + return UserDereferenceObject(entry->ptr); +} + BOOL FASTCALL UserDeleteObject(HANDLE h, USER_OBJECT_TYPE type )