fix referencing bug (ros crashed during setup if mousemove) in
co_WinPosSearchChildren
Modified: trunk/reactos/subsys/win32k/include/userfuncs.h
Modified: trunk/reactos/subsys/win32k/ntuser/message.c
Modified: trunk/reactos/subsys/win32k/ntuser/object.c
Modified: trunk/reactos/subsys/win32k/ntuser/winpos.c
_____
Modified: trunk/reactos/subsys/win32k/include/userfuncs.h
--- trunk/reactos/subsys/win32k/include/userfuncs.h 2005-09-11
20:41:39 UTC (rev 17808)
+++ trunk/reactos/subsys/win32k/include/userfuncs.h 2005-09-11
21:05:32 UTC (rev 17809)
@@ -14,14 +14,15 @@
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;\
@@ -59,7 +60,7 @@
VOID FASTCALL ObmReferenceObject(PVOID obj);
-BOOL FASTCALL ObmDereferenceObject(PVOID obj);
+BOOL FASTCALL ObmDereferenceObject2(PVOID obj);
PWINDOW_OBJECT FASTCALL IntGetWindowObject(HWND hWnd);
PVOID FASTCALL
_____
Modified: trunk/reactos/subsys/win32k/ntuser/message.c
--- trunk/reactos/subsys/win32k/ntuser/message.c 2005-09-11
20:41:39 UTC (rev 17808)
+++ trunk/reactos/subsys/win32k/ntuser/message.c 2005-09-11
21:05:32 UTC (rev 17809)
@@ -773,7 +773,7 @@
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 */
@@ -782,7 +782,7 @@
/* eat the message, search again */
goto CheckMessages;
}
-
+
if(ThreadQueue->CaptureWindow == NULL)
{
co_IntSendHitTestMessages(ThreadQueue, &Msg->Msg);
_____
Modified: trunk/reactos/subsys/win32k/ntuser/object.c
--- trunk/reactos/subsys/win32k/ntuser/object.c 2005-09-11 20:41:39 UTC
(rev 17808)
+++ trunk/reactos/subsys/win32k/ntuser/object.c 2005-09-11 21:05:32 UTC
(rev 17809)
@@ -275,7 +275,7 @@
}
-BOOL FASTCALL ObmDereferenceObject(PVOID obj)
+BOOL FASTCALL ObmDereferenceObject2(PVOID obj)
{
PUSER_OBJECT_HEADER hdr = USER_BODY_TO_HEADER(obj);
_____
Modified: trunk/reactos/subsys/win32k/ntuser/winpos.c
--- trunk/reactos/subsys/win32k/ntuser/winpos.c 2005-09-11 20:41:39 UTC
(rev 17808)
+++ trunk/reactos/subsys/win32k/ntuser/winpos.c 2005-09-11 21:05:32 UTC
(rev 17809)
@@ -1483,20 +1483,23 @@
}
#endif
+/* wine server: child_window_from_point
+Caller must dereference the "returned" Window
+*/
static
VOID FASTCALL
co_WinPosSearchChildren(
PWINDOW_OBJECT ScopeWin,
PUSER_MESSAGE_QUEUE OnlyHitTests,
POINT *Point,
- PWINDOW_OBJECT* Window,
+ PWINDOW_OBJECT* Window,
USHORT *HitTest
)
{
PWINDOW_OBJECT Current;
HWND *List, *phWnd;
-
+
ASSERT_REFS_CO(ScopeWin);
if ((List = IntWinListChildren(ScopeWin)))
@@ -1517,24 +1520,24 @@
continue;
}
- if (!IntPtInWindow(Current, Point->x, Point->y))
+ if (!IntPtInWindow(Current, Point->x, Point->y))
{
- continue;
+ continue;
}
-
+
+ if (*Window) UserDerefObject(*Window);
*Window = Current;
+ UserRefObject(*Window);
if (Current->Style & WS_MINIMIZE)
{
*HitTest = HTCAPTION;
- UserRefObject(Current);
break;
}
if (Current->Style & WS_DISABLED)
{
*HitTest = HTERROR;
- UserRefObject(Current);
break;
}
@@ -1561,13 +1564,12 @@
co_WinPosSearchChildren(Current, OnlyHitTests, Point,
Window, HitTest);
}
- UserRefObject(Current);
UserDerefObjectCo(Current);
break;
}
ExFreePool(List);
- }
+ }
}
/* wine: WINPOS_WindowFromPoint */