{ WM_COPYGLOBALDATA, MMS_SIZE_WPARAM, MMS_FLAG_READ },
{ WM_WINDOWPOSCHANGED, sizeof(WINDOWPOS), MMS_FLAG_READWRITE },
{ WM_WINDOWPOSCHANGING, sizeof(WINDOWPOS), MMS_FLAG_READWRITE },
+ { WM_SIZING, sizeof(RECT), MMS_FLAG_READWRITE },
+ { WM_MOVING, sizeof(RECT), MMS_FLAG_READWRITE },
};
static PMSGMEMORY FASTCALL
break;
case WM_COPYDATA:
- Size = sizeof(COPYDATASTRUCT) + ((PCOPYDATASTRUCT)lParam)->cbData;
+ {
+ COPYDATASTRUCT *cds = (COPYDATASTRUCT *)lParam;
+ Size = sizeof(COPYDATASTRUCT) + cds->cbData;
+ }
break;
default:
return Status;
}
}
-
+ if (KernelModeMsg->message == WM_COPYDATA)
+ {
+ // Only the current process or thread can free the message lParam pointer.
+ return STATUS_SUCCESS;
+ }
ExFreePool((PVOID) KernelModeMsg->lParam);
}
LRESULT retval = 0;
PTHREADINFO pti;
PWND Window = NULL;
- HRGN hrgn;
BOOL DoCallBack = TRUE;
if (pMsg->hwnd)
if (pMsg->message == WM_PAINT)
{
+ PREGION Rgn;
Window->state2 &= ~WNDS2_WMPAINTSENT;
/* send a WM_NCPAINT and WM_ERASEBKGND if the non-client area is still invalid */
- hrgn = IntSysCreateRectRgn( 0, 0, 0, 0 );
- co_UserGetUpdateRgn( Window, hrgn, TRUE );
- GreDeleteObject(hrgn);
+ Rgn = IntSysCreateRectpRgn( 0, 0, 0, 0 );
+ co_UserGetUpdateRgn( Window, Rgn, TRUE );
+ REGION_Delete(Rgn);
}
return retval;
pti->timeLast = LargeTickCount.u.LowPart;
pti->pcti->tickLastMsgChecked = LargeTickCount.u.LowPart;
+ // Post mouse moves while looping through peek messages.
+ if (pti->MessageQueue->QF_flags & QF_MOUSEMOVED)
+ {
+ IntCoalesceMouseMove(pti);
+ }
+
/* Dispatch sent messages here. */
while ( co_MsqDispatchOneSentMessage(pti) )
{
}
/* Check for hardware events. */
- if ((ProcessMask & QS_MOUSE) &&
- co_MsqPeekMouseMove( pti,
- RemoveMessages,
- Window,
- MsgFilterMin,
- MsgFilterMax,
- Msg ))
- {
- return TRUE;
- }
-
if ((ProcessMask & QS_INPUT) &&
co_MsqPeekHardwareMessage( pti,
RemoveMessages,
KeQueryTickCount(&LargeTickCount);
Message.time = MsqCalculateMessageTime(&LargeTickCount);
- MsqPostMessage(pti, &Message, FALSE, QS_POSTMESSAGE, 0);
+ MsqPostMessage(pti, &Message, FALSE, QS_POSTMESSAGE, 0, 0);
return TRUE;
}
Window = UserGetWindowObject(Wnd);
if ( !Window )
{
- ERR("UserPostMessage: Invalid handle 0x%p!\n",Wnd);
+ ERR("UserPostMessage: Invalid handle 0x%p Msg %d!\n",Wnd,Msg);
return FALSE;
}
}
else
{
- MsqPostMessage(pti, &Message, FALSE, QS_POSTMESSAGE, 0);
+ MsqPostMessage(pti, &Message, FALSE, QS_POSTMESSAGE, 0, 0);
}
}
return TRUE;
CLEANUP:
if (Window) UserDerefObjectCo(Window);
+ // Current Thread and it's a Copy Data message, then free kernel memory.
+ if ( !ptiSendTo && Msg == WM_COPYDATA )
+ {
+ ExFreePool((PVOID) lParam);
+ }
END_CLEANUP;
}
{
RETURN(FALSE);
}
-
+
ptiSendTo = IntSendTo(Window, Win32Thread, Msg);
if (Msg & 0x80000000 &&
END_CLEANUP;
}
-
+#if 0
/*
This HACK function posts a message if the destination's message queue belongs to
another thread, otherwise it sends the message. It does not support broadcast
return (LRESULT)Result;
}
+#endif
static LRESULT FASTCALL
co_IntDoSendMessage( HWND hWnd,
WPARAM wParam,
LPARAM lParam)
{
- BOOL ret;
+ BOOL ret = FALSE;
PETHREAD peThread;
PTHREADINFO pThread;
NTSTATUS Status;
UserLeave();
- if (Ret == TRUE)
+ if (Ret)
{
_SEH2_TRY
{
((ClientInfo->CI_flags & CI_CURTHPRHOOK) ? 1 : 0),
(LPARAM)&CWP,
Hook->Proc,
- Hook->ihmod,
+ Hook->ihmod,
Hook->offPfn,
Hook->Ansi,
&Hook->ModuleName);
((ClientInfo->CI_flags & CI_CURTHPRHOOK) ? 1 : 0),
(LPARAM)&CWPR,
Hook->Proc,
- Hook->ihmod,
+ Hook->ihmod,
Hook->offPfn,
Hook->Ansi,
&Hook->ModuleName);
Status = ObReferenceObjectByHandle(hProcess,
PROCESS_QUERY_INFORMATION,
- PsProcessType,
+ *PsProcessType,
UserMode,
(PVOID*)&Process,
NULL);
TRACE("WFII: ppi %p\n", W32Process);
TRACE("WFII: waiting for %p\n", Handles[1] );
+
+ /*
+ * We must add a refcount to our current PROCESSINFO,
+ * because anything could happen (including process death) we're leaving win32k
+ */
+ IntReferenceProcessInfo(W32Process);
+
do
{
UserLeave();
pti->pClientInfo->dwTIFlags = pti->TIF_flags;
}
W32Process->W32PF_flags &= ~W32PF_WAITFORINPUTIDLE;
+ IntDereferenceProcessInfo(W32Process);
ObDereferenceObject(Process);
UserLeave();
return Status;