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.

svn path=/trunk/; revision=32336
This commit is contained in:
Timo Kreuzer 2008-02-13 00:46:23 +00:00
parent 8e61015f65
commit a8c044b6cb
18 changed files with 208 additions and 173 deletions

View file

@ -81,7 +81,7 @@ PCURICON_OBJECT FASTCALL UserGetCurIconObject(HCURSOR hCurIcon);
(PSYSTEM_CURSORINFO)((WinStaObj)->SystemCursor)
#define IntReleaseCurIconObject(CurIconObj) \
ObmDereferenceObject(CurIconObj)
UserDereferenceObject(CurIconObj)
#endif /* _WIN32K_CURSORICON_H */

View file

@ -47,7 +47,7 @@ PMENU_OBJECT FASTCALL
IntGetMenuObject(HMENU hMenu);
#define IntReleaseMenuObject(MenuObj) \
ObmDereferenceObject(MenuObj)
UserDereferenceObject(MenuObj)
BOOL FASTCALL
IntFreeMenuItem(PMENU_OBJECT MenuObject, PMENU_ITEM MenuItem,

View file

@ -102,8 +102,20 @@ UserAssertLastRef(PVOID obj, const char *file, int line)
#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 @@ UserRefObjectCo(PVOID obj, PUSER_REFERENCE_ENTRY UserReferenceEntry)
ASSERT(W32Thread != NULL);
ASSERT(UserReferenceEntry != NULL);
UserReferenceEntry->obj = obj;
ObmReferenceObject(obj);
UserReferenceObject(obj);
PushEntryList(&W32Thread->ReferencesList, &UserReferenceEntry->Entry);
}
@ -134,10 +146,10 @@ UserDerefObjectCo(PVOID obj)
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);

View file

