Alexandre Julliard : user32: Pack the NCCALCSIZE_PARAMS 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: bbdd742a49c4ea78eb2fbafabf145e613e868f7e
URL: http://source.winehq.org/git/wine.git/?a=commit;h=bbdd742a49c4ea78eb2fbafabf145e613e868f7e
Author: Alexandre Julliard <julliard at winehq.org>
Date: Tue Mar 30 20:36:04 2010 +0200
user32: Pack the NCCALCSIZE_PARAMS structure in messages to allow crossing 32/64 boundaries.
---
dlls/user32/message.c | 91 ++++++++++++++++++++++++++++++++++++++-----------
1 files changed, 71 insertions(+), 20 deletions(-)
diff --git a/dlls/user32/message.c b/dlls/user32/message.c
index 78fc72e..144cf5a 100644
--- a/dlls/user32/message.c
+++ b/dlls/user32/message.c
@@ -157,6 +157,22 @@ struct packed_HELPINFO
POINT MousePos;
};
+struct packed_NCCALCSIZE_PARAMS
+{
+ RECT rgrc[3];
+ ULONGLONG __pad1;
+ user_handle_t hwnd;
+ DWORD __pad2;
+ user_handle_t hwndInsertAfter;
+ DWORD __pad3;
+ INT x;
+ INT y;
+ INT cx;
+ INT cy;
+ UINT flags;
+ DWORD __pad4;
+};
+
/* 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) );
@@ -166,6 +182,7 @@ 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) );
+C_ASSERT( sizeof(struct packed_NCCALCSIZE_PARAMS) >= sizeof(NCCALCSIZE_PARAMS) + sizeof(WINDOWPOS) );
union packed_structs
{
@@ -177,6 +194,7 @@ union packed_structs
struct packed_WINDOWPOS wp;
struct packed_COPYDATASTRUCT cds;
struct packed_HELPINFO hi;
+ struct packed_NCCALCSIZE_PARAMS ncp;
};
/* description of the data fields that need to be packed along with a sent message */
@@ -818,10 +836,19 @@ static size_t pack_message( HWND hwnd, UINT message, WPARAM wparam, LPARAM lpara
}
else
{
- NCCALCSIZE_PARAMS *nc = (NCCALCSIZE_PARAMS *)lparam;
- push_data( data, nc, sizeof(*nc) );
- push_data( data, nc->lppos, sizeof(*nc->lppos) );
- return sizeof(*nc) + sizeof(*nc->lppos);
+ NCCALCSIZE_PARAMS *ncp = (NCCALCSIZE_PARAMS *)lparam;
+ data->ps.ncp.rgrc[0] = ncp->rgrc[0];
+ data->ps.ncp.rgrc[1] = ncp->rgrc[1];
+ data->ps.ncp.rgrc[2] = ncp->rgrc[2];
+ data->ps.ncp.hwnd = wine_server_user_handle( ncp->lppos->hwnd );
+ data->ps.ncp.hwndInsertAfter = wine_server_user_handle( ncp->lppos->hwndInsertAfter );
+ data->ps.ncp.x = ncp->lppos->x;
+ data->ps.ncp.y = ncp->lppos->y;
+ data->ps.ncp.cx = ncp->lppos->cx;
+ data->ps.ncp.cy = ncp->lppos->cy;
+ data->ps.ncp.flags = ncp->lppos->flags;
+ push_data( data, &data->ps.ncp, sizeof(data->ps.ncp) );
+ return sizeof(data->ps.ncp);
}
case WM_GETDLGCODE:
if (lparam) push_data( data, (MSG *)lparam, sizeof(MSG) );
@@ -1155,9 +1182,22 @@ static BOOL unpack_message( HWND hwnd, UINT message, WPARAM *wparam, LPARAM *lpa
if (!*wparam) minsize = sizeof(RECT);
else
{
- NCCALCSIZE_PARAMS *nc = *buffer;
- if (size < sizeof(*nc) + sizeof(*nc->lppos)) return FALSE;
- nc->lppos = (WINDOWPOS *)(nc + 1);
+ NCCALCSIZE_PARAMS ncp;
+ WINDOWPOS wp;
+ if (size < sizeof(ps->ncp)) return FALSE;
+ ncp.rgrc[0] = ps->ncp.rgrc[0];
+ ncp.rgrc[1] = ps->ncp.rgrc[1];
+ ncp.rgrc[2] = ps->ncp.rgrc[2];
+ wp.hwnd = wine_server_ptr_handle( ps->ncp.hwnd );
+ wp.hwndInsertAfter = wine_server_ptr_handle( ps->ncp.hwndInsertAfter );
+ wp.x = ps->ncp.x;
+ wp.y = ps->ncp.y;
+ wp.cx = ps->ncp.cx;
+ wp.cy = ps->ncp.cy;
+ wp.flags = ps->ncp.flags;
+ ncp.lppos = (WINDOWPOS *)((NCCALCSIZE_PARAMS *)&ps->ncp + 1);
+ memcpy( &ps->ncp, &ncp, sizeof(ncp) );
+ *ncp.lppos = wp;
}
break;
case WM_GETDLGCODE:
@@ -1431,9 +1471,18 @@ static void pack_reply( HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam,
push_data( data, (RECT *)lparam, sizeof(RECT) );
else
{
- NCCALCSIZE_PARAMS *nc = (NCCALCSIZE_PARAMS *)lparam;
- push_data( data, nc, sizeof(*nc) );
- push_data( data, nc->lppos, sizeof(*nc->lppos) );
+ NCCALCSIZE_PARAMS *ncp = (NCCALCSIZE_PARAMS *)lparam;
+ data->ps.ncp.rgrc[0] = ncp->rgrc[0];
+ data->ps.ncp.rgrc[1] = ncp->rgrc[1];
+ data->ps.ncp.rgrc[2] = ncp->rgrc[2];
+ data->ps.ncp.hwnd = wine_server_user_handle( ncp->lppos->hwnd );
+ data->ps.ncp.hwndInsertAfter = wine_server_user_handle( ncp->lppos->hwndInsertAfter );
+ data->ps.ncp.x = ncp->lppos->x;
+ data->ps.ncp.y = ncp->lppos->y;
+ data->ps.ncp.cx = ncp->lppos->cx;
+ data->ps.ncp.cy = ncp->lppos->cy;
+ data->ps.ncp.flags = ncp->lppos->flags;
+ push_data( data, &data->ps.ncp, sizeof(data->ps.ncp) );
}
break;
case EM_GETSEL:
@@ -1554,17 +1603,19 @@ static void unpack_reply( HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam,
case WM_NCCALCSIZE:
if (!wparam)
memcpy( (RECT *)lparam, buffer, min( sizeof(RECT), size ));
- else
+ else if (size >= sizeof(ps->ncp))
{
- NCCALCSIZE_PARAMS *nc = (NCCALCSIZE_PARAMS *)lparam;
- WINDOWPOS *wp = nc->lppos;
- memcpy( nc, buffer, min( sizeof(*nc), size ));
- if (size > sizeof(*nc))
- {
- size -= sizeof(*nc);
- memcpy( wp, (NCCALCSIZE_PARAMS*)buffer + 1, min( sizeof(*wp), size ));
- }
- nc->lppos = wp; /* restore the original pointer */
+ NCCALCSIZE_PARAMS *ncp = (NCCALCSIZE_PARAMS *)lparam;
+ ncp->rgrc[0] = ps->ncp.rgrc[0];
+ ncp->rgrc[1] = ps->ncp.rgrc[1];
+ ncp->rgrc[2] = ps->ncp.rgrc[2];
+ ncp->lppos->hwnd = wine_server_ptr_handle( ps->ncp.hwnd );
+ ncp->lppos->hwndInsertAfter = wine_server_ptr_handle( ps->ncp.hwndInsertAfter );
+ ncp->lppos->x = ps->ncp.x;
+ ncp->lppos->y = ps->ncp.y;
+ ncp->lppos->cx = ps->ncp.cx;
+ ncp->lppos->cy = ps->ncp.cy;
+ ncp->lppos->flags = ps->ncp.flags;
}
break;
case EM_GETSEL:
More information about the wine-cvs
mailing list