PostMessageA/W ignores messages containing pointers and returns
FALSE/LastError ERROR_INVALID_PAREMETER.
diff --git a/windows/message.c b/windows/message.c
index ee76d75..6c20ccc 100644
--- a/windows/message.c
+++ b/windows/message.c
@@ -1603,6 +1603,79 @@
}
/***********************************************************************
+ * MSG_IsPointerMessage
+ *
+ * Check whether this message (may) contain pointers.
+ * Those messages may not be PostMessage()d or GetMessage()d, but are dropped.
+ *
+ * FIXME: list of pointer messages might be incomplete.
+ *
+ * (We could do a generic !IsBadWritePtr() check, but this would cause too
+ * much slow down I think. MM20010206)
+ */
+static BOOL MSG_IsPointerMessage(UINT message, WPARAM wParam, LPARAM lParam) {
+ switch (message) {
+ case WM_CREATE:
+ case WM_NCCREATE:
+ case WM_COMPAREITEM:
+ case WM_DELETEITEM:
+ case WM_MEASUREITEM:
+ case WM_DRAWITEM:
+ case WM_GETMINMAXINFO:
+ case WM_GETTEXT:
+ case WM_SETTEXT:
+ case WM_MDICREATE:
+ case WM_MDIGETACTIVE:
+ case WM_NCCALCSIZE:
+ case WM_WINDOWPOSCHANGING:
+ case WM_WINDOWPOSCHANGED:
+ case WM_NOTIFY:
+ case WM_GETDLGCODE:
+ case WM_WININICHANGE:
+ case WM_HELP:
+ case WM_COPYDATA:
+ case WM_STYLECHANGING:
+ case WM_STYLECHANGED:
+ case WM_DROPOBJECT:
+ case WM_DRAGMOVE:
+ case WM_DRAGSELECT:
+ case WM_QUERYDROPOBJECT:
+
+ case CB_DIR:
+ case CB_ADDSTRING:
+ case CB_INSERTSTRING:
+ case CB_FINDSTRING:
+ case CB_FINDSTRINGEXACT:
+ case CB_SELECTSTRING:
+ case CB_GETLBTEXT:
+ case CB_GETDROPPEDCONTROLRECT:
+
+ case LB_DIR:
+ case LB_ADDFILE:
+ case LB_ADDSTRING:
+ case LB_INSERTSTRING:
+ case LB_GETTEXT:
+ case LB_GETITEMRECT:
+ case LB_FINDSTRING:
+ case LB_FINDSTRINGEXACT:
+ case LB_SELECTSTRING:
+ case LB_GETSELITEMS:
+ case LB_SETTABSTOPS:
+
+ case EM_REPLACESEL:
+ case EM_GETSEL:
+ case EM_GETRECT:
+ case EM_SETRECT:
+ case EM_SETRECTNP:
+ case EM_GETLINE:
+ case EM_SETTABSTOPS:
+ return TRUE;
+ default:
+ return FALSE;
+ }
+}
+
+/***********************************************************************
* MSG_PostMessage
*/
static BOOL MSG_PostMessage( int type, HWND hwnd, UINT message,
@@ -1611,6 +1684,20 @@
HQUEUE16 hQueue;
WND *wndPtr;
+ /* See thread on wine-devel around 6.2.2001. Basically posted messages
+ * that are known to contain pointers are dropped by the Windows 32bit
+ * PostMessage() with return FALSE; and invalid parameter last error.
+ * (tested against NT4 by Gerard Patel)
+ * 16 bit does not care, so we don't either.
+ */
+ if ( (type!=QMSG_WIN16) && MSG_IsPointerMessage(message,wParam,lParam)) {
+ FIXME("Ignoring posted pointer message 0x%04x to hwnd 0x%04x.\n",
+ message,hwnd
+ );
+ SetLastError(ERROR_INVALID_PARAMETER);
+ return FALSE;
+ }
+
if (hwnd == HWND_BROADCAST)
{
WND *pDesktop = WIN_GetDesktop();