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

199 lines
6.2 KiB
C

/*++
*
* WOW v1.0
*
* Copyright (c) 1991, Microsoft Corporation
*
* WMSGCB.C
* WOW32 16-bit message thunks
*
* History:
* Created 11-Mar-1991 by Jeff Parsons (jeffpar)
--*/
#include "precomp.h"
#pragma hdrstop
MODNAME(wmsgcb.c);
#ifdef DEBUG
MSGINFO amiCB[] = {
{OLDCB_GETEDITSEL, "CB_GETEDITSEL"}, // 0x0400
{OLDCB_LIMITTEXT, "CB_LIMITTEXT"}, // 0x0401
{OLDCB_SETEDITSEL, "CB_SETEDITSEL"}, // 0x0402
{OLDCB_ADDSTRING, "CB_ADDSTRING"}, // 0x0403
{OLDCB_DELETESTRING, "CB_DELETESTRING"}, // 0x0404
{OLDCB_DIR, "CB_DIR"}, // 0x0405
{OLDCB_GETCOUNT, "CB_GETCOUNT"}, // 0x0406
{OLDCB_GETCURSEL, "CB_GETCURSEL"}, // 0x0407
{OLDCB_GETLBTEXT, "CB_GETLBTEXT"}, // 0x0408
{OLDCB_GETLBTEXTLEN, "CB_GETLBTEXTLEN"}, // 0x0409
{OLDCB_INSERTSTRING, "CB_INSERTSTRING"}, // 0x040A
{OLDCB_RESETCONTENT, "CB_RESETCONTENT"}, // 0x040B
{OLDCB_FINDSTRING, "CB_FINDSTRING"}, // 0x040C
{OLDCB_SELECTSTRING, "CB_SELECTSTRING"}, // 0x040D
{OLDCB_SETCURSEL, "CB_SETCURSEL"}, // 0x040E
{OLDCB_SHOWDROPDOWN, "CB_SHOWDROPDOWN"}, // 0x040F
{OLDCB_GETITEMDATA, "CB_GETITEMDATA"}, // 0x0410
{OLDCB_SETITEMDATA, "CB_SETITEMDATA"}, // 0x0411
{OLDCB_GETDROPPEDCONTROLRECT,"CB_GETDROPPEDCONTROLRECT"}, // 0x0412
{OLDCB_SETITEMHEIGHT, "CB_SETITEMHEIGHT"}, // 0x0413
{OLDCB_GETITEMHEIGHT, "CB_GETITEMHEIGHT"}, // 0x0414
{OLDCB_SETEXTENDEDUI, "CB_SETEXTENDEDUI"}, // 0x0415
{OLDCB_GETEXTENDEDUI, "CB_GETEXTENDEDUI"}, // 0x0416
{OLDCB_GETDROPPEDSTATE, "CB_GETDROPPEDSTATE"}, // 0x0417
{OLDCB_FINDSTRINGEXACT, "CB_FINDSTRINGEXACT"}, // 0x0418
};
PSZ GetCBMsgName(WORD wMsg)
{
INT i;
register PMSGINFO pmi;
for (pmi=amiCB,i=NUMEL(amiCB); i>0; i--,pmi++)
if ((WORD)pmi->uMsg == wMsg)
return pmi->pszMsgName;
return GetWMMsgName(wMsg);
}
#endif
BOOL FASTCALL ThunkCBMsg16(LPMSGPARAMEX lpmpex)
{
register PWW pww;
WORD wMsg = lpmpex->Parm16.WndProc.wMsg;
LOGDEBUG(7,(" Thunking 16-bit combo box message %s(%04x)\n", (LPSZ)GetCBMsgName(wMsg), wMsg));
// Sudeepb - 04-Mar-1996
// Fix the broken thunking for CBEC_SETCOMBOFOCUS and CBEC_KILLCOMBOFOCUS.
// It was broken when NT user merged with Win95 where CB_MAX has changed.
// the following code is written in such a manner that the only dependency
// we have is that CBEC_SETCOMBOFOCUS precedes CBEC_KILLCOMBOFOCUS which
// will always be true.
if (wMsg == OLDCBEC_SETCOMBOFOCUS || wMsg == OLDCBEC_KILLCOMBOFOCUS) {
lpmpex->uMsg = (WORD)(wMsg - OLDCBEC_SETCOMBOFOCUS + CBEC_SETCOMBOFOCUS);
return TRUE;
}
wMsg -= WM_USER;
//
// For app defined (control) messages that are out of range
// return TRUE.
//
// ChandanC Sept-15-1992
//
if (wMsg < (CB_FINDSTRINGEXACT - CB_GETEDITSEL + 4)) {
switch(lpmpex->uMsg = wMsg + CB_GETEDITSEL) {
case CB_SELECTSTRING:
case CB_FINDSTRINGEXACT:
case CB_FINDSTRING:
case CB_INSERTSTRING:
case CB_ADDSTRING:
if (!(pww = lpmpex->pww))
return FALSE;
if (!(pww->style & (CBS_OWNERDRAWFIXED|CBS_OWNERDRAWVARIABLE)) ||
(pww->style & (CBS_HASSTRINGS))) {
GETPSZPTR(lpmpex->Parm16.WndProc.lParam, (LPSZ)lpmpex->lParam);
}
break;
case CB_GETLBTEXT:
if (NULL != (pww = lpmpex->pww)) {
register PTHUNKTEXTDWORD pthkdword = (PTHUNKTEXTDWORD)lpmpex->MsgBuffer;
// see comments in the file wmsglb.c
//
pthkdword->fDWORD = (pww->style & (CBS_OWNERDRAWFIXED|CBS_OWNERDRAWVARIABLE)) &&
!(pww->style & (CBS_HASSTRINGS));
if (pthkdword->fDWORD) {
lpmpex->lParam = (LPARAM)(LPVOID)&pthkdword->dwDataItem;
break;
}
}
else {
register PTHUNKTEXTDWORD pthkdword = (PTHUNKTEXTDWORD)lpmpex->MsgBuffer;
pthkdword->fDWORD = FALSE;
}
GETPSZPTR(lpmpex->Parm16.WndProc.lParam, (LPSZ)lpmpex->lParam);
break;
case CB_DIR:
GETPSZPTR(lpmpex->Parm16.WndProc.lParam, (LPSZ)lpmpex->lParam);
if (W32CheckThunkParamFlag()) {
AddParamMap(lpmpex->lParam, lpmpex->Parm16.WndProc.lParam);
}
break;
case CB_GETDROPPEDCONTROLRECT:
lpmpex->lParam = (LONG)lpmpex->MsgBuffer;
break;
}
}
return TRUE;
}
VOID FASTCALL UnThunkCBMsg16(LPMSGPARAMEX lpmpex)
{
switch(lpmpex->uMsg) {
case CB_GETLBTEXT:
{
register PTHUNKTEXTDWORD pthkdword = (PTHUNKTEXTDWORD)lpmpex->MsgBuffer;
if ((pthkdword->fDWORD) && (lpmpex->lReturn != CB_ERR)) {
// this is a dword, not a string
// assign the dword as unaligned
UNALIGNED DWORD *lpdwDataItem;
GETVDMPTR((lpmpex->Parm16.WndProc.lParam), sizeof(DWORD), lpdwDataItem);
*lpdwDataItem = pthkdword->dwDataItem;
FREEVDMPTR(lpdwDataItem);
break;
}
}
// fall through to the common code
case CB_ADDSTRING:
case CB_FINDSTRING:
case CB_FINDSTRINGEXACT:
case CB_INSERTSTRING:
case CB_SELECTSTRING:
FREEPSZPTR((LPSZ)lpmpex->lParam);
break;
case CB_DIR:
if (W32CheckThunkParamFlag()) {
DeleteParamMap(lpmpex->lParam, PARAM_32, NULL);
}
FREEPSZPTR((LPSZ)lpmpex->lParam);
break;
case CB_GETDROPPEDCONTROLRECT:
if (lpmpex->lParam) {
putrect16((VPRECT16)lpmpex->Parm16.WndProc.lParam, (LPRECT)lpmpex->lParam);
}
break;
}
}