Alexandre Julliard : user32: Pack the HELPINFO structure in messages to allow crossing 32/64 boundaries .

Alexandre Julliard julliard at winehq.org
Wed Mar 31 10:04:48 CDT 2010


Module: wine
Branch: master
Commit: eba2ec4ab1d2b1dd92309ee1ea0543dadac8f320
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=eba2ec4ab1d2b1dd92309ee1ea0543dadac8f320

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Tue Mar 30 20:34:08 2010 +0200

user32: Pack the HELPINFO structure in messages to allow crossing 32/64 boundaries.

---

 dlls/user32/message.c |   35 +++++++++++++++++++++++++++++++++--
 1 files changed, 33 insertions(+), 2 deletions(-)

diff --git a/dlls/user32/message.c b/dlls/user32/message.c
index ef4c034..78fc72e 100644
--- a/dlls/user32/message.c
+++ b/dlls/user32/message.c
@@ -146,6 +146,17 @@ struct packed_COPYDATASTRUCT
     ULONGLONG lpData;
 };
 
+struct packed_HELPINFO
+{
+    UINT          cbSize;
+    INT           iContextType;
+    INT           iCtrlId;
+    user_handle_t hItemHandle;
+    DWORD         __pad;
+    ULONGLONG     dwContextId;
+    POINT         MousePos;
+};
+
 /* the structures are unpacked on top of the packed ones, so make sure they fit */
 C_ASSERT( sizeof(struct packed_CREATESTRUCTW) >= sizeof(CREATESTRUCTW) );
 C_ASSERT( sizeof(struct packed_DRAWITEMSTRUCT) >= sizeof(DRAWITEMSTRUCT) );
@@ -154,6 +165,7 @@ C_ASSERT( sizeof(struct packed_DELETEITEMSTRUCT) >= sizeof(DELETEITEMSTRUCT) );
 C_ASSERT( sizeof(struct packed_COMPAREITEMSTRUCT) >= sizeof(COMPAREITEMSTRUCT) );
 C_ASSERT( sizeof(struct packed_WINDOWPOS) >= sizeof(WINDOWPOS) );
 C_ASSERT( sizeof(struct packed_COPYDATASTRUCT) >= sizeof(COPYDATASTRUCT) );
+C_ASSERT( sizeof(struct packed_HELPINFO) >= sizeof(HELPINFO) );
 
 union packed_structs
 {
@@ -164,6 +176,7 @@ union packed_structs
     struct packed_COMPAREITEMSTRUCT cis;
     struct packed_WINDOWPOS wp;
     struct packed_COPYDATASTRUCT cds;
+    struct packed_HELPINFO hi;
 };
 
 /* description of the data fields that need to be packed along with a sent message */
@@ -783,8 +796,16 @@ static size_t pack_message( HWND hwnd, UINT message, WPARAM wparam, LPARAM lpara
         data->count = -1;
         return 0;
     case WM_HELP:
-        push_data( data, (HELPINFO *)lparam, sizeof(HELPINFO) );
+    {
+        HELPINFO *hi = (HELPINFO *)lparam;
+        data->ps.hi.iContextType = hi->iContextType;
+        data->ps.hi.iCtrlId      = hi->iCtrlId;
+        data->ps.hi.hItemHandle  = wine_server_user_handle( hi->hItemHandle );
+        data->ps.hi.dwContextId  = hi->dwContextId;
+        data->ps.hi.MousePos     = hi->MousePos;
+        push_data( data, &data->ps.hi, sizeof(data->ps.hi) );
         return 0;
+    }
     case WM_STYLECHANGING:
     case WM_STYLECHANGED:
         push_data( data, (STYLESTRUCT *)lparam, sizeof(STYLESTRUCT) );
@@ -1114,8 +1135,18 @@ static BOOL unpack_message( HWND hwnd, UINT message, WPARAM *wparam, LPARAM *lpa
         /* WM_NOTIFY cannot be sent across processes (MSDN) */
         return FALSE;
     case WM_HELP:
-        minsize = sizeof(HELPINFO);
+    {
+        HELPINFO hi;
+        if (size < sizeof(ps->hi)) return FALSE;
+        hi.cbSize       = sizeof(hi);
+        hi.iContextType = ps->hi.iContextType;
+        hi.iCtrlId      = ps->hi.iCtrlId;
+        hi.hItemHandle  = wine_server_ptr_handle( ps->hi.hItemHandle );
+        hi.dwContextId  = (ULONG_PTR)unpack_ptr( ps->hi.dwContextId );
+        hi.MousePos     = ps->hi.MousePos;
+        memcpy( &ps->hi, &hi, sizeof(hi) );
         break;
+    }
     case WM_STYLECHANGING:
     case WM_STYLECHANGED:
         minsize = sizeof(STYLESTRUCT);




More information about the wine-cvs mailing list