/*++ * * WOW v1.0 * * Copyright (c) 1991, Microsoft Corporation * * WMSGLB.C * WOW32 16-bit message thunks * * History: * Created 11-Mar-1991 by Jeff Parsons (jeffpar) --*/ #include "precomp.h" #pragma hdrstop MODNAME(wmsglb.c); #ifdef DEBUG MSGINFO amiLB[] = { {OLDLB_ADDSTRING, "LB_ADDSTRING"}, // 0x0401 {OLDLB_INSERTSTRING, "LB_INSERTSTRING"}, // 0x0402 {OLDLB_DELETESTRING, "LB_DELETESTRING"}, // 0x0403 {OLDLB_RESETCONTENT, "LB_RESETCONTENT"}, // 0x0405 {OLDLB_SETSEL, "LB_SETSEL"}, // 0x0406 {OLDLB_SETCURSEL, "LB_SETCURSEL"}, // 0x0407 {OLDLB_GETSEL, "LB_GETSEL"}, // 0x0408 {OLDLB_GETCURSEL, "LB_GETCURSEL"}, // 0x0409 {OLDLB_GETTEXT, "LB_GETTEXT"}, // 0x040A {OLDLB_GETTEXTLEN, "LB_GETTEXTLEN"}, // 0x040B {OLDLB_GETCOUNT, "LB_GETCOUNT"}, // 0x040C {OLDLB_SELECTSTRING, "LB_SELECTSTRING"}, // 0x040D {OLDLB_DIR, "LB_DIR"}, // 0x040E {OLDLB_GETTOPINDEX, "LB_GETTOPINDEX"}, // 0x040F {OLDLB_FINDSTRING, "LB_FINDSTRING"}, // 0x0410 {OLDLB_GETSELCOUNT, "LB_GETSELCOUNT"}, // 0x0411 {OLDLB_GETSELITEMS, "LB_GETSELITEMS"}, // 0x0412 {OLDLB_SETTABSTOPS, "LB_SETTABSTOPS"}, // 0x0413 {OLDLB_GETHORIZONTALEXTENT, "LB_GETHORIZONTALEXTENT"}, // 0x0414 {OLDLB_SETHORIZONTALEXTENT, "LB_SETHORIZONTALEXTENT"}, // 0x0415 {OLDLB_SETCOLUMNWIDTH, "LB_SETCOLUMNWIDTH"}, // 0x0416 {OLDLB_ADDFILE, "LB_ADDFILE"}, // 0x0417 {OLDLB_SETTOPINDEX, "LB_SETTOPINDEX"}, // 0x0418 {OLDLB_GETITEMRECT, "LB_GETITEMRECT"}, // 0x0419 {OLDLB_GETITEMDATA, "LB_GETITEMDATA"}, // 0x041A {OLDLB_SETITEMDATA, "LB_SETITEMDATA"}, // 0x041B {OLDLB_SELITEMRANGE, "LB_SELITEMRANGE"}, // 0x041C {OLDLB_SETANCHORINDEX, "LB_SETANCHORINDEX"}, // 0x041D {OLDLB_GETANCHORINDEX, "LB_GETANCHORINDEX"}, // 0x041E {OLDLB_SETCARETINDEX, "LB_SETCARETINDEX"}, // 0x041F {OLDLB_GETCARETINDEX, "LB_GETCARETINDEX"}, // 0x0420 {OLDLB_SETITEMHEIGHT, "LB_SETITEMHEIGHT"}, // 0x0421 {OLDLB_GETITEMHEIGHT, "LB_GETITEMHEIGHT"}, // 0x0422 {OLDLB_FINDSTRINGEXACT, "LB_FINDSTRINGEXACT"}, // 0x0423 {OLDLBCB_CARETON, "LBCB_CARETON"}, // 0x0424 {OLDLBCB_CARETOFF, "LBCB_CARETOFF"}, // 0x0425 }; PSZ GetLBMsgName(WORD wMsg) { INT i; register PMSGINFO pmi; for (pmi=amiLB,i=NUMEL(amiLB); i>0; i--,pmi++) if ((WORD)pmi->uMsg == wMsg) return pmi->pszMsgName; return GetWMMsgName(wMsg); } #endif BOOL FASTCALL ThunkLBMsg16(LPMSGPARAMEX lpmpex) { register PWW pww; WORD wMsg = lpmpex->Parm16.WndProc.wMsg; LOGDEBUG(7,(" Thunking 16-bit list box message %s(%04x)\n", (LPSZ)GetLBMsgName(wMsg), wMsg)); wMsg -= WM_USER + 1; // // For app defined (control) messages that are out of range // return TRUE. // // ChandanC Sept-15-1992 // if (wMsg < (LBCB_CARETOFF - LB_ADDSTRING + 1)) { switch(lpmpex->uMsg = wMsg + LB_ADDSTRING) { case LB_SELECTSTRING: case LB_FINDSTRING: case LB_FINDSTRINGEXACT: case LB_INSERTSTRING: case LB_ADDSTRING: if (!(pww = lpmpex->pww)) return FALSE; if (!(pww->style & (LBS_OWNERDRAWFIXED|LBS_OWNERDRAWVARIABLE)) || (pww->style & (LBS_HASSTRINGS))) { GETPSZPTR(lpmpex->Parm16.WndProc.lParam, (LPSZ)lpmpex->lParam); } break; case LB_DIR: GETPSZPTR(lpmpex->Parm16.WndProc.lParam, (LPSZ)lpmpex->lParam); break; case LB_GETTEXT: if (NULL != (pww = lpmpex->pww)) { register PTHUNKTEXTDWORD pthkdword = (PTHUNKTEXTDWORD)lpmpex->MsgBuffer; // we set this as a flag to indicate that we retrieve a dword // instead of a string there. In case when hooks are installed // this code prevents RISC platforms from malfunctioning in // kernel (they have code like this: // try { // // } // except(1) { // // } // which causes this message not to return the proper value) // See walias.h for definition of THUNKTEXTDWORD structure as // well as MSGPARAMEX structure // this code is complemented in UnThunkLBMsg16 // // Application: PeachTree Accounting v3.5 pthkdword->fDWORD = (pww->style & (LBS_OWNERDRAWFIXED|LBS_OWNERDRAWVARIABLE)) && !(pww->style & (LBS_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 LB_GETITEMRECT: lpmpex->lParam = (LONG)lpmpex->MsgBuffer; break; case LB_GETSELITEMS: (PVOID)lpmpex->lParam = STACKORHEAPALLOC(lpmpex->Parm16.WndProc.wParam * sizeof(INT), sizeof(lpmpex->MsgBuffer), lpmpex->MsgBuffer); break; case LB_SETSEL: // sign extend { LPARAM lParam = lpmpex->Parm16.WndProc.lParam; lpmpex->lParam = (LOWORD(lParam) == 0xffff) ? INT32(LOWORD(lParam)) : (LONG)lParam; } break; case LB_SETTABSTOPS: // apparently lParam is a pointer even if wParam == 1. Recorder passes // the data so. - nandurir { INT cItems = INT32(lpmpex->Parm16.WndProc.wParam); if (cItems > 0) { (PVOID)lpmpex->lParam = STACKORHEAPALLOC(cItems * sizeof(INT), sizeof(lpmpex->MsgBuffer), lpmpex->MsgBuffer); getintarray16((VPINT16)lpmpex->Parm16.WndProc.lParam, cItems, (LPINT)lpmpex->lParam); } } break; case LB_ADDSTRING + 3: if (!(CURRENTPTD()->dwWOWCompatFlagsEx & WOWCFEX_THUNKLBSELITEMRANGEEX)) { lpmpex->uMsg = 0; } break; } } return TRUE; } VOID FASTCALL UnThunkLBMsg16(LPMSGPARAMEX lpmpex) { switch(lpmpex->uMsg) { case LB_GETTEXT: { register PTHUNKTEXTDWORD pthkdword = (PTHUNKTEXTDWORD)lpmpex->MsgBuffer; if ((pthkdword->fDWORD) && (lpmpex->lReturn != LB_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 LB_ADDSTRING: // BUGBUG 3-Jul-1991 JeffPar: for owner-draw list boxes, this can just be a 32-bit number case LB_DIR: case LB_FINDSTRING: // BUGBUG 3-Jul-1991 JeffPar: for owner-draw list boxes, this can just be a 32-bit number case LB_FINDSTRINGEXACT: case LB_INSERTSTRING: case LB_SELECTSTRING: FREEPSZPTR((LPSZ)lpmpex->lParam); break; case LB_GETITEMRECT: if ((lpmpex->lParam) && (lpmpex->lReturn != -1L)) { putrect16((VPRECT16)lpmpex->Parm16.WndProc.lParam, (LPRECT)lpmpex->lParam); } break; case LB_GETSELITEMS: PUTINTARRAY16V((VPINT16)lpmpex->Parm16.WndProc.lParam, (INT)(lpmpex->lReturn), (LPINT)lpmpex->lParam); STACKORHEAPFREE((LPINT)lpmpex->lParam, lpmpex->MsgBuffer); break; case LB_SETTABSTOPS: if (lpmpex->Parm16.WndProc.wParam > 0) { STACKORHEAPFREE((LPINT)lpmpex->lParam, lpmpex->MsgBuffer); } break; } }