Alexandre Julliard : user32: Pack the MSG 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: 3099b08aa21bf64586a6d15e35637c599e7cc7fb
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=3099b08aa21bf64586a6d15e35637c599e7cc7fb

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

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

---

 dlls/user32/message.c |   69 ++++++++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 62 insertions(+), 7 deletions(-)

diff --git a/dlls/user32/message.c b/dlls/user32/message.c
index 144cf5a..5bee54b 100644
--- a/dlls/user32/message.c
+++ b/dlls/user32/message.c
@@ -173,6 +173,18 @@ struct packed_NCCALCSIZE_PARAMS
     DWORD         __pad4;
 };
 
+struct packed_MSG
+{
+    user_handle_t hwnd;
+    DWORD         __pad1;
+    UINT          message;
+    ULONGLONG     wParam;
+    ULONGLONG     lParam;
+    DWORD         time;
+    POINT         pt;
+    DWORD         __pad2;
+};
+
 /* 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) );
@@ -183,6 +195,7 @@ C_ASSERT( sizeof(struct packed_WINDOWPOS) >= sizeof(WINDOWPOS) );
 C_ASSERT( sizeof(struct packed_COPYDATASTRUCT) >= sizeof(COPYDATASTRUCT) );
 C_ASSERT( sizeof(struct packed_HELPINFO) >= sizeof(HELPINFO) );
 C_ASSERT( sizeof(struct packed_NCCALCSIZE_PARAMS) >= sizeof(NCCALCSIZE_PARAMS) + sizeof(WINDOWPOS) );
+C_ASSERT( sizeof(struct packed_MSG) >= sizeof(MSG) );
 
 union packed_structs
 {
@@ -195,6 +208,7 @@ union packed_structs
     struct packed_COPYDATASTRUCT cds;
     struct packed_HELPINFO hi;
     struct packed_NCCALCSIZE_PARAMS ncp;
+    struct packed_MSG msg;
 };
 
 /* description of the data fields that need to be packed along with a sent message */
@@ -851,8 +865,19 @@ static size_t pack_message( HWND hwnd, UINT message, WPARAM wparam, LPARAM lpara
             return sizeof(data->ps.ncp);
         }
     case WM_GETDLGCODE:
-        if (lparam) push_data( data, (MSG *)lparam, sizeof(MSG) );
-        return sizeof(MSG);
+        if (lparam)
+        {
+            MSG *msg = (MSG *)lparam;
+            data->ps.msg.hwnd    = wine_server_user_handle( msg->hwnd );
+            data->ps.msg.message = msg->message;
+            data->ps.msg.wParam  = msg->wParam;
+            data->ps.msg.lParam  = msg->lParam;
+            data->ps.msg.time    = msg->time;
+            data->ps.msg.pt      = msg->pt;
+            push_data( data, &data->ps.msg, sizeof(data->ps.msg) );
+            return sizeof(data->ps.msg);
+        }
+        return 0;
     case SBM_SETSCROLLINFO:
         push_data( data, (SCROLLINFO *)lparam, sizeof(SCROLLINFO) );
         return 0;
@@ -1201,9 +1226,20 @@ static BOOL unpack_message( HWND hwnd, UINT message, WPARAM *wparam, LPARAM *lpa
         }
         break;
     case WM_GETDLGCODE:
-        if (!*lparam) return TRUE;
-        minsize = sizeof(MSG);
-        break;
+        if (*lparam)
+        {
+            MSG msg;
+            if (size < sizeof(ps->msg)) return FALSE;
+            msg.hwnd    = wine_server_ptr_handle( ps->msg.hwnd );
+            msg.message = ps->msg.message;
+            msg.wParam  = (ULONG_PTR)unpack_ptr( ps->msg.wParam );
+            msg.lParam  = (ULONG_PTR)unpack_ptr( ps->msg.lParam );
+            msg.time    = ps->msg.time;
+            msg.pt      = ps->msg.pt;
+            memcpy( &ps->msg, &msg, sizeof(msg) );
+            break;
+        }
+        return TRUE;
     case SBM_SETSCROLLINFO:
         minsize = sizeof(SCROLLINFO);
         break;
@@ -1442,7 +1478,17 @@ static void pack_reply( HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam,
         break;
     }
     case WM_GETDLGCODE:
-        if (lparam) push_data( data, (MSG *)lparam, sizeof(MSG) );
+        if (lparam)
+        {
+            MSG *msg = (MSG *)lparam;
+            data->ps.msg.hwnd    = wine_server_user_handle( msg->hwnd );
+            data->ps.msg.message = msg->message;
+            data->ps.msg.wParam  = msg->wParam;
+            data->ps.msg.lParam  = msg->lParam;
+            data->ps.msg.time    = msg->time;
+            data->ps.msg.pt      = msg->pt;
+            push_data( data, &data->ps.msg, sizeof(data->ps.msg) );
+        }
         break;
     case SBM_GETSCROLLINFO:
         push_data( data, (SCROLLINFO *)lparam, sizeof(SCROLLINFO) );
@@ -1568,7 +1614,16 @@ static void unpack_reply( HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam,
         }
         break;
     case WM_GETDLGCODE:
-        if (lparam) memcpy( (MSG *)lparam, buffer, min( sizeof(MSG), size ));
+        if (lparam && size >= sizeof(ps->msg))
+        {
+            MSG *msg = (MSG *)lparam;
+            msg->hwnd    = wine_server_ptr_handle( ps->msg.hwnd );
+            msg->message = ps->msg.message;
+            msg->wParam  = (ULONG_PTR)unpack_ptr( ps->msg.wParam );
+            msg->lParam  = (ULONG_PTR)unpack_ptr( ps->msg.lParam );
+            msg->time    = ps->msg.time;
+            msg->pt      = ps->msg.pt;
+        }
         break;
     case SBM_GETSCROLLINFO:
         memcpy( (SCROLLINFO *)lparam, buffer, min( sizeof(SCROLLINFO), size ));




More information about the wine-cvs mailing list