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);
}
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) )
{
return TRUE;
}
- if ((ProcessMask & QS_MOUSE) &&
- co_MsqPeekMouseMove( pti,
- RemoveMessages,
- Window,
- MsgFilterMin,
- MsgFilterMax,
- Msg ))
- {
- return TRUE;
- }
-
/* Check for sent messages again. */
while ( co_MsqDispatchOneSentMessage(pti) )
{
KeQueryTickCount(&LargeTickCount);
Message.time = MsqCalculateMessageTime(&LargeTickCount);
- MsqPostMessage(pti, &Message, FALSE, QS_POSTMESSAGE, 0);
+ MsqPostMessage(pti, &Message, FALSE, QS_POSTMESSAGE, 0, 0);
return TRUE;
}
}
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;
}
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,
UserLeave();
- if (Ret == TRUE)
+ if (Ret)
{
_SEH2_TRY
{