Author: tkreuzer Date: Wed Feb 13 03:46:23 2008 New Revision: 32336
URL: http://svn.reactos.org/svn/reactos?rev=32336&view=rev Log: Big ntuser fix: - rename ObmXxx functions to UserXxx functions - remove some macros - move prototypes to object.h - implement UserreferenceObjectByHandle creating a reference to the object, used for cursoricon stuff so far - rewrite object manager functions to reasonably handle references - dereference cursoricons correctly, so they will really get deleted -> fixes a cursoricon leak - destroy submenus in NtUserDestroyMenu -> fixes a big menu leak - free the buffer of the menu text -> fixes a mem leak - delete old bitmaps in NtUserSetCursorContent -> fixes a bitmap leak - delete monitor object on failure Now taskmgr doesn't leak memory anymore. we still leak some user handles here and there even after terminating a process, but it's much better now.
Modified: trunk/reactos/subsystems/win32/win32k/include/cursoricon.h trunk/reactos/subsystems/win32/win32k/include/menu.h trunk/reactos/subsystems/win32/win32k/include/object.h trunk/reactos/subsystems/win32/win32k/include/userfuncs.h trunk/reactos/subsystems/win32/win32k/main/dllmain.c trunk/reactos/subsystems/win32/win32k/ntuser/accelerator.c trunk/reactos/subsystems/win32/win32k/ntuser/callproc.c trunk/reactos/subsystems/win32/win32k/ntuser/cursoricon.c trunk/reactos/subsystems/win32/win32k/ntuser/hook.c trunk/reactos/subsystems/win32/win32k/ntuser/input.c trunk/reactos/subsystems/win32/win32k/ntuser/menu.c trunk/reactos/subsystems/win32/win32k/ntuser/message.c trunk/reactos/subsystems/win32/win32k/ntuser/monitor.c trunk/reactos/subsystems/win32/win32k/ntuser/msgqueue.c trunk/reactos/subsystems/win32/win32k/ntuser/ntuser.c trunk/reactos/subsystems/win32/win32k/ntuser/object.c trunk/reactos/subsystems/win32/win32k/ntuser/window.c trunk/reactos/subsystems/win32/win32k/ntuser/winpos.c
Modified: trunk/reactos/subsystems/win32/win32k/include/cursoricon.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/inc... ============================================================================== --- trunk/reactos/subsystems/win32/win32k/include/cursoricon.h (original) +++ trunk/reactos/subsystems/win32/win32k/include/cursoricon.h Wed Feb 13 03:46:23 2008 @@ -81,7 +81,7 @@ (PSYSTEM_CURSORINFO)((WinStaObj)->SystemCursor)
#define IntReleaseCurIconObject(CurIconObj) \ - ObmDereferenceObject(CurIconObj) + UserDereferenceObject(CurIconObj)
#endif /* _WIN32K_CURSORICON_H */
Modified: trunk/reactos/subsystems/win32/win32k/include/menu.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/inc... ============================================================================== --- trunk/reactos/subsystems/win32/win32k/include/menu.h (original) +++ trunk/reactos/subsystems/win32/win32k/include/menu.h Wed Feb 13 03:46:23 2008 @@ -47,7 +47,7 @@ IntGetMenuObject(HMENU hMenu);
#define IntReleaseMenuObject(MenuObj) \ - ObmDereferenceObject(MenuObj) + UserDereferenceObject(MenuObj)
BOOL FASTCALL IntFreeMenuItem(PMENU_OBJECT MenuObject, PMENU_ITEM MenuItem,
Modified: trunk/reactos/subsystems/win32/win32k/include/object.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/inc... ============================================================================== --- trunk/reactos/subsystems/win32/win32k/include/object.h (original) +++ trunk/reactos/subsystems/win32/win32k/include/object.h Wed Feb 13 03:46:23 2008 @@ -102,8 +102,20 @@
#undef USER_ASSERT
-VOID FASTCALL ObmReferenceObject(PVOID obj); -BOOL FASTCALL ObmDereferenceObject2(PVOID obj); +extern PUSER_HANDLE_TABLE gHandleTable; +VOID FASTCALL UserReferenceObject(PVOID obj); +PVOID FASTCALL UserReferenceObjectByHandle(HANDLE handle, USER_OBJECT_TYPE type); +BOOL FASTCALL UserDereferenceObject(PVOID obj); +PVOID FASTCALL UserCreateObject(PUSER_HANDLE_TABLE ht, HANDLE* h,USER_OBJECT_TYPE type , ULONG size); +BOOL FASTCALL UserDeleteObject(HANDLE h, USER_OBJECT_TYPE type ); +PVOID UserGetObject(PUSER_HANDLE_TABLE ht, HANDLE handle, USER_OBJECT_TYPE type ); +HANDLE UserAllocHandle(PUSER_HANDLE_TABLE ht, PVOID object, USER_OBJECT_TYPE type ); +BOOL UserFreeHandle(PUSER_HANDLE_TABLE ht, HANDLE handle ); +PVOID UserGetNextHandle(PUSER_HANDLE_TABLE ht, HANDLE* handle, USER_OBJECT_TYPE type ); +PUSER_HANDLE_ENTRY handle_to_entry(PUSER_HANDLE_TABLE ht, HANDLE handle ); +BOOL FASTCALL UserCreateHandleTable(); +VOID UserInitHandleTable(PUSER_HANDLE_TABLE ht, PVOID mem, ULONG bytes); +
static __inline VOID UserRefObjectCo(PVOID obj, PUSER_REFERENCE_ENTRY UserReferenceEntry) @@ -114,7 +126,7 @@ ASSERT(W32Thread != NULL); ASSERT(UserReferenceEntry != NULL); UserReferenceEntry->obj = obj; - ObmReferenceObject(obj); + UserReferenceObject(obj); PushEntryList(&W32Thread->ReferencesList, &UserReferenceEntry->Entry); }
@@ -134,10 +146,10 @@ ASSERT(UserReferenceEntry != NULL);
ASSERT(obj == UserReferenceEntry->obj); - ObmDereferenceObject2(obj); + UserDereferenceObject(obj); }
-HANDLE FASTCALL ObmObjectToHandle(PVOID obj); +HANDLE FASTCALL UserObjectToHandle(PVOID obj);
VOID FASTCALL CreateStockObjects (VOID); VOID FASTCALL CreateSysColorObjects (VOID);
Modified: trunk/reactos/subsystems/win32/win32k/include/userfuncs.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/inc... ============================================================================== --- trunk/reactos/subsystems/win32/win32k/include/userfuncs.h (original) +++ trunk/reactos/subsystems/win32/win32k/include/userfuncs.h Wed Feb 13 03:46:23 2008 @@ -6,22 +6,6 @@
PMENU_OBJECT FASTCALL UserGetMenuObject(HMENU hMenu); - - -#if 0 -#define ObmDereferenceObject(_obj_) \ -{ \ - DPRINT1("obj 0x%x dereffed to %i refs\n",_obj_, USER_BODY_TO_HEADER(_obj_)->RefCount-1); \ - ObmDereferenceObject2(_obj_); \ -} - -#endif - -#define ObmDereferenceObject(_obj_) ObmDereferenceObject2(_obj_) - - - -
#define ASSERT_REFS_CO(_obj_) \ { \ @@ -56,33 +40,7 @@
#define DUMP_REFS(obj) DPRINT1("obj 0x%x, refs %i\n",obj, USER_BODY_TO_HEADER(obj)->RefCount)
- - - -VOID FASTCALL ObmReferenceObject(PVOID obj); -BOOL FASTCALL ObmDereferenceObject2(PVOID obj); - PWINDOW_OBJECT FASTCALL IntGetWindowObject(HWND hWnd); -PVOID FASTCALL -ObmCreateObject(PUSER_HANDLE_TABLE ht, HANDLE* h,USER_OBJECT_TYPE type , ULONG size); - -BOOL FASTCALL -ObmDeleteObject(HANDLE h, USER_OBJECT_TYPE type ); - -#define UserRefObject(o) ObmReferenceObject(o) -#define UserDerefObject(o) ObmDereferenceObject(o) -BOOL FASTCALL ObmCreateHandleTable(); - -/******************** HANDLE.C ***************/ - -extern PUSER_HANDLE_TABLE gHandleTable; - -PUSER_HANDLE_ENTRY handle_to_entry(PUSER_HANDLE_TABLE ht, HANDLE handle ); -VOID UserInitHandleTable(PUSER_HANDLE_TABLE ht, PVOID mem, ULONG bytes); -HANDLE UserAllocHandle(PUSER_HANDLE_TABLE ht, PVOID object, USER_OBJECT_TYPE type ); -PVOID UserGetObject(PUSER_HANDLE_TABLE ht, HANDLE handle, USER_OBJECT_TYPE type ); -PVOID UserFreeHandle(PUSER_HANDLE_TABLE ht, HANDLE handle ); -PVOID UserGetNextHandle(PUSER_HANDLE_TABLE ht, HANDLE* handle, USER_OBJECT_TYPE type );
/*************** WINSTA.C ***************/
Modified: trunk/reactos/subsystems/win32/win32k/main/dllmain.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/mai... ============================================================================== --- trunk/reactos/subsystems/win32/win32k/main/dllmain.c (original) +++ trunk/reactos/subsystems/win32/win32k/main/dllmain.c Wed Feb 13 03:46:23 2008 @@ -289,7 +289,7 @@ { PUSER_REFERENCE_ENTRY ref = CONTAINING_RECORD(e, USER_REFERENCE_ENTRY, Entry); DPRINT("thread clean: remove reference obj 0x%x\n",ref->obj); - ObmDereferenceObject(ref->obj); + UserDereferenceObject(ref->obj);
e = PopEntryList(&Win32Thread->ReferencesList); }
Modified: trunk/reactos/subsystems/win32/win32k/ntuser/accelerator.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/ntu... ============================================================================== --- trunk/reactos/subsystems/win32/win32k/ntuser/accelerator.c (original) +++ trunk/reactos/subsystems/win32/win32k/ntuser/accelerator.c Wed Feb 13 03:46:23 2008 @@ -348,7 +348,7 @@ RETURN( (HACCEL) 0 ); }
- Accel = ObmCreateObject(gHandleTable, (PHANDLE)&hAccel, otAccel, sizeof(ACCELERATOR_TABLE)); + Accel = UserCreateObject(gHandleTable, (PHANDLE)&hAccel, otAccel, sizeof(ACCELERATOR_TABLE));
if (Accel == NULL) { @@ -362,7 +362,8 @@ Accel->Table = ExAllocatePoolWithTag(PagedPool, EntriesCount * sizeof(ACCEL), TAG_ACCEL); if (Accel->Table == NULL) { - ObmDeleteObject(hAccel, otAccel); + UserDereferenceObject(Accel); + UserDeleteObject(hAccel, otAccel); SetLastNtError(STATUS_NO_MEMORY); RETURN( (HACCEL) 0); } @@ -371,7 +372,8 @@ if (!NT_SUCCESS(Status)) { ExFreePool(Accel->Table); - ObmDeleteObject(hAccel, otAccel); + UserDereferenceObject(Accel); + UserDeleteObject(hAccel, otAccel); SetLastNtError(Status); RETURN((HACCEL) 0); } @@ -411,12 +413,13 @@ RETURN( FALSE); }
- ObmDeleteObject(hAccel, otAccel); - if (Accel->Table != NULL) { ExFreePool(Accel->Table); - } + Accel->Table = NULL; + } + + UserDeleteObject(hAccel, otAccel);
RETURN( TRUE);
Modified: trunk/reactos/subsystems/win32/win32k/ntuser/callproc.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/ntu... ============================================================================== --- trunk/reactos/subsystems/win32/win32k/ntuser/callproc.c (original) +++ trunk/reactos/subsystems/win32/win32k/ntuser/callproc.c Wed Feb 13 03:46:23 2008 @@ -39,7 +39,7 @@ GetCallProcHandle(IN PCALLPROC CallProc) { /* FIXME - check for 64 bit architectures... */ - return (WNDPROC)((ULONG_PTR)ObmObjectToHandle(CallProc) | 0xFFFF0000); + return (WNDPROC)((ULONG_PTR)UserObjectToHandle(CallProc) | 0xFFFF0000); }
VOID @@ -47,9 +47,9 @@ IN OUT PCALLPROC CallProc) { /* FIXME - use new object manager! */ - HANDLE Handle = ObmObjectToHandle(CallProc); + HANDLE Handle = UserObjectToHandle(CallProc);
- ObmDeleteObject(Handle, + UserDeleteObject(Handle, otCallProc); }
@@ -61,7 +61,7 @@ HANDLE Handle;
/* FIXME - use new object manager! */ - NewCallProc = (PCALLPROC)ObmCreateObject(gHandleTable, + NewCallProc = (PCALLPROC)UserCreateObject(gHandleTable, &Handle, otCallProc, sizeof(CALLPROC)); @@ -87,7 +87,7 @@ HANDLE Handle;
/* FIXME - use new object manager! */ - NewCallProc = (PCALLPROC)ObmCreateObject(gHandleTable, + NewCallProc = (PCALLPROC)UserCreateObject(gHandleTable, &Handle, otCallProc, sizeof(CALLPROC));
Modified: trunk/reactos/subsystems/win32/win32k/ntuser/cursoricon.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/ntu... ============================================================================== --- trunk/reactos/subsystems/win32/win32k/ntuser/cursoricon.c (original) +++ trunk/reactos/subsystems/win32/win32k/ntuser/cursoricon.c Wed Feb 13 03:46:23 2008 @@ -71,7 +71,7 @@ return TRUE; }
- +/* This function creates a reference for the object! */ PCURICON_OBJECT FASTCALL UserGetCurIconObject(HCURSOR hCurIcon) { PCURICON_OBJECT CurIcon; @@ -82,7 +82,7 @@ return NULL; }
- CurIcon = (PCURICON_OBJECT)UserGetObject(gHandleTable, hCurIcon, otCursorIcon); + CurIcon = (PCURICON_OBJECT)UserReferenceObjectByHandle(hCurIcon, otCursorIcon); if (!CurIcon) { /* we never set ERROR_INVALID_ICON_HANDLE. lets hope noone ever checks for it */ @@ -90,7 +90,7 @@ return NULL; }
- ASSERT(USER_BODY_TO_HEADER(CurIcon)->RefCount >= 0); + ASSERT(USER_BODY_TO_HEADER(CurIcon)->RefCount >= 1); return CurIcon; }
@@ -151,10 +151,14 @@
if (!NewCursor && (CurInfo->CurrentCursorObject || ForceChange)) { - if (NULL != CurInfo->CurrentCursorObject && CurInfo->ShowingCursor) - { - /* Remove the cursor if it was displayed */ - IntEngMovePointer(SurfObj, -1, -1, &GDIDEV(SurfObj)->Pointer.Exclude); + if (NULL != CurInfo->CurrentCursorObject) + { + UserDereferenceObject(CurInfo->CurrentCursorObject); + if (CurInfo->ShowingCursor) + { + /* Remove the cursor if it was displayed */ + IntEngMovePointer(SurfObj, -1, -1, &GDIDEV(SurfObj)->Pointer.Exclude); + } }
GDIDEV(SurfObj)->Pointer.Status = SPS_ACCEPT_NOEXCLUDE; @@ -239,6 +243,7 @@ } CurInfo->ShowingCursor = CURSOR_SHOWING; CurInfo->CurrentCursorObject = NewCursor; + UserReferenceObject(NewCursor); } else { @@ -365,14 +370,14 @@ LIST_FOR_EACH(CurIcon, &gCurIconList, CURICON_OBJECT, ListEntry) {
- // if(NT_SUCCESS(ObmReferenceObjectByPointer(Object, otCursorIcon))) //<- huh???? -// ObmReferenceObject( CurIcon); + // if(NT_SUCCESS(UserReferenceObjectByPointer(Object, otCursorIcon))) //<- huh???? +// UserReferenceObject( CurIcon); // { if((CurIcon->hModule == hModule) && (CurIcon->hRsrc == hRsrc)) { if(cx && ((cx != CurIcon->Size.cx) || (cy != CurIcon->Size.cy))) { -// ObmDereferenceObject(CurIcon); +// UserDereferenceObject(CurIcon); continue; } if (! ReferenceCurIconByProcess(CurIcon)) @@ -383,7 +388,7 @@ return CurIcon; } // } -// ObmDereferenceObject(CurIcon); +// UserDereferenceObject(CurIcon);
}
@@ -396,7 +401,7 @@ PCURICON_OBJECT CurIcon; HANDLE hCurIcon;
- CurIcon = ObmCreateObject(gHandleTable, &hCurIcon, otCursorIcon, sizeof(CURICON_OBJECT)); + CurIcon = UserCreateObject(gHandleTable, &hCurIcon, otCursorIcon, sizeof(CURICON_OBJECT));
if(!CurIcon) { @@ -410,14 +415,12 @@ if (! ReferenceCurIconByProcess(CurIcon)) { DPRINT1("Failed to add process\n"); - ObmDeleteObject(hCurIcon, otCursorIcon); - ObmDereferenceObject(CurIcon); + UserDeleteObject(hCurIcon, otCursorIcon); + UserDereferenceObject(CurIcon); return NULL; }
InsertHeadList(&gCurIconList, &CurIcon->ListEntry); - - ObmDereferenceObject(CurIcon);
return CurIcon; } @@ -484,19 +487,23 @@ bmpMask = CurIcon->IconInfo.hbmMask; bmpColor = CurIcon->IconInfo.hbmColor;
- Ret = ObmDeleteObject(CurIcon->Self, otCursorIcon); - /* delete bitmaps */ if(bmpMask) { GDIOBJ_SetOwnership(GdiHandleTable, bmpMask, PsGetCurrentProcess()); NtGdiDeleteObject(bmpMask); + CurIcon->IconInfo.hbmMask = NULL; } if(bmpColor) { GDIOBJ_SetOwnership(GdiHandleTable, bmpColor, PsGetCurrentProcess()); NtGdiDeleteObject(bmpColor); - } + CurIcon->IconInfo.hbmColor = NULL; + } + + /* We were given a pointer, no need to keep the reference anylonger! */ + UserDereferenceObject(CurIcon); + Ret = UserDeleteObject(CurIcon->Self, otCursorIcon);
return Ret; } @@ -516,8 +523,8 @@
LIST_FOR_EACH_SAFE(CurIcon, tmp, &gCurIconList, CURICON_OBJECT, ListEntry) { -// ObmReferenceObject(CurIcon); - // if(NT_SUCCESS(ObmReferenceObjectByPointer(Object, otCursorIcon))) +// UserReferenceObject(CurIcon); + // if(NT_SUCCESS(UserReferenceObjectByPointer(Object, otCursorIcon))) { LIST_FOR_EACH(ProcessData, &CurIcon->ProcessList, CURICON_PROCESS, ListEntry) { @@ -529,7 +536,7 @@ } }
-// ObmDereferenceObject(Object); +// UserDereferenceObject(Object); }
@@ -607,6 +614,7 @@ } }
+ UserDereferenceObject(CurIcon); ObDereferenceObject(WinSta); RETURN( Ret);
@@ -698,6 +706,7 @@ else SetLastNtError(Status);
+ UserDereferenceObject(CurIcon); ObDereferenceObject(WinSta); RETURN( Ret);
@@ -749,6 +758,8 @@ else SetLastNtError(Status); // maybe not, test this
+ UserDereferenceObject(CurIcon); + cleanup: DPRINT("Leave NtUserGetIconSize, ret=%i\n", bRet); UserLeave(); @@ -950,6 +961,7 @@ }
ret = IntDestroyCurIconObject(WinSta, CurIcon, FALSE); + /* Note: IntDestroyCurIconObject will remove our reference for us! */
ObDereferenceObject(WinSta); RETURN(ret); @@ -1099,6 +1111,7 @@
OldCursor = IntSetCursor(WinSta, CurIcon, FALSE);
+ UserDereferenceObject(CurIcon); ObDereferenceObject(WinSta);
RETURN(OldCursor); @@ -1117,9 +1130,10 @@ STDCALL NtUserSetCursorContents( HANDLE hCurIcon, - PICONINFO IconInfo) + PICONINFO UnsafeIconInfo) { PCURICON_OBJECT CurIcon; + ICONINFO IconInfo; PBITMAPOBJ bmp; PWINSTATION_OBJECT WinSta; NTSTATUS Status; @@ -1142,12 +1156,25 @@ }
/* Copy fields */ - Status = MmCopyFromCaller(&CurIcon->IconInfo, IconInfo, sizeof(ICONINFO)); + Status = MmCopyFromCaller(&IconInfo, UnsafeIconInfo, sizeof(ICONINFO)); if(!NT_SUCCESS(Status)) { SetLastNtError(Status); goto done; } + + /* Delete old bitmaps */ + if (CurIcon->IconInfo.hbmColor != IconInfo.hbmColor) + { + NtGdiDeleteObject(CurIcon->IconInfo.hbmColor); + } + if (CurIcon->IconInfo.hbmMask != IconInfo.hbmMask) + { + NtGdiDeleteObject(CurIcon->IconInfo.hbmMask); + } + + /* Copy new IconInfo field */ + CurIcon->IconInfo = IconInfo;
bmp = BITMAPOBJ_LockBitmap(CurIcon->IconInfo.hbmColor); if(bmp) @@ -1174,6 +1201,10 @@
done:
+ if (CurIcon) + { + UserDereferenceObject(CurIcon); + } ObDereferenceObject(WinSta); RETURN( Ret);
@@ -1265,6 +1296,7 @@ else Ret = TRUE;
+ UserDereferenceObject(CurIcon); ObDereferenceObject(WinSta); RETURN( Ret);
@@ -1346,6 +1378,7 @@ }
done: + UserDereferenceObject(CurIcon); ObDereferenceObject(WinSta); RETURN( Ret);
@@ -1764,6 +1797,8 @@ hbrFlickerFreeDraw, diFlags);
+ UserDereferenceObject(pIcon); + UserLeave(); return Ret; }
Modified: trunk/reactos/subsystems/win32/win32k/ntuser/hook.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/ntu... ============================================================================== --- trunk/reactos/subsystems/win32/win32k/ntuser/hook.c (original) +++ trunk/reactos/subsystems/win32/win32k/ntuser/hook.c Wed Feb 13 03:46:23 2008 @@ -112,7 +112,7 @@ } }
- Hook = ObmCreateObject(gHandleTable, &Handle, otHook, sizeof(HOOK)); + Hook = UserCreateObject(gHandleTable, &Handle, otHook, sizeof(HOOK)); if (NULL == Hook) { return NULL; @@ -215,7 +215,7 @@ }
/* Close handle */ - ObmDeleteObject(Hook->Self, otHook); + UserDeleteObject(Hook->Self, otHook); }
/* remove a hook, freeing it if the chain is not in use */ @@ -441,7 +441,7 @@ RETURN( FALSE); }
- //Status = ObmReferenceObjectByHandle(gHandleTable, Hook, + //Status = UserReferenceObjectByHandle(gHandleTable, Hook, // otHookProc, (PVOID *) &HookObj); ObDereferenceObject(WinStaObj);
@@ -462,13 +462,13 @@ if (NULL != HookObj->Thread && (HookObj->Thread != PsGetCurrentThread())) { DPRINT1("Thread mismatch\n"); - ObmDereferenceObject(HookObj); + UserDereferenceObject(HookObj); SetLastWin32Error(ERROR_INVALID_HANDLE); RETURN( 0); }
NextObj = IntGetNextHook(HookObj); - ObmDereferenceObject(HookObj); + UserDereferenceObject(HookObj); if (NULL != NextObj) { DPRINT1("Calling next hook not implemented\n"); @@ -637,7 +637,7 @@ Status = MmCopyFromCaller(&ModuleName, UnsafeModuleName, sizeof(UNICODE_STRING)); if (! NT_SUCCESS(Status)) { - ObmDereferenceObject(Hook); + UserDereferenceObject(Hook); IntRemoveHook(Hook, WinStaObj, FALSE); if (NULL != Thread) { @@ -652,7 +652,7 @@ TAG_HOOK); if (NULL == Hook->ModuleName.Buffer) { - ObmDereferenceObject(Hook); + UserDereferenceObject(Hook); IntRemoveHook(Hook, WinStaObj, FALSE); if (NULL != Thread) { @@ -669,7 +669,7 @@ if (! NT_SUCCESS(Status)) { ExFreePool(Hook->ModuleName.Buffer); - ObmDereferenceObject(Hook); + UserDereferenceObject(Hook); IntRemoveHook(Hook, WinStaObj, FALSE); if (NULL != Thread) { @@ -686,7 +686,7 @@ Hook->Ansi = Ansi; Handle = Hook->Self;
- ObmDereferenceObject(Hook); + UserDereferenceObject(Hook); ObDereferenceObject(WinStaObj);
RETURN( Handle); @@ -738,7 +738,7 @@ RETURN( FALSE); }
- // Status = ObmReferenceObjectByHandle(gHandleTable, Hook, + // Status = UserReferenceObjectByHandle(gHandleTable, Hook, // otHookProc, (PVOID *) &HookObj); if (!(HookObj = IntGetHookObject(Hook))) { @@ -751,7 +751,7 @@
IntRemoveHook(HookObj, WinStaObj, FALSE);
- ObmDereferenceObject(HookObj); + UserDereferenceObject(HookObj); ObDereferenceObject(WinStaObj);
RETURN( TRUE);
Modified: trunk/reactos/subsystems/win32/win32k/ntuser/input.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/ntu... ============================================================================== --- trunk/reactos/subsystems/win32/win32k/ntuser/input.c (original) +++ trunk/reactos/subsystems/win32/win32k/ntuser/input.c Wed Feb 13 03:46:23 2008 @@ -1058,7 +1058,7 @@ MousePos.x = DesktopWindow->Wnd->ClientRect.right - 1; if(MousePos.y >= DesktopWindow->Wnd->ClientRect.bottom) MousePos.y = DesktopWindow->Wnd->ClientRect.bottom - 1; - ObmDereferenceObject(DesktopWindow); + UserDereferenceObject(DesktopWindow); }
if(MousePos.x < 0)
Modified: trunk/reactos/subsystems/win32/win32k/ntuser/menu.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/ntu... ============================================================================== --- trunk/reactos/subsystems/win32/win32k/ntuser/menu.c (original) +++ trunk/reactos/subsystems/win32/win32k/ntuser/menu.c Wed Feb 13 03:46:23 2008 @@ -238,6 +238,7 @@ }
/* Free memory */ + ExFreePool(MenuItem->Text.Buffer); ExFreePool(MenuItem);
return TRUE; @@ -317,9 +318,10 @@ Window->Wnd->IDMenu = 0; } } - ObmDeleteObject(Menu->MenuInfo.Self, otMenu); +// UserDereferenceObject(Menu); + BOOL ret = UserDeleteObject(Menu->MenuInfo.Self, otMenu); ObDereferenceObject(WindowStation); - return TRUE; + return ret; } } return FALSE; @@ -330,7 +332,7 @@ { PMENU_OBJECT Menu;
- Menu = (PMENU_OBJECT)ObmCreateObject( + Menu = (PMENU_OBJECT)UserCreateObject( gHandleTable, Handle, otMenu, sizeof(MENU_OBJECT));
@@ -438,7 +440,7 @@ if(!Source) return NULL;
- Menu = (PMENU_OBJECT)ObmCreateObject( + Menu = (PMENU_OBJECT)UserCreateObject( gHandleTable, &hMenu, otMenu, sizeof(MENU_OBJECT));
@@ -1457,6 +1459,7 @@ { PWINSTATION_OBJECT WinStaObject; HANDLE Handle; + PMENU_OBJECT Menu; NTSTATUS Status; PEPROCESS CurrentProcess = PsGetCurrentProcess();
@@ -1479,12 +1482,14 @@ SetLastNtError(Status); return (HMENU)0; } - IntCreateMenu(&Handle, !PopupMenu); + Menu = IntCreateMenu(&Handle, !PopupMenu); + UserDereferenceObject(Menu); ObDereferenceObject(WinStaObject); } else { - IntCreateMenu(&Handle, !PopupMenu); + Menu = IntCreateMenu(&Handle, !PopupMenu); + UserDereferenceObject(Menu); }
return (HMENU)Handle; @@ -1566,7 +1571,7 @@ RETURN( FALSE); }
- RETURN( IntDestroyMenuObject(Menu, FALSE, TRUE)); + RETURN( IntDestroyMenuObject(Menu, TRUE, TRUE));
CLEANUP: DPRINT("Leave NtUserDestroyMenu, ret=%i\n",_ret_);
Modified: trunk/reactos/subsystems/win32/win32k/ntuser/message.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/ntu... ============================================================================== --- trunk/reactos/subsystems/win32/win32k/ntuser/message.c (original) +++ trunk/reactos/subsystems/win32/win32k/ntuser/message.c Wed Feb 13 03:46:23 2008 @@ -582,12 +582,12 @@ }
/* eat the message */ - UserDerefObject(Wnd); + UserDereferenceObject(Wnd); UserDerefObjectCo(DesktopWindow); UserDerefObjectCo(Window); return TRUE; } - UserDerefObject(Wnd); + UserDereferenceObject(Wnd); }
UserDerefObjectCo(DesktopWindow); @@ -800,7 +800,7 @@
// if(MsgWindow) // { -// UserDerefObject(MsgWindow); +// UserDereferenceObject(MsgWindow); // }
return TRUE; @@ -1584,7 +1584,7 @@ /* Must be handled by other thread */ // if (HWND_BROADCAST != hWnd) // { -// UserDerefObject(Window); +// UserDereferenceObject(Window); // } Info.HandledByKernel = TRUE; UserModeMsg.hwnd = hWnd;
Modified: trunk/reactos/subsystems/win32/win32k/ntuser/monitor.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/ntu... ============================================================================== --- trunk/reactos/subsystems/win32/win32k/ntuser/monitor.c (original) +++ trunk/reactos/subsystems/win32/win32k/ntuser/monitor.c Wed Feb 13 03:46:23 2008 @@ -89,7 +89,7 @@ HANDLE Handle; PMONITOR_OBJECT Monitor;
- Monitor = ObmCreateObject(gHandleTable, &Handle, otMonitor, sizeof (MONITOR_OBJECT)); + Monitor = UserCreateObject(gHandleTable, &Handle, otMonitor, sizeof (MONITOR_OBJECT)); if (Monitor == NULL) { return NULL; @@ -116,7 +116,7 @@ IntDestroyMonitorObject(IN PMONITOR_OBJECT pMonitor) { RtlFreeUnicodeString(&pMonitor->DeviceName); - ObmDereferenceObject(pMonitor); + UserDereferenceObject(pMonitor); }
@@ -178,6 +178,8 @@ if (!RtlCreateUnicodeString(&Monitor->DeviceName, Buffer)) { DPRINT("Couldn't duplicate monitor name!\n"); + UserDereferenceObject(Monitor); + UserDeleteObject(Monitor->Handle, otMonitor); return STATUS_INSUFFICIENT_RESOURCES; }
@@ -199,6 +201,7 @@ } Monitor->Prev = p; } + UserDereferenceObject(Monitor);
return STATUS_SUCCESS; }
Modified: trunk/reactos/subsystems/win32/win32k/ntuser/msgqueue.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/ntu... ============================================================================== --- trunk/reactos/subsystems/win32/win32k/ntuser/msgqueue.c (original) +++ trunk/reactos/subsystems/win32/win32k/ntuser/msgqueue.c Wed Feb 13 03:46:23 2008 @@ -282,7 +282,7 @@ if(Msg == WM_MOUSEWHEEL) { Window = UserGetWindowObject(IntGetFocusWindow()); - if (Window) UserRefObject(Window); + if (Window) UserReferenceObject(Window); } else { @@ -290,7 +290,7 @@ if(Window == NULL) { Window = ScopeWin; - if (Window) UserRefObject(Window); + if (Window) UserReferenceObject(Window); } else { @@ -304,7 +304,7 @@ /* FIXME - window messages should go to the right window if no buttons are pressed */ Window = UserGetWindowObject(hCaptureWin); - if (Window) UserRefObject(Window); + if (Window) UserReferenceObject(Window); }
@@ -377,7 +377,7 @@ IntUnLockHardwareMessageQueue(Window->MessageQueue);
*Freed = FALSE; - UserDerefObject(Window); + UserDereferenceObject(Window); return(FALSE); }
@@ -420,7 +420,7 @@ IntUnLockHardwareMessageQueue(Window->MessageQueue); }
- UserDerefObject(Window); + UserDereferenceObject(Window); *Freed = FALSE; return(FALSE); } @@ -459,7 +459,7 @@ } }
- UserDerefObject(Window); + UserDereferenceObject(Window); *Freed = FALSE; return(TRUE); } @@ -783,7 +783,7 @@ Mesg.time = MsqCalculateMessageTime(&LargeTickCount); IntGetCursorLocation(WinSta, &Mesg.pt); MsqPostMessage(Window->MessageQueue, &Mesg, FALSE, QS_HOTKEY); - ObmDereferenceObject(Window); + UserDereferenceObject(Window); ObDereferenceObject (Thread);
// InsertHeadList(&pThread->MessageQueue->PostedMessagesListHead,
Modified: trunk/reactos/subsystems/win32/win32k/ntuser/ntuser.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/ntu... ============================================================================== --- trunk/reactos/subsystems/win32/win32k/ntuser/ntuser.c (original) +++ trunk/reactos/subsystems/win32/win32k/ntuser/ntuser.c Wed Feb 13 03:46:23 2008 @@ -44,7 +44,7 @@
ExInitializeResourceLite(&UserLock);
- if (!ObmCreateHandleTable()) + if (!UserCreateHandleTable()) { DPRINT1("Failed creating handle table\n"); return STATUS_INSUFFICIENT_RESOURCES;
Modified: trunk/reactos/subsystems/win32/win32k/ntuser/object.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/ntu... ============================================================================== --- trunk/reactos/subsystems/win32/win32k/ntuser/object.c (original) +++ trunk/reactos/subsystems/win32/win32k/ntuser/object.c Wed Feb 13 03:46:23 2008 @@ -69,7 +69,7 @@ if (ht->nb_handles >= ht->allocated_handles) /* need to grow the array */ { /**/ - int i, iFree = 0, iWindow = 0, iMenu = 0, iCursorIcon = 0, + int i, iFree = 0, iWindow = 0, iMenu = 0, iCursorIcon = 0, iHook = 0, iCallProc = 0, iAccel = 0, iMonitor = 0; /**/ DPRINT1("Out of user handles! Used -> %i, NM_Handle -> %d\n", usedHandles, ht->nb_handles); @@ -108,7 +108,7 @@ } DPRINT1("Handle Count by Type:\n Free = %d Window = %d Menu = %d CursorIcon = %d Hook = %d\n CallProc = %d Accel = %d Monitor = %d\n", iFree, iWindow, iMenu, iCursorIcon, iHook, iCallProc, iAccel, iMonitor ); -//#endif +//#endif return NULL; #if 0 PUSER_HANDLE_ENTRY new_handles; @@ -198,6 +198,10 @@ entry->pi = UserHandleOwnerByType(type); if (++entry->generation >= 0xffff) entry->generation = 1; + + /* We have created a handle, which is a reference! */ + UserReferenceObject(object); + return entry_to_handle(ht, entry ); }
@@ -241,18 +245,24 @@ return entry->ptr; }
-/* free a user handle and return a pointer to the object */ -PVOID UserFreeHandle(PUSER_HANDLE_TABLE ht, HANDLE handle ) -{ - PUSER_HANDLE_ENTRY entry; +/* free a user handle */ +BOOL UserFreeHandle(PUSER_HANDLE_TABLE ht, HANDLE handle ) +{ + PUSER_HANDLE_ENTRY entry; + PVOID object;
if (!(entry = handle_to_entry( ht, handle ))) { SetLastNtError( STATUS_INVALID_HANDLE ); - return NULL; - } - - return free_user_entry(ht, entry ); + return FALSE; + } + + object = free_user_entry(ht, entry ); + + /* We removed the handle, which was a reference! */ + return UserDereferenceObject(object); + + return TRUE; }
/* return the next user handle after 'handle' that is of a given type */ @@ -284,7 +294,7 @@
PVOID FASTCALL -ObmCreateObject(PUSER_HANDLE_TABLE ht, HANDLE* h,USER_OBJECT_TYPE type , ULONG size) +UserCreateObject(PUSER_HANDLE_TABLE ht, HANDLE* h,USER_OBJECT_TYPE type , ULONG size) {
HANDLE hi; @@ -303,7 +313,7 @@
RtlZeroMemory(hdr, size + sizeof(USER_OBJECT_HEADER)); hdr->hSelf = hi; - hdr->RefCount++; //temp hack! + hdr->RefCount = 2; // we need this, because we create 2 refs: handle and pointer!
if (h) *h = hi; @@ -311,7 +321,7 @@ }
BOOL FASTCALL -ObmDeleteObject(HANDLE h, USER_OBJECT_TYPE type ) +UserDeleteObject(HANDLE h, USER_OBJECT_TYPE type ) { PUSER_OBJECT_HEADER hdr; PVOID body = UserGetObject(gHandleTable, h, type); @@ -319,42 +329,45 @@ return FALSE;
hdr = USER_BODY_TO_HEADER(body); + ASSERT(hdr->RefCount >= 1); + + hdr->destroyed = TRUE; + return UserFreeHandle(gHandleTable, h); +} + + +VOID FASTCALL UserReferenceObject(PVOID obj) +{ + PUSER_OBJECT_HEADER hdr = USER_BODY_TO_HEADER(obj); + ASSERT(hdr->RefCount >= 0);
- hdr->destroyed = TRUE; - if (hdr->RefCount == 0) - { - UserFreeHandle(gHandleTable, h); - - memset(hdr, 0x55, sizeof(USER_OBJECT_HEADER)); - - UserHeapFree(hdr); - //ExFreePool(hdr); - return TRUE; - } - -// DPRINT1("info: something not destroyed bcause refs still left, inuse %i\n",usedHandles); - return FALSE; -} - - -VOID FASTCALL ObmReferenceObject(PVOID obj) -{ - PUSER_OBJECT_HEADER hdr = USER_BODY_TO_HEADER(obj); - - ASSERT(hdr->RefCount >= 0); - hdr->RefCount++; }
-HANDLE FASTCALL ObmObjectToHandle(PVOID obj) + +PVOID FASTCALL UserReferenceObjectByHandle(HANDLE handle, USER_OBJECT_TYPE type) +{ + PVOID object; + + object = UserGetObject(gHandleTable, handle, type); + if(object) + { + UserReferenceObject(object); + } + + return object; +} + + +HANDLE FASTCALL UserObjectToHandle(PVOID obj) { PUSER_OBJECT_HEADER hdr = USER_BODY_TO_HEADER(obj); return hdr->hSelf; }
-BOOL FASTCALL ObmDereferenceObject2(PVOID obj) +BOOL FASTCALL UserDereferenceObject(PVOID obj) { PUSER_OBJECT_HEADER hdr = USER_BODY_TO_HEADER(obj);
@@ -363,17 +376,19 @@ hdr->RefCount--;
// You can not have a zero here! - if (!hdr->destroyed && hdr->RefCount == 0) hdr->RefCount++; // BOUNCE!!!!! + if (!hdr->destroyed && hdr->RefCount == 0) + { + hdr->RefCount++; // BOUNCE!!!!! + DPRINT1("warning! Dereference to zero without deleting!\n"); + }
if (hdr->RefCount == 0 && hdr->destroyed) { // DPRINT1("info: something destroyed bcaise of deref, in use=%i\n",usedHandles);
- UserFreeHandle(gHandleTable, hdr->hSelf); - memset(hdr, 0x55, sizeof(USER_OBJECT_HEADER));
- UserHeapFree(hdr); + return UserHeapFree(hdr); //ExFreePool(hdr);
return TRUE; @@ -384,7 +399,7 @@
-BOOL FASTCALL ObmCreateHandleTable() +BOOL FASTCALL UserCreateHandleTable() {
PVOID mem;
Modified: trunk/reactos/subsystems/win32/win32k/ntuser/window.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/ntu... ============================================================================== --- trunk/reactos/subsystems/win32/win32k/ntuser/window.c (original) +++ trunk/reactos/subsystems/win32/win32k/ntuser/window.c Wed Feb 13 03:46:23 2008 @@ -414,7 +414,7 @@ else co_UserFreeWindow(Child, ProcessData, ThreadData, SendMessages);
- UserDerefObject(Child); + UserDereferenceObject(Child); } } ExFreePool(Children); @@ -491,8 +491,8 @@
IntUnlinkWindow(Window);
- UserRefObject(Window); - ObmDeleteObject(Window->hSelf, otWindow); + UserReferenceObject(Window); + UserDeleteObject(Window->hSelf, otWindow);
IntDestroyScrollBars(Window);
@@ -510,7 +510,7 @@ ASSERT(Window->Wnd != NULL); UserFreeWindowInfo(Window->ti, Window);
- UserDerefObject(Window); + UserDereferenceObject(Window);
IntClipboardFreeWindow(Window);
@@ -989,7 +989,7 @@ if (WndOldOwner) { ret = WndOldOwner->hSelf; - UserDerefObject(WndOldOwner); + UserDereferenceObject(WndOldOwner); } else { @@ -1007,7 +1007,7 @@ Wnd->Wnd->Owner = NULL; }
- UserDerefObject(Wnd); + UserDereferenceObject(Wnd); return ret; }
@@ -1042,7 +1042,7 @@
WndOldParent = Wnd->Parent;
- if (WndOldParent) UserRefObject(WndOldParent); /* caller must deref */ + if (WndOldParent) UserReferenceObject(WndOldParent); /* caller must deref */
if (WndNewParent != WndOldParent) { @@ -1064,9 +1064,9 @@ } else { -// UserRefObject(InsertAfter); +// UserReferenceObject(InsertAfter); IntLinkWindow(Wnd, WndNewParent, InsertAfter /*prev sibling*/); -// UserDerefObject(InsertAfter); +// UserDereferenceObject(InsertAfter); } }
@@ -1092,7 +1092,7 @@ // { // if(!IntIsWindow(WndOldParent->hSelf)) // { -// UserDerefObject(WndOldParent); +// UserDereferenceObject(WndOldParent); // return NULL; // }
@@ -1607,7 +1607,7 @@
/* Create the window object. */ Window = (PWINDOW_OBJECT) - ObmCreateObject(gHandleTable, (PHANDLE)&hWnd, + UserCreateObject(gHandleTable, (PHANDLE)&hWnd, otWindow, sizeof(WINDOW_OBJECT)); if (Window) { @@ -1982,7 +1982,7 @@ if (!Result) { /* FIXME: Cleanup. */ - DPRINT("IntCreateWindowEx(): NCCREATE message failed.\n"); + DPRINT1("IntCreateWindowEx(): NCCREATE message failed. No cleanup performed!\n"); RETURN((HWND)0); }
@@ -2046,7 +2046,7 @@ if (Result == (LRESULT)-1) { /* FIXME: Cleanup. */ - DPRINT("IntCreateWindowEx(): send CREATE message failed.\n"); + DPRINT1("IntCreateWindowEx(): send CREATE message failed. No cleanup performed!\n"); RETURN((HWND)0); }
@@ -2166,7 +2166,11 @@ CLEANUP: if (!_ret_ && Window && Window->Wnd && ti) UserFreeWindowInfo(ti, Window); - if (Window) UserDerefObjectCo(Window); + if (Window) + { + UserDerefObjectCo(Window); + UserDereferenceObject(Window); + } if (ParentWindow) UserDerefObjectCo(ParentWindow); if (!_ret_ && ti != NULL) { @@ -2834,7 +2838,7 @@ }
//temp hack -// UserDerefObject(Parent); +// UserDereferenceObject(Parent);
WndAncestor = Parent; } @@ -2935,7 +2939,7 @@ if (!(Wnd = UserGetWindowObject(hWnd))) { RETURN( FALSE ); - } + } _SEH_TRY { if(pcbi) @@ -2958,7 +2962,7 @@ CLEANUP: DPRINT("Leave NtUserGetComboBoxInfo, ret=%i\n",_ret_); UserLeave(); - END_CLEANUP; + END_CLEANUP; }
@@ -3013,21 +3017,21 @@ { PWINDOW_OBJECT Wnd; DECLARE_RETURN(DWORD); - + DPRINT("Enter NtUserGetListBoxInfo\n"); UserEnterShared();
if (!(Wnd = UserGetWindowObject(hWnd))) { RETURN( 0 ); - } + }
RETURN( (DWORD) co_IntSendMessage( Wnd->hSelf, LB_GETLISTBOXINFO, 0, 0 ));
CLEANUP: DPRINT("Leave NtUserGetListBoxInfo, ret=%i\n",_ret_); UserLeave(); - END_CLEANUP; + END_CLEANUP; }
@@ -3081,7 +3085,7 @@ if (WndOldParent) { hWndOldParent = WndOldParent->hSelf; - UserDerefObject(WndOldParent); + UserDereferenceObject(WndOldParent); }
return( hWndOldParent); @@ -4599,7 +4603,7 @@ RETURN( NULL);
CLEANUP: - if (Window) UserDerefObject(Window); + if (Window) UserDereferenceObject(Window); if (DesktopWindow) UserDerefObjectCo(DesktopWindow);
DPRINT("Leave NtUserWindowFromPoint, ret=%i\n",_ret_);
Modified: trunk/reactos/subsystems/win32/win32k/ntuser/winpos.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/ntu... ============================================================================== --- trunk/reactos/subsystems/win32/win32k/ntuser/winpos.c (original) +++ trunk/reactos/subsystems/win32/win32k/ntuser/winpos.c Wed Feb 13 03:46:23 2008 @@ -1005,14 +1005,14 @@ } if (NULL != InsertAfterWindow) { - UserRefObject(InsertAfterWindow); + UserReferenceObject(InsertAfterWindow); } } else if (WinPos.hwndInsertAfter == HWND_BOTTOM) { if(ParentWindow->LastChild) { - UserRefObject(ParentWindow->LastChild); + UserReferenceObject(ParentWindow->LastChild); InsertAfterWindow = ParentWindow->LastChild; } else @@ -1028,7 +1028,7 @@ IntLinkWindow(Window, ParentWindow, InsertAfterWindow); } if (InsertAfterWindow != NULL) - UserDerefObject(InsertAfterWindow); + UserDereferenceObject(InsertAfterWindow); if ((HWND_TOPMOST == WinPos.hwndInsertAfter) || (0 != (Window->Wnd->ExStyle & WS_EX_TOPMOST) && NULL != Window->PrevSibling @@ -1588,9 +1588,9 @@ continue; }
- if (*Window) UserDerefObject(*Window); + if (*Window) UserDereferenceObject(*Window); *Window = Current; - UserRefObject(*Window); + UserReferenceObject(*Window);
if (CurrentWnd->Style & WS_MINIMIZE) {