user32: Pack the various owner-draw structures in messages to allow crossing 32/64 boundaries.
This commit is contained in:
parent
fcf8a81904
commit
9b5b55d9de
|
@ -76,12 +76,69 @@ struct packed_CREATESTRUCTW
|
||||||
DWORD __pad3;
|
DWORD __pad3;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct packed_DRAWITEMSTRUCT
|
||||||
|
{
|
||||||
|
UINT CtlType;
|
||||||
|
UINT CtlID;
|
||||||
|
UINT itemID;
|
||||||
|
UINT itemAction;
|
||||||
|
UINT itemState;
|
||||||
|
user_handle_t hwndItem;
|
||||||
|
DWORD __pad1;
|
||||||
|
user_handle_t hDC;
|
||||||
|
DWORD __pad2;
|
||||||
|
RECT rcItem;
|
||||||
|
ULONGLONG itemData;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct packed_MEASUREITEMSTRUCT
|
||||||
|
{
|
||||||
|
UINT CtlType;
|
||||||
|
UINT CtlID;
|
||||||
|
UINT itemID;
|
||||||
|
UINT itemWidth;
|
||||||
|
UINT itemHeight;
|
||||||
|
ULONGLONG itemData;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct packed_DELETEITEMSTRUCT
|
||||||
|
{
|
||||||
|
UINT CtlType;
|
||||||
|
UINT CtlID;
|
||||||
|
UINT itemID;
|
||||||
|
user_handle_t hwndItem;
|
||||||
|
DWORD __pad;
|
||||||
|
ULONGLONG itemData;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct packed_COMPAREITEMSTRUCT
|
||||||
|
{
|
||||||
|
UINT CtlType;
|
||||||
|
UINT CtlID;
|
||||||
|
user_handle_t hwndItem;
|
||||||
|
DWORD __pad1;
|
||||||
|
UINT itemID1;
|
||||||
|
ULONGLONG itemData1;
|
||||||
|
UINT itemID2;
|
||||||
|
ULONGLONG itemData2;
|
||||||
|
DWORD dwLocaleId;
|
||||||
|
DWORD __pad2;
|
||||||
|
};
|
||||||
|
|
||||||
/* the structures are unpacked on top of the packed ones, so make sure they fit */
|
/* 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_CREATESTRUCTW) >= sizeof(CREATESTRUCTW) );
|
||||||
|
C_ASSERT( sizeof(struct packed_DRAWITEMSTRUCT) >= sizeof(DRAWITEMSTRUCT) );
|
||||||
|
C_ASSERT( sizeof(struct packed_MEASUREITEMSTRUCT) >= sizeof(MEASUREITEMSTRUCT) );
|
||||||
|
C_ASSERT( sizeof(struct packed_DELETEITEMSTRUCT) >= sizeof(DELETEITEMSTRUCT) );
|
||||||
|
C_ASSERT( sizeof(struct packed_COMPAREITEMSTRUCT) >= sizeof(COMPAREITEMSTRUCT) );
|
||||||
|
|
||||||
union packed_structs
|
union packed_structs
|
||||||
{
|
{
|
||||||
struct packed_CREATESTRUCTW cs;
|
struct packed_CREATESTRUCTW cs;
|
||||||
|
struct packed_DRAWITEMSTRUCT dis;
|
||||||
|
struct packed_MEASUREITEMSTRUCT mis;
|
||||||
|
struct packed_DELETEITEMSTRUCT dls;
|
||||||
|
struct packed_COMPAREITEMSTRUCT cis;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* description of the data fields that need to be packed along with a sent message */
|
/* description of the data fields that need to be packed along with a sent message */
|
||||||
|
@ -621,17 +678,57 @@ static size_t pack_message( HWND hwnd, UINT message, WPARAM wparam, LPARAM lpara
|
||||||
push_data( data, (MINMAXINFO *)lparam, sizeof(MINMAXINFO) );
|
push_data( data, (MINMAXINFO *)lparam, sizeof(MINMAXINFO) );
|
||||||
return sizeof(MINMAXINFO);
|
return sizeof(MINMAXINFO);
|
||||||
case WM_DRAWITEM:
|
case WM_DRAWITEM:
|
||||||
push_data( data, (DRAWITEMSTRUCT *)lparam, sizeof(DRAWITEMSTRUCT) );
|
{
|
||||||
|
DRAWITEMSTRUCT *dis = (DRAWITEMSTRUCT *)lparam;
|
||||||
|
data->ps.dis.CtlType = dis->CtlType;
|
||||||
|
data->ps.dis.CtlID = dis->CtlID;
|
||||||
|
data->ps.dis.itemID = dis->itemID;
|
||||||
|
data->ps.dis.itemAction = dis->itemAction;
|
||||||
|
data->ps.dis.itemState = dis->itemState;
|
||||||
|
data->ps.dis.hwndItem = wine_server_user_handle( dis->hwndItem );
|
||||||
|
data->ps.dis.hDC = wine_server_user_handle( dis->hDC ); /* FIXME */
|
||||||
|
data->ps.dis.rcItem = dis->rcItem;
|
||||||
|
data->ps.dis.itemData = dis->itemData;
|
||||||
|
push_data( data, &data->ps.dis, sizeof(data->ps.dis) );
|
||||||
return 0;
|
return 0;
|
||||||
|
}
|
||||||
case WM_MEASUREITEM:
|
case WM_MEASUREITEM:
|
||||||
push_data( data, (MEASUREITEMSTRUCT *)lparam, sizeof(MEASUREITEMSTRUCT) );
|
{
|
||||||
return sizeof(MEASUREITEMSTRUCT);
|
MEASUREITEMSTRUCT *mis = (MEASUREITEMSTRUCT *)lparam;
|
||||||
|
data->ps.mis.CtlType = mis->CtlType;
|
||||||
|
data->ps.mis.CtlID = mis->CtlID;
|
||||||
|
data->ps.mis.itemID = mis->itemID;
|
||||||
|
data->ps.mis.itemWidth = mis->itemWidth;
|
||||||
|
data->ps.mis.itemHeight = mis->itemHeight;
|
||||||
|
data->ps.mis.itemData = mis->itemData;
|
||||||
|
push_data( data, &data->ps.mis, sizeof(data->ps.mis) );
|
||||||
|
return sizeof(data->ps.mis);
|
||||||
|
}
|
||||||
case WM_DELETEITEM:
|
case WM_DELETEITEM:
|
||||||
push_data( data, (DELETEITEMSTRUCT *)lparam, sizeof(DELETEITEMSTRUCT) );
|
{
|
||||||
|
DELETEITEMSTRUCT *dls = (DELETEITEMSTRUCT *)lparam;
|
||||||
|
data->ps.dls.CtlType = dls->CtlType;
|
||||||
|
data->ps.dls.CtlID = dls->CtlID;
|
||||||
|
data->ps.dls.itemID = dls->itemID;
|
||||||
|
data->ps.dls.hwndItem = wine_server_user_handle( dls->hwndItem );
|
||||||
|
data->ps.dls.itemData = dls->itemData;
|
||||||
|
push_data( data, &data->ps.dls, sizeof(data->ps.dls) );
|
||||||
return 0;
|
return 0;
|
||||||
|
}
|
||||||
case WM_COMPAREITEM:
|
case WM_COMPAREITEM:
|
||||||
push_data( data, (COMPAREITEMSTRUCT *)lparam, sizeof(COMPAREITEMSTRUCT) );
|
{
|
||||||
|
COMPAREITEMSTRUCT *cis = (COMPAREITEMSTRUCT *)lparam;
|
||||||
|
data->ps.cis.CtlType = cis->CtlType;
|
||||||
|
data->ps.cis.CtlID = cis->CtlID;
|
||||||
|
data->ps.cis.hwndItem = wine_server_user_handle( cis->hwndItem );
|
||||||
|
data->ps.cis.itemID1 = cis->itemID1;
|
||||||
|
data->ps.cis.itemData1 = cis->itemData1;
|
||||||
|
data->ps.cis.itemID2 = cis->itemID2;
|
||||||
|
data->ps.cis.itemData2 = cis->itemData2;
|
||||||
|
data->ps.cis.dwLocaleId = cis->dwLocaleId;
|
||||||
|
push_data( data, &data->ps.cis, sizeof(data->ps.cis) );
|
||||||
return 0;
|
return 0;
|
||||||
|
}
|
||||||
case WM_WINDOWPOSCHANGING:
|
case WM_WINDOWPOSCHANGING:
|
||||||
case WM_WINDOWPOSCHANGED:
|
case WM_WINDOWPOSCHANGED:
|
||||||
push_data( data, (WINDOWPOS *)lparam, sizeof(WINDOWPOS) );
|
push_data( data, (WINDOWPOS *)lparam, sizeof(WINDOWPOS) );
|
||||||
|
@ -885,17 +982,61 @@ static BOOL unpack_message( HWND hwnd, UINT message, WPARAM *wparam, LPARAM *lpa
|
||||||
minsize = sizeof(MINMAXINFO);
|
minsize = sizeof(MINMAXINFO);
|
||||||
break;
|
break;
|
||||||
case WM_DRAWITEM:
|
case WM_DRAWITEM:
|
||||||
minsize = sizeof(DRAWITEMSTRUCT);
|
{
|
||||||
|
DRAWITEMSTRUCT dis;
|
||||||
|
if (size < sizeof(ps->dis)) return FALSE;
|
||||||
|
dis.CtlType = ps->dis.CtlType;
|
||||||
|
dis.CtlID = ps->dis.CtlID;
|
||||||
|
dis.itemID = ps->dis.itemID;
|
||||||
|
dis.itemAction = ps->dis.itemAction;
|
||||||
|
dis.itemState = ps->dis.itemState;
|
||||||
|
dis.hwndItem = wine_server_ptr_handle( ps->dis.hwndItem );
|
||||||
|
dis.hDC = wine_server_ptr_handle( ps->dis.hDC );
|
||||||
|
dis.rcItem = ps->dis.rcItem;
|
||||||
|
dis.itemData = (ULONG_PTR)unpack_ptr( ps->dis.itemData );
|
||||||
|
memcpy( &ps->dis, &dis, sizeof(dis) );
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
case WM_MEASUREITEM:
|
case WM_MEASUREITEM:
|
||||||
minsize = sizeof(MEASUREITEMSTRUCT);
|
{
|
||||||
|
MEASUREITEMSTRUCT mis;
|
||||||
|
if (size < sizeof(ps->mis)) return FALSE;
|
||||||
|
mis.CtlType = ps->mis.CtlType;
|
||||||
|
mis.CtlID = ps->mis.CtlID;
|
||||||
|
mis.itemID = ps->mis.itemID;
|
||||||
|
mis.itemWidth = ps->mis.itemWidth;
|
||||||
|
mis.itemHeight = ps->mis.itemHeight;
|
||||||
|
mis.itemData = (ULONG_PTR)unpack_ptr( ps->mis.itemData );
|
||||||
|
memcpy( &ps->mis, &mis, sizeof(mis) );
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
case WM_DELETEITEM:
|
case WM_DELETEITEM:
|
||||||
minsize = sizeof(DELETEITEMSTRUCT);
|
{
|
||||||
|
DELETEITEMSTRUCT dls;
|
||||||
|
if (size < sizeof(ps->dls)) return FALSE;
|
||||||
|
dls.CtlType = ps->dls.CtlType;
|
||||||
|
dls.CtlID = ps->dls.CtlID;
|
||||||
|
dls.itemID = ps->dls.itemID;
|
||||||
|
dls.hwndItem = wine_server_ptr_handle( ps->dls.hwndItem );
|
||||||
|
dls.itemData = (ULONG_PTR)unpack_ptr( ps->dls.itemData );
|
||||||
|
memcpy( &ps->dls, &dls, sizeof(dls) );
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
case WM_COMPAREITEM:
|
case WM_COMPAREITEM:
|
||||||
minsize = sizeof(COMPAREITEMSTRUCT);
|
{
|
||||||
|
COMPAREITEMSTRUCT cis;
|
||||||
|
if (size < sizeof(ps->cis)) return FALSE;
|
||||||
|
cis.CtlType = ps->cis.CtlType;
|
||||||
|
cis.CtlID = ps->cis.CtlID;
|
||||||
|
cis.hwndItem = wine_server_ptr_handle( ps->cis.hwndItem );
|
||||||
|
cis.itemID1 = ps->cis.itemID1;
|
||||||
|
cis.itemData1 = (ULONG_PTR)unpack_ptr( ps->cis.itemData1 );
|
||||||
|
cis.itemID2 = ps->cis.itemID2;
|
||||||
|
cis.itemData2 = (ULONG_PTR)unpack_ptr( ps->cis.itemData2 );
|
||||||
|
cis.dwLocaleId = ps->cis.dwLocaleId;
|
||||||
|
memcpy( &ps->cis, &cis, sizeof(cis) );
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
case WM_WINDOWPOSCHANGING:
|
case WM_WINDOWPOSCHANGING:
|
||||||
case WM_WINDOWPOSCHANGED:
|
case WM_WINDOWPOSCHANGED:
|
||||||
case WM_WINE_SETWINDOWPOS:
|
case WM_WINE_SETWINDOWPOS:
|
||||||
|
@ -1147,8 +1288,17 @@ static void pack_reply( HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam,
|
||||||
push_data( data, (MINMAXINFO *)lparam, sizeof(MINMAXINFO) );
|
push_data( data, (MINMAXINFO *)lparam, sizeof(MINMAXINFO) );
|
||||||
break;
|
break;
|
||||||
case WM_MEASUREITEM:
|
case WM_MEASUREITEM:
|
||||||
push_data( data, (MEASUREITEMSTRUCT *)lparam, sizeof(MEASUREITEMSTRUCT) );
|
{
|
||||||
|
MEASUREITEMSTRUCT *mis = (MEASUREITEMSTRUCT *)lparam;
|
||||||
|
data->ps.mis.CtlType = mis->CtlType;
|
||||||
|
data->ps.mis.CtlID = mis->CtlID;
|
||||||
|
data->ps.mis.itemID = mis->itemID;
|
||||||
|
data->ps.mis.itemWidth = mis->itemWidth;
|
||||||
|
data->ps.mis.itemHeight = mis->itemHeight;
|
||||||
|
data->ps.mis.itemData = mis->itemData;
|
||||||
|
push_data( data, &data->ps.mis, sizeof(data->ps.mis) );
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
case WM_WINDOWPOSCHANGING:
|
case WM_WINDOWPOSCHANGING:
|
||||||
case WM_WINDOWPOSCHANGED:
|
case WM_WINDOWPOSCHANGED:
|
||||||
push_data( data, (WINDOWPOS *)lparam, sizeof(WINDOWPOS) );
|
push_data( data, (WINDOWPOS *)lparam, sizeof(WINDOWPOS) );
|
||||||
|
@ -1245,7 +1395,16 @@ static void unpack_reply( HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam,
|
||||||
memcpy( (MINMAXINFO *)lparam, buffer, min( sizeof(MINMAXINFO), size ));
|
memcpy( (MINMAXINFO *)lparam, buffer, min( sizeof(MINMAXINFO), size ));
|
||||||
break;
|
break;
|
||||||
case WM_MEASUREITEM:
|
case WM_MEASUREITEM:
|
||||||
memcpy( (MEASUREITEMSTRUCT *)lparam, buffer, min( sizeof(MEASUREITEMSTRUCT), size ));
|
if (size >= sizeof(ps->mis))
|
||||||
|
{
|
||||||
|
MEASUREITEMSTRUCT *mis = (MEASUREITEMSTRUCT *)lparam;
|
||||||
|
mis->CtlType = ps->mis.CtlType;
|
||||||
|
mis->CtlID = ps->mis.CtlID;
|
||||||
|
mis->itemID = ps->mis.itemID;
|
||||||
|
mis->itemWidth = ps->mis.itemWidth;
|
||||||
|
mis->itemHeight = ps->mis.itemHeight;
|
||||||
|
mis->itemData = (ULONG_PTR)unpack_ptr( ps->mis.itemData );
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case WM_WINDOWPOSCHANGING:
|
case WM_WINDOWPOSCHANGING:
|
||||||
case WM_WINDOWPOSCHANGED:
|
case WM_WINDOWPOSCHANGED:
|
||||||
|
|
Loading…
Reference in New Issue