windows-nt/Source/XPSP1/NT/base/mvdm/wow32/wstruc.h
2020-09-26 16:20:57 +08:00

296 lines
12 KiB
C

/*++ BUILD Version: 0001
*
* WOW v1.0
*
* Copyright (c) 1991, Microsoft Corporation
*
* WSTRUC.H
* WOW32 16-bit structure conversion support
*
* History:
* Created 27-Jan-1991 by Jeff Parsons (jeffpar)
* Added GDI macro definitions 6/13/91, ChandanC
* Added MDI structures 1/20/91, BobDay
--*/
#ifndef _DEF_WSTRUC_ // if this hasn't already been included
#define _DEF_WSTRUC_
/* Structure conversion macros
*/
#define PUTINT16(vp,i) WOW32ASSERT(!(LOW(vp)&1));\
*(PSHORT16)GetPModeVDMPointer(vp, sizeof(SHORT)) = (SHORT)i;
#define PUTBOOL16(vp,b) WOW32ASSERT(!(LOW(vp)&1));\
if (FETCHDWORD(vp))\
*(PWORD16)GetPModeVDMPointer(vp, sizeof(WORD)) = (WORD)b;
#define STACKORHEAPALLOC(cBytesNeeded, cBytesAvail, lpStackBuffer) \
((INT)(cBytesNeeded) > (INT)(cBytesAvail)) ? (PVOID)malloc_w(cBytesNeeded) : \
(PVOID)(lpStackBuffer)
#define STACKORHEAPFREE(lpToFree, lpStackBuffer) \
if ((lpToFree) && (PVOID)(lpToFree) != (PVOID)(lpStackBuffer)) free_w(lpToFree)
#define PUTINTARRAY16(vp,c,p) putintarray16(FETCHDWORD(vp), c, p)
#define PUTINTARRAY16V(vp,c,p) putintarray16(vp, c, p)
// GETDWORDARRAY16 is not analogous to any of the above.
#define GETDWORDARRAY16(vp,c,p) {GETVDMPTR(vp, c*sizeof(DWORD), p);}
#define FREEDWORDARRAY16(p) {if (p) FREEVDMPTR(p);}
#define GETRECT16(vp,p) getrect16(FETCHDWORD(vp), p)
#define PUTRECT16(vp,p) putrect16(FETCHDWORD(vp), p)
// COPYPOINT16 is used by ClientToScreen because the point is passed
// directly as an argument, instead of a pointer to the point.
#define COPYPOINT16(Pt16,Pt) {Pt.x = Pt16.x; Pt.y = Pt16.y;}
#define GETPOINT16(vp,p) getpoint16(FETCHDWORD(vp), 1, p)
#define PUTPOINT16(vp,p) putpoint16(FETCHDWORD(vp), 1, p)
//
// Get/Put point array macros.
//
// These routines will use a static buffer if the number of points to
// be thunked is small enough. This will break badly if a thunk uses
// GETPOINTARRAY16 and then calls a function which calls back, since
// during the callback we could call another function which uses the
// same static buffer.
//
// As of 7-Jan-92 the only callers are in GDI, which doesn't call back,
// so we're OK.
//
// GETPOINTARRAY16 sometimes allocates memory, so you must call
// FREEPOINTARRAY16 once for every GETPOINTARRAY16.
//
#define PUTPOINTARRAY16(vp,c,p) putpoint16(FETCHDWORD(vp), c, p)
#define FREEMSG16(vp,lp)
#define GETWNDCLASS16(vp,lp) {\
WORD w;\
PWNDCLASS16 pwc16;\
GETVDMPTR(vp, sizeof(WNDCLASS16), pwc16);\
(lp)->style = FETCHWORD(pwc16->style);\
(lp)->lpfnWndProc = (WNDPROC)FETCHDWORD(pwc16->vpfnWndProc);\
(lp)->cbClsExtra = FETCHWORD(pwc16->cbClsExtra);\
(lp)->cbWndExtra = FETCHWORD(pwc16->cbWndExtra);\
w = FETCHWORD(pwc16->hInstance);\
if((w == gUser16hInstance) || (w == BOGUSGDT))\
(lp)->hInstance = ghInstanceUser32;\
else\
(lp)->hInstance = HMODINST32(FETCHWORD(pwc16->hInstance));\
(lp)->hIcon = HICON32_REGCLASS(FETCHWORD(pwc16->hIcon));\
(lp)->hCursor = HCURSOR32(FETCHWORD(pwc16->hCursor));\
w = FETCHWORD(pwc16->hbrBackground);\
if (w > COLOR_ENDCOLORS)\
(lp)->hbrBackground = HBRUSH32(w);\
else\
(lp)->hbrBackground = (HBRUSH)w;\
(lp)->lpszMenuName = (LPSTR)FETCHDWORD(pwc16->vpszMenuName);\
(lp)->lpszClassName = (LPSTR)FETCHDWORD(pwc16->vpszClassName);\
FREEVDMPTR(pwc16);\
}
#define GETBITMAP16(vp, lp) {\
PBITMAP16 pbm16;\
GETVDMPTR(vp, sizeof(BITMAP16), pbm16);\
(lp)->bmType = FETCHSHORT(pbm16->bmType);\
(lp)->bmWidth = FETCHSHORT(pbm16->bmWidth);\
(lp)->bmHeight = FETCHSHORT(pbm16->bmHeight);\
(lp)->bmWidthBytes = FETCHSHORT(pbm16->bmWidthBytes);\
(lp)->bmPlanes = pbm16->bmPlanes;\
(lp)->bmBitsPixel = pbm16->bmBitsPixel;\
GETMISCPTR(pbm16->bmBits, (lp)->bmBits);\
FREEVDMPTR(pbm16);\
}
#define PUTBITMAP16(vp,cb,lp) {\
PBITMAP16 pbm16;\
GETVDMPTR(vp, ((int)cb), pbm16);\
if (cb >= (FIELD_OFFSET(BITMAP16, bmType) + sizeof(pbm16->bmType)))\
STORESHORT(pbm16->bmType, (lp)->bmType);\
if (cb >= (FIELD_OFFSET(BITMAP16, bmWidth) + sizeof(pbm16->bmWidth)))\
STORESHORT(pbm16->bmWidth, (lp)->bmWidth);\
if (cb >= (FIELD_OFFSET(BITMAP16, bmHeight) + sizeof(pbm16->bmHeight)))\
STORESHORT(pbm16->bmHeight, (lp)->bmHeight);\
if (cb >= (FIELD_OFFSET(BITMAP16, bmWidthBytes) + sizeof(pbm16->bmWidthBytes)))\
STORESHORT(pbm16->bmWidthBytes, \
((int)((((lp)->bmWidth * (lp)->bmBitsPixel + 15) / 16) * 2)));\
if (cb >= (FIELD_OFFSET(BITMAP16, bmPlanes) + sizeof(pbm16->bmPlanes)))\
pbm16->bmPlanes = (BYTE)(lp)->bmPlanes;\
if (cb >= (FIELD_OFFSET(BITMAP16, bmBitsPixel) + sizeof(pbm16->bmBitsPixel)))\
pbm16->bmBitsPixel = (BYTE)(lp)->bmBitsPixel;\
if (cb >= (FIELD_OFFSET(BITMAP16, bmBits) + sizeof(pbm16->bmBits)))\
pbm16->bmBits = (VPBYTE)NULL;\
FLUSHVDMPTR(vp, cb, pbm16);\
FREEVDMPTR(pbm16);\
}
#define GETDCB16(vp,lp) // not implemented yet
#define PUTDCB16(vp,lp) // not implemented yet
#define PUTCOMSTAT16(vp,lp) // not implemented yet
#define PUTSEGINFO16(vp,lp) // not implemented yet
#define GETLOADPARMS16(vp,lp) // not implemented yet
#define PUTOFSTRUCT16(vp,lp) // not implemented yet
#define GETCATCHBUF16(vp,lp) // not implemented yet
#define PUTCATCHBUF16(vp,lp) // not implemented yet
#define GETLOGPEN16(vp, lp) {\
PLOGPEN16 plp16;\
GETVDMPTR(vp, sizeof(LOGPEN16), plp16);\
(lp)->lopnStyle = FETCHWORD(plp16->lopnStyle);\
(lp)->lopnWidth.x = FETCHSHORT(plp16->lopnWidth.x);\
(lp)->lopnColor = FETCHDWORD(plp16->lopnColor);\
FREEVDMPTR(plp16);\
}
#define PUTLOGPEN16(vp,cb,lp) {\
PLOGPEN16 plp16;\
GETVDMPTR(vp, cb, plp16);\
if (cb >= 2)\
STOREWORD(plp16->lopnStyle, (lp)->lopnStyle);\
if (cb >= 4)\
STOREWORD(plp16->lopnWidth.x, (lp)->lopnWidth.x);\
if (cb >= 6)\
STOREWORD(plp16->lopnWidth.y, (lp)->lopnWidth.y);\
if (cb >= 10)\
STOREDWORD(plp16->lopnColor, (lp)->lopnColor);\
FLUSHVDMPTR(vp, cb, plp16);\
FREEVDMPTR(plp16);\
}
#define GETLOGBRUSH16(vp,lp) {\
PLOGBRUSH16 plb16;\
WORD wStyle;\
GETVDMPTR(vp, sizeof(LOGBRUSH16), plb16);\
wStyle = FETCHWORD(plb16->lbStyle);\
(lp)->lbStyle = wStyle;\
(lp)->lbColor = FETCHDWORD(plb16->lbColor);\
if (wStyle == BS_PATTERN) { \
(lp)->lbHatch = (DWORD)HBITMAP32(FETCHWORD(plb16->lbHatch));\
} else { \
(lp)->lbHatch = FETCHWORD(plb16->lbHatch);\
} \
FREEVDMPTR(plb16);\
}
#define PUTLOGBRUSH16(vp,cb,lp) {\
PLOGBRUSH16 plb16;\
GETVDMPTR(vp, cb, plb16);\
if (cb >= 2)\
STOREWORD(plb16->lbStyle, (lp)->lbStyle);\
if (cb >= 6)\
STOREDWORD(plb16->lbColor, (lp)->lbColor);\
if (cb >= 8){\
if( ((lp)->lbStyle == BS_PATTERN) || ((lp)->lbStyle == BS_DIBPATTERN)){\
STORESHORT(plb16->lbHatch, GETHBITMAP16((HAND32)(lp)->lbHatch));\
}\
else {\
STORESHORT(plb16->lbHatch, (lp)->lbHatch);\
}\
}\
FLUSHVDMPTR(vp, cb, plb16);\
FREEVDMPTR(plb16);\
}
#define GETLOGFONT16(vp,p) getlogfont16(FETCHDWORD(vp), p)
#define PUTLOGFONT16(vp,cb,p) putlogfont16(FETCHDWORD(vp), cb, p)
#define PUTENUMLOGFONT16(vp,p) putenumlogfont16(FETCHDWORD(vp), p)
#define PUTTEXTMETRIC16(vp,p) puttextmetric16(FETCHDWORD(vp), p)
#define PUTNEWTEXTMETRIC16(vp,p) putnewtextmetric16(FETCHDWORD(vp), p)
#define PUTOUTLINETEXTMETRIC16(vp,c,p) putoutlinetextmetric16(vp,c,p)
#define ALLOCHANDLETABLE16(c,p) p=malloc_w(c*sizeof(HANDLE))
#define GETHANDLETABLE16(vp,c, p) gethandletable16(FETCHDWORD(vp), c, p)
#define PUTHANDLETABLE16(vp,c, p) puthandletable16(FETCHDWORD(vp), c, p)
#define FREEHANDLETABLE16(p) {if (p) free_w(p);}
#define FREEDEVMODE32(p) {if (p) free_w(p);}
#define GETCLIENTCREATESTRUCT16(vp,lp) { \
PCLIENTCREATESTRUCT16 pccs16;\
GETVDMPTR(vp, sizeof(CLIENTCREATESTRUCT16), pccs16);\
(lp)->hWindowMenu = HMENU32(FETCHWORD(pccs16->hWindowMenu));\
(lp)->idFirstChild = FETCHWORD(pccs16->idFirstChild);\
FREEVDMPTR(pccs16);\
}
#define PUTCLIENTCREATESTRUCT16(vp,lp) { \
PCLIENTCREATESTRUCT16 pccs16;\
GETVDMPTR(vp, sizeof(CLIENTCREATESTRUCT16), pccs16);\
STOREWORD(pccs16->hWindowMenu, GETHMENU16((lp)->hWindowMenu));\
STOREWORD(pccs16->idFirstChild, (lp)->idFirstChild);\
}
// following 2 for allocating a maximum sized BITMAPINFO structure from stack
#define MAXDIBCOLORS 256 // for biBitCount == 8
typedef struct _tagSTACKBMI32 {
BITMAPINFOHEADER bmiHeader;
RGBQUAD bmiColors[MAXDIBCOLORS];
} STACKBMI32, *LPSTACKBMI32;
/* Function prototypes
*/
VOID getstr16(VPSZ vpszSrc, LPSZ lpszDst, INT cb);
VOID putstr16(VPSZ vpszDst, LPCSTR lpszSrc, INT cb);
LPRECT getrect16(VPRECT16 vpRect, LPRECT lpRect);
VOID putrect16(VPRECT16 vpRect, LPRECT lpRect);
VOID getpoint16(VPPOINT16 vpPoint, INT c, LPPOINT lpPoint);
VOID putpoint16(VPPOINT16 vpPoint, INT c, LPPOINT lpPoint);
VOID getintarray16(VPINT16 vpInt, INT c, LPINT lpInt);
VOID putintarray16(VPINT16 vpInt, INT c, LPINT lpInt);
VOID getuintarray16(VPWORD vp, INT c, PUINT puint);
VOID getdrawitem16(VPDRAWITEMSTRUCT16 vpDI16, LPDRAWITEMSTRUCT lpDI);
VOID putdrawitem16(VPDRAWITEMSTRUCT16 vpDI16, LPDRAWITEMSTRUCT lpDI);
VOID getmeasureitem16(VPMEASUREITEMSTRUCT16 vpMI16, LPMEASUREITEMSTRUCT lpMI, HWND16 hwnd16);
VOID putmeasureitem16(VPMEASUREITEMSTRUCT16 vpMI16, LPMEASUREITEMSTRUCT lpMI);
VOID getdeleteitem16(VPDELETEITEMSTRUCT16 vpDI16, LPDELETEITEMSTRUCT lpDI);
VOID putdeleteitem16(VPDELETEITEMSTRUCT16 vpDI16, LPDELETEITEMSTRUCT lpDI);
VOID getcompareitem16(VPCOMPAREITEMSTRUCT16 vpCI16, LPCOMPAREITEMSTRUCT lpCI);
VOID putcompareitem16(VPCOMPAREITEMSTRUCT16 vpCI16, LPCOMPAREITEMSTRUCT lpCI);
VOID getmsg16(VPMSG16 vpmsg16, LPMSG lpmsg, LPMSGPARAMEX lpmpex);
ULONG putmsg16(VPMSG16 vpmsg16, LPMSG lpmsg);
VOID getlogfont16(VPLOGFONT16 vplf, LPLOGFONT lplf);
VOID putlogfont16(VPLOGFONT16 vplf, INT cb, LPLOGFONT lplf);
VOID putenumlogfont16(VPENUMLOGFONT16 vpelf, LPENUMLOGFONT lpelf);
VOID puttextmetric16(VPTEXTMETRIC16 vptm, LPTEXTMETRIC lptm);
VOID putnewtextmetric16(VPNEWTEXTMETRIC16 vpntm, LPNEWTEXTMETRIC lpntm);
VOID putoutlinetextmetric16(VPOUTLINETEXTMETRIC16 vpotm, INT cb, LPOUTLINETEXTMETRIC lpotm);
VOID gethandletable16(VPWORD vpht, UINT c, LPHANDLETABLE lpht);
VOID puthandletable16(VPWORD vpht, UINT c, LPHANDLETABLE lpht);
VOID putkerningpairs16(VPWORD vp, UINT cb, LPKERNINGPAIR lp);
#ifdef NOTUSED
BOOL getdropfilestruct16(HAND16 hand16, PHANDLE phand32);
#endif
INT GetBMI16Size(PVPVOID vpbmi16, WORD fuColorUse, LPDWORD lpdwClrUsed);
INT GetBMI32Size(LPBITMAPINFO lpbmi32, WORD fuColorUse);
LPBITMAPINFO CopyBMI16ToBMI32(PVPVOID vpbmi16, LPBITMAPINFO lpbmi32, WORD fuColorUse);
LPBITMAPINFOHEADER CopyBMIH16ToBMIH32(PVPVOID vpbmih16, LPBITMAPINFOHEADER lpbmih);
VOID getwindowpos16( VPWINDOWPOS16 vpwp, LPWINDOWPOS lpwp );
VOID putwindowpos16( VPWINDOWPOS16 vpwp, LPWINDOWPOS lpwp );
VOID W32CopyMsgStruct(VPMSG16 vpmsg16, LPMSG lpmsg, BOOL fThunk16To32);
VOID getpaintstruct16(VPVOID vp, LPPAINTSTRUCT lp);
VOID putpaintstruct16(VPVOID vp, LPPAINTSTRUCT lp);
VOID FASTCALL getmenuiteminfo16(VPVOID vp, LPMENUITEMINFO pmii32);
VOID FASTCALL putmenuiteminfo16(VPVOID vp, LPMENUITEMINFO pmii32);
LPDEVMODE ThunkDevMode16to32(VPDEVMODE31 vpdm16);
BOOL ThunkDevMode32to16(VPDEVMODE31 vpdm16, LPDEVMODE lpdm32, UINT nBytes);
#endif // ifndef _DEF_WSTRUC_ THIS SHOULD BE THE LAST LINE IN THIS FILE