-refcount reworking (simplification & improvement) -make functions deal with pointers, not handles -misc formatting Modified: trunk/reactos/subsys/win32k/eng/window.c Modified: trunk/reactos/subsys/win32k/include/userfuncs.h Modified: trunk/reactos/subsys/win32k/include/window.h Modified: trunk/reactos/subsys/win32k/ntuser/class.c Modified: trunk/reactos/subsys/win32k/ntuser/desktop.c Modified: trunk/reactos/subsys/win32k/ntuser/focus.c Modified: trunk/reactos/subsys/win32k/ntuser/message.c Modified: trunk/reactos/subsys/win32k/ntuser/misc.c Modified: trunk/reactos/subsys/win32k/ntuser/msgqueue.c Modified: trunk/reactos/subsys/win32k/ntuser/object.c Modified: trunk/reactos/subsys/win32k/ntuser/painting.c Modified: trunk/reactos/subsys/win32k/ntuser/timer.c Modified: trunk/reactos/subsys/win32k/ntuser/windc.c Modified: trunk/reactos/subsys/win32k/ntuser/window.c Modified: trunk/reactos/subsys/win32k/ntuser/winpos.c Modified: trunk/reactos/subsys/win32k/objects/color.c _____
Modified: trunk/reactos/subsys/win32k/eng/window.c --- trunk/reactos/subsys/win32k/eng/window.c 2005-09-11 14:38:57 UTC (rev 17801) +++ trunk/reactos/subsys/win32k/eng/window.c 2005-09-11 14:48:32 UTC (rev 17802) @@ -287,7 +287,7 @@
}
/* Get window object */ - Window = IntGetWindowObject(WndObjInt->Hwnd); + Window = UserGetWindowObject(WndObjInt->Hwnd); if (Window == NULL) { DPRINT1("Warning: Couldnt get window object for WndObjInt->Hwnd!!!\n"); @@ -297,7 +297,6 @@ { /* Remove object from window */ RemoveEntryList(&WndObjInt->ListEntry); - IntReleaseWindowObject(Window); }
if (!calledFromUser){ _____
Modified: trunk/reactos/subsys/win32k/include/userfuncs.h --- trunk/reactos/subsys/win32k/include/userfuncs.h 2005-09-11 14:38:57 UTC (rev 17801) +++ trunk/reactos/subsys/win32k/include/userfuncs.h 2005-09-11 14:48:32 UTC (rev 17802) @@ -2,15 +2,57 @@
#define _WIN32K_USERFUNCS_H
-#define ASSERT_REFS_CO(obj) \ + + + +PMENU_OBJECT FASTCALL UserGetMenuObject(HMENU hMenu); + + +#if 0 +#define ObmDereferenceObject(_obj_) \ { \ - LONG ref = USER_BODY_TO_HEADER(obj)->RefCount;\ + DPRINT1("obj 0x%x dereffed to %i refs\n",_obj_, USER_BODY_TO_HEADER(_obj_)->RefCount-1); \ + ObmDereferenceObject2(_obj_); \ +} +#endif + + + + + + + +#define ASSERT_REFS_CO(_obj_) \ +{ \ + LONG ref = USER_BODY_TO_HEADER(_obj_)->RefCount;\ if (!(ref >= 1)){ \ - DPRINT1("obj 0x%x, refs %i\n", obj, ref); \ + DPRINT1("ASSERT: obj 0x%x, refs %i\n", _obj_, ref); \ ASSERT(FALSE); \ } \ }
+#if 0 +#define ASSERT_REFS_CO(_obj_) \ +{ \ + PSINGLE_LIST_ENTRY e; \ + BOOL gotit=FALSE; \ + LONG ref = USER_BODY_TO_HEADER(_obj_)->RefCount;\ + if (!(ref >= 1)){ \ + DPRINT1("obj 0x%x, refs %i\n", _obj_, ref); \ + ASSERT(FALSE); \ + } \ + \ + e = PsGetWin32Thread()->ReferencesList.Next; \ + while (e) \ + { \ + PUSER_REFERENCE_ENTRY ref = CONTAINING_RECORD(e, USER_REFERENCE_ENTRY, Entry); \ + if (ref->obj == _obj_){ gotit=TRUE; break; } \ + e = e->Next; \ + } \ + ASSERT(gotit); \ +} +#endif + #define DUMP_REFS(obj) DPRINT1("obj 0x%x, refs %i\n",obj, USER_BODY_TO_HEADER(obj)->RefCount)
@@ -19,11 +61,6 @@ VOID FASTCALL ObmReferenceObject(PVOID obj); BOOL FASTCALL ObmDereferenceObject(PVOID obj);
-#define IntReferenceWindowObject(o) ObmReferenceObject(o) - -#define UserDerefObject(o) ObmReferenceObject(o) - -VOID FASTCALL IntReleaseWindowObject(PWINDOW_OBJECT Window); PWINDOW_OBJECT FASTCALL IntGetWindowObject(HWND hWnd); PVOID FASTCALL ObmCreateObject(PUSER_HANDLE_TABLE ht, HANDLE* h,USER_OBJECT_TYPE type , ULONG size); @@ -31,8 +68,8 @@ BOOL FASTCALL ObmDeleteObject(HANDLE h, USER_OBJECT_TYPE type );
-//#define UserRefObjectCo(o) ObmReferenceObject(o) -//#define UserDerefObjectCo(o) ObmDereferenceObject(o) +#define UserRefObject(o) ObmReferenceObject(o) +#define UserDerefObject(o) ObmDereferenceObject(o) BOOL FASTCALL ObmCreateHandleTable();
_____
Modified: trunk/reactos/subsys/win32k/include/window.h --- trunk/reactos/subsys/win32k/include/window.h 2005-09-11 14:38:57 UTC (rev 17801) +++ trunk/reactos/subsys/win32k/include/window.h 2005-09-11 14:48:32 UTC (rev 17802) @@ -157,7 +157,7 @@
IntIsWindowVisible (PWINDOW_OBJECT Window);
BOOL FASTCALL -IntIsChildWindow (HWND Parent, HWND Child); +IntIsChildWindow (PWINDOW_OBJECT Parent, PWINDOW_OBJECT Child);
VOID FASTCALL IntUnlinkWindow(PWINDOW_OBJECT Wnd); @@ -174,8 +174,6 @@ PWINDOW_OBJECT FASTCALL IntGetOwner(PWINDOW_OBJECT Wnd);
-PWINDOW_OBJECT FASTCALL -IntGetParentObject(PWINDOW_OBJECT Wnd);
INT FASTCALL IntGetWindowRgn(PWINDOW_OBJECT Window, HRGN hRgn); _____
Modified: trunk/reactos/subsys/win32k/ntuser/class.c --- trunk/reactos/subsys/win32k/ntuser/class.c 2005-09-11 14:38:57 UTC (rev 17801) +++ trunk/reactos/subsys/win32k/ntuser/class.c 2005-09-11 14:48:32 UTC (rev 17802) @@ -559,8 +559,6 @@
void FASTCALL co_IntSetClassLong(PWINDOW_OBJECT Window, ULONG Offset, LONG dwNewLong, BOOL Ansi) { - PWINDOW_OBJECT Parent, Owner; - ASSERT_REFS_CO(Window);
if ((int)Offset >= 0) @@ -591,25 +589,11 @@ break; case GCL_HICON: Window->Class->hIcon = (HICON)dwNewLong; - Owner = IntGetOwner(Window); - Parent = IntGetParent(Window);
- if ((!Owner) && (!Parent)) + if (!IntGetOwner(Window) && !IntGetParent(Window)) { co_IntShellHookNotify(HSHELL_REDRAW, (LPARAM) Window->hSelf); } - - if (Parent) - { - IntReleaseWindowObject(Parent); - } - - if (Owner) - { - IntReleaseWindowObject(Owner); - } - - break; case GCL_HICONSM: Window->Class->hIconSm = (HICON)dwNewLong; _____
Modified: trunk/reactos/subsys/win32k/ntuser/desktop.c --- trunk/reactos/subsys/win32k/ntuser/desktop.c 2005-09-11 14:38:57 UTC (rev 17801) +++ trunk/reactos/subsys/win32k/ntuser/desktop.c 2005-09-11 14:48:32 UTC (rev 17802) @@ -463,7 +463,6 @@
PWINDOW_OBJECT FASTCALL UserGetDesktopWindow(VOID) { PDESKTOP_OBJECT pdo = IntGetActiveDesktop(); - PWINDOW_OBJECT DeskWnd;
if (!pdo) { @@ -471,11 +470,7 @@ return NULL; }
- //temp hack - DeskWnd = IntGetWindowObject(pdo->DesktopWindow); - if (DeskWnd) - IntReleaseWindowObject(DeskWnd); - return DeskWnd; + return UserGetWindowObject(pdo->DesktopWindow); }
@@ -1190,15 +1185,12 @@ IntGdiGetClipBox(hDC, &Rect);
hWndDesktop = IntGetDesktopWindow(); - if (!(WndDesktop = IntGetWindowObject(hWndDesktop))) + if (!(WndDesktop = UserGetWindowObject(hWndDesktop))) return FALSE;
DesktopBrush = (HBRUSH)IntGetClassLong(WndDesktop, GCL_HBRBACKGROUND, FALSE); //fixme: verify retval
- //temp hack - IntReleaseWindowObject(WndDesktop);
- /* * Paint desktop background */ @@ -1207,7 +1199,7 @@ { PWINDOW_OBJECT DeskWin;
- if((DeskWin = IntGetWindowObject(hWndDesktop))) + if((DeskWin = UserGetWindowObject(hWndDesktop))) { SIZE sz; int x, y; @@ -1215,8 +1207,8 @@
sz.cx = DeskWin->WindowRect.right - DeskWin->WindowRect.left; sz.cy = DeskWin->WindowRect.bottom - DeskWin->WindowRect.top; - IntReleaseWindowObject(DeskWin);
+ x = (sz.cx / 2) - (WinSta->cxWallpaper / 2); y = (sz.cy / 2) - (WinSta->cyWallpaper / 2);
_____
Modified: trunk/reactos/subsys/win32k/ntuser/focus.c --- trunk/reactos/subsys/win32k/ntuser/focus.c 2005-09-11 14:38:57 UTC (rev 17801) +++ trunk/reactos/subsys/win32k/ntuser/focus.c 2005-09-11 14:48:32 UTC (rev 17802) @@ -61,10 +61,13 @@
VOID FASTCALL co_IntSendActivateMessages(HWND hWndPrev, HWND hWnd, BOOL MouseActivate) { - PWINDOW_OBJECT Window, Owner, Parent; - - if (hWnd && (Window = IntGetWindowObject(hWnd))) + PWINDOW_OBJECT Window; + + if ((Window = UserGetWindowObject(hWnd))) { + + UserRefObjectCo(Window); + /* Send palette messages */ if (co_IntPostOrSendMessage(hWnd, WM_QUERYNEWPALETTE, 0, 0)) { @@ -76,22 +79,12 @@ co_WinPosSetWindowPos(Window, HWND_TOP, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOSENDCHANGING);
- - Owner = IntGetOwner(Window); - if (!Owner) + if (!IntGetOwner(Window) && !IntGetParent(Window)) { - Parent = IntGetParent(Window); - if (!Parent) - co_IntShellHookNotify(HSHELL_WINDOWACTIVATED, (LPARAM) hWnd); - else - IntReleaseWindowObject(Parent); + co_IntShellHookNotify(HSHELL_WINDOWACTIVATED, (LPARAM) hWnd); } - else - { - IntReleaseWindowObject(Owner); - }
- IntReleaseWindowObject(Window); + UserDerefObjectCo(Window);
/* FIXME: IntIsWindow */
@@ -130,17 +123,15 @@
for(Child = Root->FirstChild; Child; Child = Child->NextSibling) { - OwnerWnd = IntGetWindowObject(Child->hOwner); + OwnerWnd = UserGetWindowObject(Child->hOwner); if(!OwnerWnd) continue;
if(OwnerWnd == Owner) { Ret = Child->hSelf; - IntReleaseWindowObject(OwnerWnd); return Ret; } - IntReleaseWindowObject(OwnerWnd); }
return NULL; @@ -215,9 +206,9 @@ }
BOOL FASTCALL -co_IntSetForegroundWindow(PWINDOW_OBJECT Window) +co_IntSetForegroundWindow(PWINDOW_OBJECT Window)//FIXME: can Window be NULL?? { - ASSERT_REFS_CO(Window); + /*if (Window)*/ ASSERT_REFS_CO(Window);
return co_IntSetForegroundAndFocusWindow(Window, Window, FALSE); } @@ -234,18 +225,18 @@ { BOOL Ret; PWINDOW_OBJECT TopWnd; - PWINDOW_OBJECT DesktopWindow = IntGetWindowObject(IntGetDesktopWindow()); + PWINDOW_OBJECT DesktopWindow = UserGetWindowObject(IntGetDesktopWindow()); if(DesktopWindow) { Top = IntFindChildWindowToOwner(DesktopWindow, Window); - if((TopWnd = IntGetWindowObject(Top))) + if((TopWnd = UserGetWindowObject(Top))) { + UserRefObjectCo(TopWnd); Ret = co_IntMouseActivateWindow(TopWnd); - IntReleaseWindowObject(TopWnd); - IntReleaseWindowObject(DesktopWindow); + UserDerefObjectCo(TopWnd); + return Ret; } - IntReleaseWindowObject(DesktopWindow); } return FALSE; } @@ -253,23 +244,6 @@
TopWindow = UserGetAncestor(Window, GA_ROOT); if (!TopWindow) return FALSE; -// if (TopWindow != Window) -// { - -// Top = UserGetAncestor(Window, GA_ROOT); -// if (Top != Window->hSelf) -// { -// TopWindow = IntGetWindowObject(Top); -// if (TopWindow == NULL) -// { -// SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE); -// return FALSE; -// } -// } -// else -// { -// TopWindow = Window; -// }
/* TMN: Check return valud from this function? */ UserRefObjectCo(TopWindow); @@ -278,10 +252,6 @@
UserDerefObjectCo(TopWindow);
-// if (TopWindow != Window) -// { -// IntReleaseWindowObject(TopWindow); -// } return TRUE; }
_____
Modified: trunk/reactos/subsys/win32k/ntuser/message.c --- trunk/reactos/subsys/win32k/ntuser/message.c 2005-09-11 14:38:57 UTC (rev 17801) +++ trunk/reactos/subsys/win32k/ntuser/message.c 2005-09-11 14:48:32 UTC (rev 17802) @@ -318,7 +318,6 @@
{ NTSTATUS Status; NTUSERDISPATCHMESSAGEINFO MsgInfo; - PWINDOW_OBJECT WindowObject; LRESULT Result = TRUE; DECLARE_RETURN(LRESULT);
@@ -352,19 +351,19 @@ } else { + PWINDOW_OBJECT Window; + /* Get the window object. */ - WindowObject = IntGetWindowObject(MsgInfo.Msg.hwnd); - if (NULL == WindowObject) + Window = UserGetWindowObject(MsgInfo.Msg.hwnd); + if (NULL == Window) { - SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE); MsgInfo.HandledByKernel = TRUE; Result = 0; } else { - if (WindowObject->OwnerThread != PsGetCurrentThread()) + if (Window->OwnerThread != PsGetCurrentThread()) { - IntReleaseWindowObject(WindowObject); DPRINT1("Window doesn't belong to the calling thread!\n"); MsgInfo.HandledByKernel = TRUE; Result = 0; @@ -375,30 +374,29 @@
MsgInfo.HandledByKernel = FALSE; Result = 0; - if (0xFFFF0000 != ((DWORD) WindowObject->WndProcW & 0xFFFF0000)) + if (0xFFFF0000 != ((DWORD) Window->WndProcW & 0xFFFF0000)) { - if (0xFFFF0000 != ((DWORD) WindowObject->WndProcA & 0xFFFF0000)) + if (0xFFFF0000 != ((DWORD) Window->WndProcA & 0xFFFF0000)) { /* Both Unicode and Ansi winprocs are real, use whatever usermode prefers */ - MsgInfo.Proc = (MsgInfo.Ansi ? WindowObject->WndProcA - : WindowObject->WndProcW); + MsgInfo.Proc = (MsgInfo.Ansi ? Window->WndProcA + : Window->WndProcW); } else { /* Real Unicode winproc */ MsgInfo.Ansi = FALSE; - MsgInfo.Proc = WindowObject->WndProcW; + MsgInfo.Proc = Window->WndProcW; } } else { /* Must have real Ansi winproc */ MsgInfo.Ansi = TRUE; - MsgInfo.Proc = WindowObject->WndProcA; + MsgInfo.Proc = Window->WndProcA; } } - IntReleaseWindowObject(WindowObject); } } Status = MmCopyToCaller(UnsafeMsgInfo, &MsgInfo, sizeof(NTUSERDISPATCHMESSAGEINFO)); @@ -511,13 +509,15 @@ ULONG Result; PWINDOW_OBJECT Parent;
+ ASSERT_REFS_CO(MsgWindow); + if(*HitTest == (USHORT)HTTRANSPARENT) { /* eat the message, search again! */ return TRUE; }
- Parent = IntGetParent(MsgWindow); + Parent = IntGetParent(MsgWindow);//fixme: deref retval? /* fixme: abort if no parent ? */ Result = co_IntSendMessage(MsgWindow->hSelf, WM_MOUSEACTIVATE, @@ -548,12 +548,14 @@ { PWINDOW_OBJECT Window;
- if(!(Window = IntGetWindowObject(Msg->hwnd))) + if(!(Window = UserGetWindowObject(Msg->hwnd))) { /* let's just eat the message?! */ return TRUE; }
+ UserRefObjectCo(Window); + if(ThreadQueue == Window->MessageQueue && ThreadQueue->CaptureWindow != Window->hSelf) { @@ -566,10 +568,12 @@ PWINDOW_OBJECT DesktopWindow; HWND hDesktop = IntGetDesktopWindow();
- if((DesktopWindow = IntGetWindowObject(hDesktop))) + if((DesktopWindow = UserGetWindowObject(hDesktop))) { PWINDOW_OBJECT Wnd; - + + UserRefObjectCo(DesktopWindow); + co_WinPosWindowFromPoint(DesktopWindow, Window->MessageQueue, &Msg->pt, &Wnd); if(Wnd) { @@ -585,15 +589,15 @@ }
/* eat the message */ - IntReleaseWindowObject(Wnd); - IntReleaseWindowObject(Window); - IntReleaseWindowObject(DesktopWindow); + UserDerefObject(Wnd); + UserDerefObjectCo(DesktopWindow); + UserDerefObjectCo(Window); return TRUE; } - IntReleaseWindowObject(Wnd); + UserDerefObject(Wnd); }
- IntReleaseWindowObject(DesktopWindow); + UserDerefObjectCo(DesktopWindow); } } } @@ -641,7 +645,7 @@ } }
- IntReleaseWindowObject(Window); + UserDerefObjectCo(Window); return FALSE; }
@@ -651,7 +655,7 @@ */ BOOL FASTCALL co_IntPeekMessage(PUSER_MESSAGE Msg, - HWND Wnd, + HWND hWnd, UINT MsgFilterMin, UINT MsgFilterMax, UINT RemoveMsg) @@ -703,7 +707,7 @@ Present = co_MsqFindMessage(ThreadQueue, FALSE, RemoveMessages, - Wnd, + hWnd, MsgFilterMin, MsgFilterMax, &Message); @@ -721,7 +725,7 @@ Present = co_MsqFindMessage(ThreadQueue, TRUE, RemoveMessages, - Wnd, + hWnd, MsgFilterMin, MsgFilterMax, &Message); @@ -740,14 +744,14 @@ ;
/* Check for paint messages. */ - if (IntGetPaintMessage(Wnd, MsgFilterMin, MsgFilterMax, PsGetWin32Thread(), &Msg->Msg, RemoveMessages)) + if (IntGetPaintMessage(hWnd, MsgFilterMin, MsgFilterMax, PsGetWin32Thread(), &Msg->Msg, RemoveMessages)) { Msg->FreeLParam = FALSE; return TRUE; }
/* Check for WM_(SYS)TIMER messages */ - Present = MsqGetTimerMessage(ThreadQueue, Wnd, MsgFilterMin, MsgFilterMax, + Present = MsqGetTimerMessage(ThreadQueue, hWnd, MsgFilterMin, MsgFilterMax, &Msg->Msg, RemoveMessages); if (Present) { @@ -763,19 +767,22 @@ { PWINDOW_OBJECT MsgWindow = NULL;
- if(Msg->Msg.hwnd && (MsgWindow = IntGetWindowObject(Msg->Msg.hwnd)) && + if(Msg->Msg.hwnd && (MsgWindow = UserGetWindowObject(Msg->Msg.hwnd)) && Msg->Msg.message >= WM_MOUSEFIRST && Msg->Msg.message <= WM_MOUSELAST) { USHORT HitTest;
+ UserRefObjectCo(MsgWindow); + if(co_IntTranslateMouseMessage(ThreadQueue, &Msg->Msg, &HitTest, TRUE)) /* FIXME - check message filter again, if the message doesn't match anymore, search again */ { - IntReleaseWindowObject(MsgWindow); + UserDerefObjectCo(MsgWindow); /* eat the message, search again */ goto CheckMessages; } + if(ThreadQueue->CaptureWindow == NULL) { co_IntSendHitTestMessages(ThreadQueue, &Msg->Msg); @@ -783,21 +790,23 @@ IS_BTN_MESSAGE(Msg->Msg.message, DOWN) && co_IntActivateWindowMouse(ThreadQueue, &Msg->Msg, MsgWindow, &HitTest)) { - IntReleaseWindowObject(MsgWindow); + UserDerefObjectCo(MsgWindow); /* eat the message, search again */ goto CheckMessages; } } + + UserDerefObjectCo(MsgWindow); } else { co_IntSendHitTestMessages(ThreadQueue, &Msg->Msg); }
- if(MsgWindow) - { - IntReleaseWindowObject(MsgWindow); - } +// if(MsgWindow) +// { +// UserDerefObject(MsgWindow); +// }
return TRUE; } @@ -820,7 +829,7 @@
BOOL STDCALL NtUserPeekMessage(PNTUSERGETMESSAGEINFO UnsafeInfo, - HWND Wnd, + HWND hWnd, UINT MsgFilterMin, UINT MsgFilterMax, UINT RemoveMsg) @@ -839,17 +848,12 @@ UserEnterExclusive();
/* Validate input */ - if (NULL != Wnd) + if (hWnd && hWnd != INVALID_HANDLE_VALUE) { - Window = IntGetWindowObject(Wnd); - if (NULL == Window) + if (!(Window = UserGetWindowObject(hWnd))) { - Wnd = NULL; + RETURN(-1); } - else - { - IntReleaseWindowObject(Window); - } }
if (MsgFilterMax < MsgFilterMin) @@ -858,7 +862,7 @@ MsgFilterMax = 0; }
- Present = co_IntPeekMessage(&Msg, Wnd, MsgFilterMin, MsgFilterMax, RemoveMsg); + Present = co_IntPeekMessage(&Msg, hWnd, MsgFilterMin, MsgFilterMax, RemoveMsg); if (Present) { Info.Msg = Msg.Msg; @@ -945,7 +949,7 @@
BOOL STDCALL NtUserGetMessage(PNTUSERGETMESSAGEINFO UnsafeInfo, - HWND Wnd, + HWND hWnd, UINT MsgFilterMin, UINT MsgFilterMax) /* @@ -962,7 +966,7 @@ BOOL GotMessage; NTUSERGETMESSAGEINFO Info; NTSTATUS Status; - PWINDOW_OBJECT Window; + PWINDOW_OBJECT Window = NULL; PMSGMEMORY MsgMemoryEntry; PVOID UserMem; UINT Size; @@ -973,14 +977,13 @@ UserEnterExclusive();
/* Validate input */ - if (NULL != Wnd) + if (hWnd && !(Window = UserGetWindowObject(hWnd))) { - Window = IntGetWindowObject(Wnd); - if(!Window) - Wnd = NULL; - else - IntReleaseWindowObject(Window); + RETURN(-1); } + +// if (Window) UserRefObjectCo(Window); + if (MsgFilterMax < MsgFilterMin) { MsgFilterMin = 0; @@ -989,7 +992,7 @@
do { - GotMessage = co_IntPeekMessage(&Msg, Wnd, MsgFilterMin, MsgFilterMax, PM_REMOVE); + GotMessage = co_IntPeekMessage(&Msg, hWnd, MsgFilterMin, MsgFilterMax, PM_REMOVE); if (GotMessage) { Info.Msg = Msg.Msg; @@ -1038,7 +1041,7 @@ RETURN( (BOOL) -1); } } - else if (! co_IntWaitMessage(Wnd, MsgFilterMin, MsgFilterMax)) + else if (! co_IntWaitMessage(hWnd, MsgFilterMin, MsgFilterMax)) { RETURN( (BOOL) -1); } @@ -1048,6 +1051,8 @@ RETURN( WM_QUIT != Info.Msg.message);
CLEANUP: +// if (Window) UserDerefObjectCo(Window); + DPRINT("Leave NtUserGetMessage\n"); UserLeave(); END_CLEANUP; @@ -1169,7 +1174,6 @@ WPARAM wParam, LPARAM lParam) { - PWINDOW_OBJECT Window; MSG UserModeMsg, KernelModeMsg; LARGE_INTEGER LargeTickCount; NTSTATUS Status; @@ -1185,9 +1189,9 @@ PWINDOW_OBJECT DesktopWindow; ULONG i;
- DesktopWindow = IntGetWindowObject(IntGetDesktopWindow()); + DesktopWindow = UserGetWindowObject(IntGetDesktopWindow()); List = IntWinListChildren(DesktopWindow); - IntReleaseWindowObject(DesktopWindow); + if (List != NULL) { for (i = 0; List[i]; i++) @@ -1197,15 +1201,15 @@ } else { - Window = IntGetWindowObject(Wnd); + PWINDOW_OBJECT Window; + + Window = UserGetWindowObject(Wnd); if (NULL == Window) { - SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE); return FALSE; } if(Window->Status & WINDOWSTATUS_DESTROYING) { - IntReleaseWindowObject(Window); DPRINT1("Attempted to post message to window 0x%x that is being destroyed!\n", Wnd); /* FIXME - last error code? */ return FALSE; @@ -1229,7 +1233,6 @@ MsqPostMessage(Window->MessageQueue, &KernelModeMsg, NULL != MsgMemoryEntry && 0 != KernelModeMsg.lParam, QS_POSTMESSAGE); - IntReleaseWindowObject(Window); }
return TRUE; @@ -1336,7 +1339,8 @@ return 0; }
-static LRESULT FASTCALL +static +LRESULT FASTCALL co_IntSendMessageTimeoutSingle(HWND hWnd, UINT Msg, WPARAM wParam, @@ -1347,19 +1351,20 @@ { ULONG_PTR Result; NTSTATUS Status; - PWINDOW_OBJECT Window; + PWINDOW_OBJECT Window = NULL; PMSGMEMORY MsgMemoryEntry; INT lParamBufferSize; LPARAM lParamPacked; PW32THREAD Win32Thread; + DECLARE_RETURN(LRESULT);
/* FIXME: Call hooks. */ - Window = IntGetWindowObject(hWnd); - if (!Window) + if (!(Window = UserGetWindowObject(hWnd))) { - SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE); - return FALSE; + RETURN( FALSE); } + + UserRefObjectCo(Window);
Win32Thread = PsGetWin32Thread();
@@ -1369,8 +1374,7 @@ if (Win32Thread->IsExiting) { /* Never send messages to exiting threads */ - IntReleaseWindowObject(Window); - return FALSE; + RETURN( FALSE); }
/* See if this message type is present in the table */ @@ -1386,9 +1390,8 @@
if (! NT_SUCCESS(PackParam(&lParamPacked, Msg, wParam, lParam))) { - IntReleaseWindowObject(Window); DPRINT1("Failed to pack message parameters\n"); - return FALSE; + RETURN( FALSE); } if (0xFFFF0000 != ((DWORD) Window->WndProcW & 0xFFFF0000)) { @@ -1408,46 +1411,47 @@
if (! NT_SUCCESS(UnpackParam(lParamPacked, Msg, wParam, lParam))) { - IntReleaseWindowObject(Window); DPRINT1("Failed to unpack message parameters\n"); - return TRUE; + RETURN( TRUE); }
- IntReleaseWindowObject(Window); - return TRUE; + RETURN( TRUE); }
if(uFlags & SMTO_ABORTIFHUNG && MsqIsHung(Window->MessageQueue)) { - IntReleaseWindowObject(Window); /* FIXME - Set a LastError? */ - return FALSE; + RETURN( FALSE); }
if(Window->Status & WINDOWSTATUS_DESTROYING) { - IntReleaseWindowObject(Window); /* FIXME - last error? */ DPRINT1("Attempted to send message to window 0x%x that is being destroyed!\n", hWnd); - return FALSE; + RETURN( FALSE); }
Status = co_MsqSendMessage(Window->MessageQueue, hWnd, Msg, wParam, lParam, uTimeout, (uFlags & SMTO_BLOCK), FALSE, uResult); - IntReleaseWindowObject(Window); + + if (STATUS_TIMEOUT == Status) { /* MSDN says GetLastError() should return 0 after timeout */ SetLastWin32Error(0); - return FALSE; + RETURN( FALSE); } else if (! NT_SUCCESS(Status)) { SetLastNtError(Status); - return FALSE; + RETURN( FALSE); }
- return TRUE; + RETURN( TRUE); + +CLEANUP: + if (Window) UserDerefObjectCo(Window); + END_CLEANUP; }
LRESULT FASTCALL @@ -1468,14 +1472,14 @@ return co_IntSendMessageTimeoutSingle(hWnd, Msg, wParam, lParam, uFlags, uTimeout, uResult); }
- DesktopWindow = IntGetWindowObject(IntGetDesktopWindow()); + DesktopWindow = UserGetWindowObject(IntGetDesktopWindow()); if (NULL == DesktopWindow) { SetLastWin32Error(ERROR_INTERNAL_ERROR); return 0; } + Children = IntWinListChildren(DesktopWindow); - IntReleaseWindowObject(DesktopWindow); if (NULL == Children) { return 0; @@ -1509,10 +1513,8 @@ return 0; }
- Window = IntGetWindowObject(hWnd); - if(!Window) + if(!(Window = UserGetWindowObject(hWnd))) { - SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE); return 0; }
@@ -1528,13 +1530,11 @@ } }
- IntReleaseWindowObject(Window); - return (LRESULT)Result; }
LRESULT FASTCALL -co_IntDoSendMessage(HWND Wnd, +co_IntDoSendMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam, @@ -1552,15 +1552,14 @@ RtlZeroMemory(&Info, sizeof(NTUSERSENDMESSAGEINFO));
/* FIXME: Call hooks. */ - if (HWND_BROADCAST != Wnd) + if (HWND_BROADCAST != hWnd) { - Window = IntGetWindowObject(Wnd); + Window = UserGetWindowObject(hWnd); if (NULL == Window) { /* Tell usermode to not touch this one */ Info.HandledByKernel = TRUE; MmCopyToCaller(UnsafeInfo, &Info, sizeof(NTUSERSENDMESSAGEINFO)); - SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE); return 0; } } @@ -1568,7 +1567,7 @@ /* FIXME: Check for an exiting window. */
/* See if the current thread can handle the message */ - if (HWND_BROADCAST != Wnd && NULL != PsGetWin32Thread() && + if (HWND_BROADCAST != hWnd && NULL != PsGetWin32Thread() && Window->MessageQueue == PsGetWin32Thread()->MessageQueue) { /* Gather the information usermode needs to call the window proc directly */ @@ -1599,17 +1598,16 @@ Info.Ansi = TRUE; Info.Proc = Window->WndProcA; } - IntReleaseWindowObject(Window); } else { /* Must be handled by other thread */ - if (HWND_BROADCAST != Wnd) - { - IntReleaseWindowObject(Window); - } +// if (HWND_BROADCAST != hWnd) +// { +// UserDerefObject(Window); +// } Info.HandledByKernel = TRUE; - UserModeMsg.hwnd = Wnd; + UserModeMsg.hwnd = hWnd; UserModeMsg.message = Msg; UserModeMsg.wParam = wParam; UserModeMsg.lParam = lParam; _____
Modified: trunk/reactos/subsys/win32k/ntuser/misc.c --- trunk/reactos/subsys/win32k/ntuser/misc.c 2005-09-11 14:38:57 UTC (rev 17801) +++ trunk/reactos/subsys/win32k/ntuser/misc.c 2005-09-11 14:48:32 UTC (rev 17802) @@ -182,35 +182,30 @@
{ case ONEPARAM_ROUTINE_GETMENU: { - PWINDOW_OBJECT WindowObject; + PWINDOW_OBJECT Window; DWORD Result;
- WindowObject = IntGetWindowObject((HWND)Param); - if(!WindowObject) + if(!(Window = UserGetWindowObject((HWND)Param))) { - SetLastWin32Error(ERROR_INVALID_WINDOW_HANDLE); RETURN( FALSE); } [truncated at 1000 lines; 2536 more skipped]