@ -7,22 +7,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_) \
{ \
LONG ref = USER_BODY_TO_HEADER(_obj_)->RefCount;\
@ -56,33 +40,7 @@ PMENU_OBJECT FASTCALL UserGetMenuObject(HMENU hMenu);
#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 ***************/

View file

@ -289,7 +289,7 @@ Win32kThreadCallback(struct _ETHREAD *Thread,
{
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);
}

View file

@ -348,7 +348,7 @@ NtUserCreateAcceleratorTable(
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 @@ NtUserCreateAcceleratorTable(
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 @@ NtUserCreateAcceleratorTable(
if (!NT_SUCCESS(Status))
{
ExFreePool(Accel->Table);
ObmDeleteObject(hAccel, otAccel);
UserDereferenceObject(Accel);
UserDeleteObject(hAccel, otAccel);
SetLastNtError(Status);
RETURN((HACCEL) 0);
}
@ -411,13 +413,14 @@ NtUserDestroyAcceleratorTable(
RETURN( FALSE);
}
ObmDeleteObject(hAccel, otAccel);
if (Accel->Table != NULL)
{
ExFreePool(Accel->Table);
Accel->Table = NULL;
}
UserDeleteObject(hAccel, otAccel);
RETURN( TRUE);
CLEANUP:

View file

@ -39,7 +39,7 @@ WNDPROC
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 @@ DestroyCallProc(IN PDESKTOP Desktop,
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 @@ CloneCallProc(IN PDESKTOP Desktop,
HANDLE Handle;
/* FIXME - use new object manager! */
NewCallProc = (PCALLPROC)ObmCreateObject(gHandleTable,
NewCallProc = (PCALLPROC)UserCreateObject(gHandleTable,
&Handle,
otCallProc,
sizeof(CALLPROC));
@ -87,7 +87,7 @@ CreateCallProc(IN PDESKTOP Desktop,
HANDLE Handle;
/* FIXME - use new object manager! */
NewCallProc = (PCALLPROC)ObmCreateObject(gHandleTable,
NewCallProc = (PCALLPROC)UserCreateObject(gHandleTable,
&Handle,
otCallProc,
sizeof(CALLPROC));

View file

@ -71,7 +71,7 @@ IntGetCursorLocation(PWINSTATION_OBJECT WinSta, POINT *loc)
return TRUE;
}
/* This function creates a reference for the object! */
PCURICON_OBJECT FASTCALL UserGetCurIconObject(HCURSOR hCurIcon)
{
PCURICON_OBJECT CurIcon;
@ -82,7 +82,7 @@ PCURICON_OBJECT FASTCALL UserGetCurIconObject(HCURSOR hCurIcon)
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 @@ PCURICON_OBJECT FASTCALL UserGetCurIconObject(HCURSOR hCurIcon)
return NULL;
}
ASSERT(USER_BODY_TO_HEADER(CurIcon)->RefCount >= 0);
ASSERT(USER_BODY_TO_HEADER(CurIcon)->RefCount >= 1);
return CurIcon;
}
@ -151,10 +151,14 @@ IntSetCursor(PWINSTATION_OBJECT WinSta, PCURICON_OBJECT NewCursor,
if (!NewCursor && (CurInfo->CurrentCursorObject || ForceChange))
{
if (NULL != CurInfo->CurrentCursorObject && CurInfo->ShowingCursor)
if (NULL != CurInfo->CurrentCursorObject)
{
/* Remove the cursor if it was displayed */
IntEngMovePointer(SurfObj, -1, -1, &GDIDEV(SurfObj)->Pointer.Exclude);
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 @@ IntSetCursor(PWINSTATION_OBJECT WinSta, PCURICON_OBJECT NewCursor,
}
CurInfo->ShowingCursor = CURSOR_SHOWING;
CurInfo->CurrentCursorObject = NewCursor;
UserReferenceObject(NewCursor);
}
else
{
@ -365,14 +370,14 @@ IntFindExistingCurIconObject(PWINSTATION_OBJECT WinSta, HMODULE hModule,
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 @@ IntFindExistingCurIconObject(PWINSTATION_OBJECT WinSta, HMODULE hModule,
return CurIcon;
}
// }
// ObmDereferenceObject(CurIcon);
// UserDereferenceObject(CurIcon);
}
@ -396,7 +401,7 @@ IntCreateCurIconHandle(PWINSTATION_OBJECT WinSta)
PCURICON_OBJECT CurIcon;
HANDLE hCurIcon;
CurIcon = ObmCreateObject(gHandleTable, &hCurIcon, otCursorIcon, sizeof(CURICON_OBJECT));
CurIcon = UserCreateObject(gHandleTable, &hCurIcon, otCursorIcon, sizeof(CURICON_OBJECT));
if(!CurIcon)
{
@ -410,15 +415,13 @@ IntCreateCurIconHandle(PWINSTATION_OBJECT WinSta)
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,20 +487,24 @@ IntDestroyCurIconObject(PWINSTATION_OBJECT WinSta, PCURICON_OBJECT CurIcon, BOOL
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 @@ IntCleanupCurIcons(struct _EPROCESS *Process, PW32PROCESS Win32Process)
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 @@ IntCleanupCurIcons(struct _EPROCESS *Process, PW32PROCESS Win32Process)
}
}
// ObmDereferenceObject(Object);
// UserDereferenceObject(Object);
}
@ -607,6 +614,7 @@ NtUserCreateCursorIconHandle(PICONINFO IconInfo OPTIONAL, BOOL Indirect)
}
}
UserDereferenceObject(CurIcon);
ObDereferenceObject(WinSta);
RETURN( Ret);
@ -698,6 +706,7 @@ NtUserGetIconInfo(
else
SetLastNtError(Status);
UserDereferenceObject(CurIcon);
ObDereferenceObject(WinSta);
RETURN( Ret);
@ -749,6 +758,8 @@ NtUserGetIconSize(
else
SetLastNtError(Status); // maybe not, test this
UserDereferenceObject(CurIcon);
cleanup:
DPRINT("Leave NtUserGetIconSize, ret=%i\n", bRet);
UserLeave();
@ -950,6 +961,7 @@ NtUserDestroyCursor(
}
ret = IntDestroyCurIconObject(WinSta, CurIcon, FALSE);
/* Note: IntDestroyCurIconObject will remove our reference for us! */
ObDereferenceObject(WinSta);
RETURN(ret);
@ -1099,6 +1111,7 @@ NtUserSetCursor(
OldCursor = IntSetCursor(WinSta, CurIcon, FALSE);
UserDereferenceObject(CurIcon);
ObDereferenceObject(WinSta);
RETURN(OldCursor);
@ -1117,9 +1130,10 @@ BOOL
STDCALL
NtUserSetCursorContents(
HANDLE hCurIcon,
PICONINFO IconInfo)
PICONINFO UnsafeIconInfo)
{
PCURICON_OBJECT CurIcon;
ICONINFO IconInfo;
PBITMAPOBJ bmp;
PWINSTATION_OBJECT WinSta;
NTSTATUS Status;
@ -1142,13 +1156,26 @@ NtUserSetCursorContents(
}
/* 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 @@ NtUserSetCursorContents(
done:
if (CurIcon)
{
UserDereferenceObject(CurIcon);
}
ObDereferenceObject(WinSta);
RETURN( Ret);
@ -1265,6 +1296,7 @@ NtUserSetCursorIconData(
else
Ret = TRUE;
UserDereferenceObject(CurIcon);
ObDereferenceObject(WinSta);
RETURN( Ret);
@ -1346,6 +1378,7 @@ NtUserSetCursorIconData(
}
done:
UserDereferenceObject(CurIcon);
ObDereferenceObject(WinSta);
RETURN( Ret);
@ -1764,6 +1797,8 @@ NtUserDrawIconEx(
hbrFlickerFreeDraw,
diFlags);
UserDereferenceObject(pIcon);
UserLeave();
return Ret;
}

View file

@ -112,7 +112,7 @@ IntAddHook(PETHREAD Thread, int HookId, BOOLEAN Global, PWINSTATION_OBJECT WinSt
}
}
Hook = ObmCreateObject(gHandleTable, &Handle, otHook, sizeof(HOOK));
Hook = UserCreateObject(gHandleTable, &Handle, otHook, sizeof(HOOK));
if (NULL == Hook)
{
return NULL;
@ -215,7 +215,7 @@ IntFreeHook(PHOOKTABLE Table, PHOOK Hook, PWINSTATION_OBJECT WinStaObj)
}
/* 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 @@ NtUserCallNextHookEx(
RETURN( FALSE);
}
//Status = ObmReferenceObjectByHandle(gHandleTable, Hook,
//Status = UserReferenceObjectByHandle(gHandleTable, Hook,
// otHookProc, (PVOID *) &HookObj);
ObDereferenceObject(WinStaObj);
@ -462,13 +462,13 @@ NtUserCallNextHookEx(
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 @@ NtUserSetWindowsHookEx(
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 @@ NtUserSetWindowsHookEx(
TAG_HOOK);
if (NULL == Hook->ModuleName.Buffer)
{
ObmDereferenceObject(Hook);
UserDereferenceObject(Hook);
IntRemoveHook(Hook, WinStaObj, FALSE);
if (NULL != Thread)
{
@ -669,7 +669,7 @@ NtUserSetWindowsHookEx(
if (! NT_SUCCESS(Status))
{
ExFreePool(Hook->ModuleName.Buffer);
ObmDereferenceObject(Hook);
UserDereferenceObject(Hook);
IntRemoveHook(Hook, WinStaObj, FALSE);
if (NULL != Thread)
{
@ -686,7 +686,7 @@ NtUserSetWindowsHookEx(
Hook->Ansi = Ansi;
Handle = Hook->Self;
ObmDereferenceObject(Hook);
UserDereferenceObject(Hook);
ObDereferenceObject(WinStaObj);
RETURN( Handle);
@ -738,7 +738,7 @@ NtUserUnhookWindowsHookEx(
RETURN( FALSE);
}
// Status = ObmReferenceObjectByHandle(gHandleTable, Hook,
// Status = UserReferenceObjectByHandle(gHandleTable, Hook,
// otHookProc, (PVOID *) &HookObj);
if (!(HookObj = IntGetHookObject(Hook)))
{
@ -751,7 +751,7 @@ NtUserUnhookWindowsHookEx(
IntRemoveHook(HookObj, WinStaObj, FALSE);
ObmDereferenceObject(HookObj);
UserDereferenceObject(HookObj);
ObDereferenceObject(WinStaObj);
RETURN( TRUE);

View file

@ -1058,7 +1058,7 @@ IntMouseInput(MOUSEINPUT *mi)
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)

View file

@ -238,6 +238,7 @@ IntFreeMenuItem(PMENU_OBJECT Menu, PMENU_ITEM MenuItem,
}
/* Free memory */
ExFreePool(MenuItem->Text.Buffer);
ExFreePool(MenuItem);
return TRUE;
@ -317,9 +318,10 @@ IntDestroyMenuObject(PMENU_OBJECT Menu,
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 @@ IntCreateMenu(PHANDLE Handle, BOOL IsMenuBar)
{
PMENU_OBJECT Menu;
Menu = (PMENU_OBJECT)ObmCreateObject(
Menu = (PMENU_OBJECT)UserCreateObject(
gHandleTable, Handle,
otMenu, sizeof(MENU_OBJECT));
@ -438,7 +440,7 @@ IntCloneMenu(PMENU_OBJECT Source)
if(!Source)
return NULL;
Menu = (PMENU_OBJECT)ObmCreateObject(
Menu = (PMENU_OBJECT)UserCreateObject(
gHandleTable, &hMenu,
otMenu, sizeof(MENU_OBJECT));
@ -1457,6 +1459,7 @@ HMENU FASTCALL UserCreateMenu(BOOL PopupMenu)
{
PWINSTATION_OBJECT WinStaObject;
HANDLE Handle;
PMENU_OBJECT Menu;
NTSTATUS Status;
PEPROCESS CurrentProcess = PsGetCurrentProcess();
@ -1479,12 +1482,14 @@ HMENU FASTCALL UserCreateMenu(BOOL PopupMenu)
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 @@ NtUserDestroyMenu(
RETURN( FALSE);
}
RETURN( IntDestroyMenuObject(Menu, FALSE, TRUE));
RETURN( IntDestroyMenuObject(Menu, TRUE, TRUE));
CLEANUP:
DPRINT("Leave NtUserDestroyMenu, ret=%i\n",_ret_);

View file

@ -582,12 +582,12 @@ co_IntTranslateMouseMessage(PUSER_MESSAGE_QUEUE ThreadQueue, LPMSG Msg, USHORT *
}
/* eat the message */
UserDerefObject(Wnd);
UserDereferenceObject(Wnd);
UserDerefObjectCo(DesktopWindow);
UserDerefObjectCo(Window);
return TRUE;
}
UserDerefObject(Wnd);
UserDereferenceObject(Wnd);
}
UserDerefObjectCo(DesktopWindow);
@ -800,7 +800,7 @@ MessageFound:
// if(MsgWindow)
// {
// UserDerefObject(MsgWindow);
// UserDereferenceObject(MsgWindow);
// }
return TRUE;
@ -1584,7 +1584,7 @@ co_IntDoSendMessage(HWND hWnd,
/* Must be handled by other thread */
// if (HWND_BROADCAST != hWnd)
// {
// UserDerefObject(Window);
// UserDereferenceObject(Window);
// }
Info.HandledByKernel = TRUE;
UserModeMsg.hwnd = hWnd;

View file

@ -89,7 +89,7 @@ IntCreateMonitorObject()
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 @@ void
IntDestroyMonitorObject(IN PMONITOR_OBJECT pMonitor)
{
RtlFreeUnicodeString(&pMonitor->DeviceName);
ObmDereferenceObject(pMonitor);
UserDereferenceObject(pMonitor);
}
@ -178,6 +178,8 @@ IntAttachMonitor(IN GDIDEVICE *pGdiDevice,
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 @@ IntAttachMonitor(IN GDIDEVICE *pGdiDevice,
}
Monitor->Prev = p;
}
UserDereferenceObject(Monitor);
return STATUS_SUCCESS;
}

View file

@ -282,7 +282,7 @@ co_MsqTranslateMouseMessage(PUSER_MESSAGE_QUEUE MessageQueue, HWND hWnd, UINT Fi
if(Msg == WM_MOUSEWHEEL)
{
Window = UserGetWindowObject(IntGetFocusWindow());
if (Window) UserRefObject(Window);
if (Window) UserReferenceObject(Window);
}
else
{
@ -290,7 +290,7 @@ co_MsqTranslateMouseMessage(PUSER_MESSAGE_QUEUE MessageQueue, HWND hWnd, UINT Fi
if(Window == NULL)
{
Window = ScopeWin;
if (Window) UserRefObject(Window);
if (Window) UserReferenceObject(Window);
}
else
{
@ -304,7 +304,7 @@ co_MsqTranslateMouseMessage(PUSER_MESSAGE_QUEUE MessageQueue, HWND hWnd, UINT Fi
/* 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 @@ co_MsqTranslateMouseMessage(PUSER_MESSAGE_QUEUE MessageQueue, HWND hWnd, UINT Fi
IntUnLockHardwareMessageQueue(Window->MessageQueue);
*Freed = FALSE;
UserDerefObject(Window);
UserDereferenceObject(Window);
return(FALSE);
}
@ -420,7 +420,7 @@ co_MsqTranslateMouseMessage(PUSER_MESSAGE_QUEUE MessageQueue, HWND hWnd, UINT Fi
IntUnLockHardwareMessageQueue(Window->MessageQueue);
}
UserDerefObject(Window);
UserDereferenceObject(Window);
*Freed = FALSE;
return(FALSE);
}
@ -459,7 +459,7 @@ co_MsqTranslateMouseMessage(PUSER_MESSAGE_QUEUE MessageQueue, HWND hWnd, UINT Fi
}
}
UserDerefObject(Window);
UserDereferenceObject(Window);
*Freed = FALSE;
return(TRUE);
}
@ -783,7 +783,7 @@ MsqPostHotKeyMessage(PVOID Thread, HWND hWnd, WPARAM wParam, LPARAM lParam)
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,

View file

@ -44,7 +44,7 @@ NTSTATUS FASTCALL InitUserImpl(VOID)
ExInitializeResourceLite(&UserLock);
if (!ObmCreateHandleTable())
if (!UserCreateHandleTable())
{
DPRINT1("Failed creating handle table\n");
return STATUS_INSUFFICIENT_RESOURCES;

View file

@ -69,7 +69,7 @@ __inline static PUSER_HANDLE_ENTRY alloc_user_entry(PUSER_HANDLE_TABLE ht)
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 @@ __inline static PUSER_HANDLE_ENTRY alloc_user_entry(PUSER_HANDLE_TABLE ht)
}
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 @@ HANDLE UserAllocHandle(PUSER_HANDLE_TABLE ht, PVOID object, USER_OBJECT_TYPE typ
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 @@ void *get_user_object_handle(PUSER_HANDLE_TABLE ht, HANDLE* handle, USER_OBJECT
return entry->ptr;
}
/* free a user handle and return a pointer to the object */
PVOID UserFreeHandle(PUSER_HANDLE_TABLE ht, HANDLE handle )
/* 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 FALSE;
}
return free_user_entry(ht, entry );
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 UserGetNextHandle(PUSER_HANDLE_TABLE ht, HANDLE* handle, USER_OBJECT_TYPE
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 @@ ObmCreateObject(PUSER_HANDLE_TABLE ht, HANDLE* h,USER_OBJECT_TYPE type , ULONG s
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 @@ ObmCreateObject(PUSER_HANDLE_TABLE ht, HANDLE* h,USER_OBJECT_TYPE type , ULONG s
}
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,26 +329,14 @@ ObmDeleteObject(HANDLE h, USER_OBJECT_TYPE type )
return FALSE;
hdr = USER_BODY_TO_HEADER(body);
ASSERT(hdr->RefCount >= 0);
ASSERT(hdr->RefCount >= 1);
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;
return UserFreeHandle(gHandleTable, h);
}
VOID FASTCALL ObmReferenceObject(PVOID obj)
VOID FASTCALL UserReferenceObject(PVOID obj)
{
PUSER_OBJECT_HEADER hdr = USER_BODY_TO_HEADER(obj);
@ -347,14 +345,29 @@ VOID FASTCALL ObmReferenceObject(PVOID obj)
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 @@ BOOL FASTCALL ObmDereferenceObject2(PVOID obj)
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 ObmDereferenceObject2(PVOID obj)
BOOL FASTCALL ObmCreateHandleTable()
BOOL FASTCALL UserCreateHandleTable()
{
PVOID mem;

View file

@ -414,7 +414,7 @@ static LRESULT co_UserFreeWindow(PWINDOW_OBJECT Window,
else
co_UserFreeWindow(Child, ProcessData, ThreadData, SendMessages);
UserDerefObject(Child);
UserDereferenceObject(Child);
}
}
ExFreePool(Children);
@ -491,8 +491,8 @@ static LRESULT co_UserFreeWindow(PWINDOW_OBJECT Window,
IntUnlinkWindow(Window);
UserRefObject(Window);
ObmDeleteObject(Window->hSelf, otWindow);
UserReferenceObject(Window);
UserDeleteObject(Window->hSelf, otWindow);
IntDestroyScrollBars(Window);
@ -510,7 +510,7 @@ static LRESULT co_UserFreeWindow(PWINDOW_OBJECT Window,
ASSERT(Window->Wnd != NULL);
UserFreeWindowInfo(Window->ti, Window);
UserDerefObject(Window);
UserDereferenceObject(Window);
IntClipboardFreeWindow(Window);
@ -989,7 +989,7 @@ IntSetOwner(HWND hWnd, HWND hWndNewOwner)
if (WndOldOwner)
{
ret = WndOldOwner->hSelf;
UserDerefObject(WndOldOwner);
UserDereferenceObject(WndOldOwner);
}
else
{
@ -1007,7 +1007,7 @@ IntSetOwner(HWND hWnd, HWND hWndNewOwner)
Wnd->Wnd->Owner = NULL;
}
UserDerefObject(Wnd);
UserDereferenceObject(Wnd);
return ret;
}
@ -1042,7 +1042,7 @@ co_IntSetParent(PWINDOW_OBJECT Wnd, PWINDOW_OBJECT WndNewParent)
WndOldParent = Wnd->Parent;
if (WndOldParent) UserRefObject(WndOldParent); /* caller must deref */
if (WndOldParent) UserReferenceObject(WndOldParent); /* caller must deref */
if (WndNewParent != WndOldParent)
{
@ -1064,9 +1064,9 @@ co_IntSetParent(PWINDOW_OBJECT Wnd, PWINDOW_OBJECT WndNewParent)
}
else
{
// UserRefObject(InsertAfter);
// UserReferenceObject(InsertAfter);
IntLinkWindow(Wnd, WndNewParent, InsertAfter /*prev sibling*/);
// UserDerefObject(InsertAfter);
// UserDereferenceObject(InsertAfter);
}
}
@ -1092,7 +1092,7 @@ co_IntSetParent(PWINDOW_OBJECT Wnd, PWINDOW_OBJECT WndNewParent)
// {
// if(!IntIsWindow(WndOldParent->hSelf))
// {
// UserDerefObject(WndOldParent);
// UserDereferenceObject(WndOldParent);
// return NULL;
// }
@ -1607,7 +1607,7 @@ co_IntCreateWindowEx(DWORD dwExStyle,
/* 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 @@ AllocErr:
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 @@ AllocErr:
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 @@ AllocErr:
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 @@ PWINDOW_OBJECT FASTCALL UserGetAncestor(PWINDOW_OBJECT Wnd, UINT Type)
}
//temp hack
// UserDerefObject(Parent);
// UserDereferenceObject(Parent);
WndAncestor = Parent;
}
@ -2935,7 +2939,7 @@ NtUserGetComboBoxInfo(
if (!(Wnd = UserGetWindowObject(hWnd)))
{
RETURN( FALSE );
}
}
_SEH_TRY
{
if(pcbi)
@ -2958,7 +2962,7 @@ NtUserGetComboBoxInfo(
CLEANUP:
DPRINT("Leave NtUserGetComboBoxInfo, ret=%i\n",_ret_);
UserLeave();
END_CLEANUP;
END_CLEANUP;
}
@ -3013,21 +3017,21 @@ NtUserGetListBoxInfo(
{
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 @@ co_UserSetParent(HWND hWndChild, HWND hWndNewParent)
if (WndOldParent)
{
hWndOldParent = WndOldParent->hSelf;
UserDerefObject(WndOldParent);
UserDereferenceObject(WndOldParent);
}
return( hWndOldParent);
@ -4599,7 +4603,7 @@ NtUserWindowFromPoint(LONG X, LONG Y)
RETURN( NULL);
CLEANUP:
if (Window) UserDerefObject(Window);
if (Window) UserDereferenceObject(Window);
if (DesktopWindow) UserDerefObjectCo(DesktopWindow);
DPRINT("Leave NtUserWindowFromPoint, ret=%i\n",_ret_);

View file

@ -1005,14 +1005,14 @@ co_WinPosSetWindowPos(
}
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 @@ co_WinPosSetWindowPos(
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 @@ co_WinPosSearchChildren(
continue;
}
if (*Window) UserDerefObject(*Window);
if (*Window) UserDereferenceObject(*Window);
*Window = Current;
UserRefObject(*Window);
UserReferenceObject(*Window);
if (CurrentWnd->Style & WS_MINIMIZE)
{