mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
711 lines
16 KiB
711 lines
16 KiB
//**************************************************************************
|
|
// wusercli.c :
|
|
// Contains all functions that execute USER32 client code on 16bitside.
|
|
// Most of these functions don't exist on x86 builds. So any changes
|
|
// to these files must be reflected in wow16\user\usercli.asm
|
|
//
|
|
// - nanduri
|
|
//**************************************************************************
|
|
|
|
#include "precomp.h"
|
|
#pragma hdrstop
|
|
|
|
MODNAME(wusercli.c);
|
|
|
|
#ifndef PMODE32 // NOT INCLUDED IN I386/PMODE32
|
|
|
|
//**************************************************************************
|
|
// WU32ClientToScreen -
|
|
//
|
|
//**************************************************************************
|
|
|
|
ULONG FASTCALL WU32ClientToScreen(PVDMFRAME pFrame)
|
|
{
|
|
POINT t2;
|
|
register PCLIENTTOSCREEN16 parg16;
|
|
|
|
GETARGPTR(pFrame, sizeof(CLIENTTOSCREEN16), parg16);
|
|
GETPOINT16(parg16->f2, &t2);
|
|
|
|
ClientToScreen( HWND32(parg16->f1), &t2 );
|
|
|
|
PUTPOINT16(parg16->f2, &t2);
|
|
FREEARGPTR(parg16);
|
|
RETURN(0);
|
|
}
|
|
|
|
|
|
//**************************************************************************
|
|
// WU32GetClassName -
|
|
//
|
|
//**************************************************************************
|
|
|
|
ULONG FASTCALL WU32GetClassName(PVDMFRAME pFrame)
|
|
{
|
|
ULONG ul;
|
|
PSZ psz2;
|
|
register PGETCLASSNAME16 parg16;
|
|
|
|
GETARGPTR(pFrame, sizeof(GETCLASSNAME16), parg16);
|
|
ALLOCVDMPTR(parg16->f2, parg16->f3, psz2);
|
|
|
|
ul = GETINT16(GetClassName( HWND32(parg16->f1), psz2, INT32(parg16->f3)));
|
|
|
|
FLUSHVDMPTR(parg16->f2, strlen(psz2)+1, psz2);
|
|
FREEVDMPTR(psz2);
|
|
FREEARGPTR(parg16);
|
|
RETURN(ul);
|
|
}
|
|
|
|
|
|
//**************************************************************************
|
|
// WU32GetClientRect -
|
|
//
|
|
//**************************************************************************
|
|
|
|
ULONG FASTCALL WU32GetClientRect(PVDMFRAME pFrame)
|
|
{
|
|
RECT t2;
|
|
register PGETCLIENTRECT16 parg16;
|
|
|
|
GETARGPTR(pFrame, sizeof(GETCLIENTRECT16), parg16);
|
|
|
|
/*
|
|
* Home Design Gold 2.0
|
|
*
|
|
* If the call fails, don't overwrite the passed-in
|
|
* rect.
|
|
*/
|
|
if (GetClientRect(HWND32(parg16->hwnd), &t2)) {
|
|
PUTRECT16(parg16->vpRect, &t2);
|
|
}
|
|
|
|
FREEARGPTR(parg16);
|
|
RETURN(0);
|
|
}
|
|
|
|
|
|
|
|
//**************************************************************************
|
|
// WU32GetCursorPos -
|
|
//
|
|
//**************************************************************************
|
|
|
|
ULONG FASTCALL WU32GetCursorPos(PVDMFRAME pFrame)
|
|
{
|
|
POINT t1;
|
|
register PGETCURSORPOS16 parg16;
|
|
|
|
GETARGPTR(pFrame, sizeof(GETCURSORPOS16), parg16);
|
|
|
|
GetCursorPos( &t1 );
|
|
|
|
PUTPOINT16(parg16->f1, &t1);
|
|
FREEARGPTR(parg16);
|
|
RETURN(0);
|
|
}
|
|
|
|
|
|
//**************************************************************************
|
|
// WU32GetDesktopWindow -
|
|
//
|
|
//**************************************************************************
|
|
|
|
ULONG FASTCALL WU32GetDesktopWindow(PVDMFRAME pFrame)
|
|
{
|
|
ULONG ul;
|
|
|
|
UNREFERENCED_PARAMETER(pFrame);
|
|
|
|
ul = GETHWND16(GetDesktopWindow());
|
|
|
|
RETURN(ul);
|
|
}
|
|
|
|
|
|
//**************************************************************************
|
|
// WU32GetDlgItem -
|
|
//
|
|
//**************************************************************************
|
|
|
|
ULONG FASTCALL WU32GetDlgItem(PVDMFRAME pFrame)
|
|
{
|
|
ULONG ul;
|
|
register PGETDLGITEM16 parg16;
|
|
|
|
//
|
|
// pass the child ID zero-extended. this ID is the hMenu param to
|
|
// CreateWindow, so USER gets this ID with hiword = 0.
|
|
// Visual Basic relies on this.
|
|
//
|
|
|
|
|
|
GETARGPTR(pFrame, sizeof(GETDLGITEM16), parg16);
|
|
|
|
ul = GETHWND16(GetDlgItem(HWND32(parg16->f1),WORD32(parg16->f2)));
|
|
|
|
if (CURRENTPTD()->dwWOWCompatFlags & WOWCF_DBASEHANDLEBUG) {
|
|
((PTDB)SEGPTR(pFrame->wTDB,0))->TDB_CompatHandle = (USHORT) ul;
|
|
}
|
|
|
|
|
|
FREEARGPTR(parg16);
|
|
RETURN(ul);
|
|
}
|
|
|
|
|
|
//**************************************************************************
|
|
// WU32GetMenu -
|
|
//
|
|
//**************************************************************************
|
|
|
|
ULONG FASTCALL WU32GetMenu(PVDMFRAME pFrame)
|
|
{
|
|
ULONG ul;
|
|
register PGETMENU16 parg16;
|
|
|
|
GETARGPTR(pFrame, sizeof(GETMENU16), parg16);
|
|
|
|
ul = GETHMENU16(GetMenu(HWND32(parg16->f1)));
|
|
|
|
FREEARGPTR(parg16);
|
|
RETURN(ul);
|
|
}
|
|
|
|
|
|
|
|
//**************************************************************************
|
|
// WU32GetMenuItemCount -
|
|
//
|
|
//**************************************************************************
|
|
|
|
ULONG FASTCALL WU32GetMenuItemCount(PVDMFRAME pFrame)
|
|
{
|
|
ULONG ul;
|
|
register PGETMENUITEMCOUNT16 parg16;
|
|
|
|
GETARGPTR(pFrame, sizeof(GETMENUITEMCOUNT16), parg16);
|
|
|
|
ul = GETWORD16(GetMenuItemCount( HMENU32(parg16->f1) ));
|
|
|
|
FREEARGPTR(parg16);
|
|
RETURN(ul);
|
|
}
|
|
|
|
|
|
//**************************************************************************
|
|
// WU32GetMenuItemID -
|
|
//
|
|
//**************************************************************************
|
|
|
|
ULONG FASTCALL WU32GetMenuItemID(PVDMFRAME pFrame)
|
|
{
|
|
ULONG ul;
|
|
register PGETMENUITEMID16 parg16;
|
|
|
|
GETARGPTR(pFrame, sizeof(GETMENUITEMID16), parg16);
|
|
|
|
ul = GETWORD16(GetMenuItemID( HMENU32(parg16->f1), INT32(parg16->f2) ));
|
|
|
|
FREEARGPTR(parg16);
|
|
RETURN(ul);
|
|
}
|
|
|
|
|
|
|
|
//**************************************************************************
|
|
// WU32GetMenuState -
|
|
//
|
|
//**************************************************************************
|
|
|
|
ULONG FASTCALL WU32GetMenuState(PVDMFRAME pFrame)
|
|
{
|
|
ULONG ul;
|
|
register PGETMENUSTATE16 parg16;
|
|
|
|
GETARGPTR(pFrame, sizeof(GETMENUSTATE16), parg16);
|
|
|
|
ul = GETWORD16(GetMenuState( HMENU32(parg16->f1), WORD32(parg16->f2), WORD32(parg16->f3) ));
|
|
|
|
FREEARGPTR(parg16);
|
|
RETURN(ul);
|
|
}
|
|
|
|
|
|
//**************************************************************************
|
|
// WU32GetNextWindow -
|
|
//
|
|
//**************************************************************************
|
|
|
|
ULONG FASTCALL WU32GetNextWindow(PVDMFRAME pFrame)
|
|
{
|
|
ULONG ul;
|
|
register PGETNEXTWINDOW16 parg16;
|
|
|
|
GETARGPTR(pFrame, sizeof(GETNEXTWINDOW16), parg16);
|
|
|
|
ul = GETHWND16(GetNextWindow(HWND32(parg16->f1), WORD32(parg16->f2)));
|
|
|
|
FREEARGPTR(parg16);
|
|
RETURN(ul);
|
|
}
|
|
|
|
|
|
//**************************************************************************
|
|
// WU32GetParent -
|
|
//
|
|
//**************************************************************************
|
|
|
|
ULONG FASTCALL WU32GetParent(PVDMFRAME pFrame)
|
|
{
|
|
ULONG ul;
|
|
register PGETPARENT16 parg16;
|
|
|
|
GETARGPTR(pFrame, sizeof(GETPARENT16), parg16);
|
|
|
|
ul = GETHWND16(GetParent(HWND32(parg16->f1)));
|
|
|
|
FREEARGPTR(parg16);
|
|
RETURN(ul);
|
|
}
|
|
|
|
|
|
|
|
|
|
//**************************************************************************
|
|
// WU32GetSubMenu -
|
|
//
|
|
//**************************************************************************
|
|
|
|
ULONG FASTCALL WU32GetSubMenu(PVDMFRAME pFrame)
|
|
{
|
|
ULONG ul;
|
|
register PGETSUBMENU16 parg16;
|
|
|
|
GETARGPTR(pFrame, sizeof(GETSUBMENU16), parg16);
|
|
|
|
ul = GETHMENU16(GetSubMenu(HMENU32(parg16->f1), INT32(parg16->f2)));
|
|
|
|
FREEARGPTR(parg16);
|
|
RETURN(ul);
|
|
}
|
|
|
|
|
|
|
|
//**************************************************************************
|
|
// WU32GetSysColor -
|
|
//
|
|
//**************************************************************************
|
|
|
|
ULONG FASTCALL WU32GetSysColor(PVDMFRAME pFrame)
|
|
{
|
|
ULONG ul;
|
|
register PGETSYSCOLOR16 parg16;
|
|
|
|
GETARGPTR(pFrame, sizeof(GETSYSCOLOR16), parg16);
|
|
|
|
ul = GETDWORD16(GetSysColor( INT32(parg16->f1) ));
|
|
|
|
FREEARGPTR(parg16);
|
|
RETURN(ul);
|
|
}
|
|
|
|
|
|
|
|
//**************************************************************************
|
|
// WU32GetSystemMetrics -
|
|
//
|
|
//**************************************************************************
|
|
|
|
ULONG FASTCALL WU32GetSystemMetrics(PVDMFRAME pFrame)
|
|
{
|
|
ULONG ul;
|
|
register PGETSYSTEMMETRICS16 parg16;
|
|
int sm;
|
|
|
|
GETARGPTR(pFrame, sizeof(GETSYSTEMMETRICS16), parg16);
|
|
|
|
sm = INT32(parg16->f1);
|
|
|
|
ul = GETINT16(GetSystemMetrics(sm) );
|
|
|
|
FREEARGPTR(parg16);
|
|
RETURN(ul);
|
|
}
|
|
|
|
|
|
//**************************************************************************
|
|
// WU32GetTopWindow -
|
|
//
|
|
//**************************************************************************
|
|
|
|
ULONG FASTCALL WU32GetTopWindow(PVDMFRAME pFrame)
|
|
{
|
|
ULONG ul;
|
|
register PGETTOPWINDOW16 parg16;
|
|
|
|
GETARGPTR(pFrame, sizeof(GETTOPWINDOW16), parg16);
|
|
|
|
ul = GETHWND16(GetTopWindow(HWND32(parg16->f1)));
|
|
|
|
FREEARGPTR(parg16);
|
|
RETURN(ul);
|
|
}
|
|
|
|
|
|
|
|
//**************************************************************************
|
|
// WU32GetWindow -
|
|
//
|
|
//**************************************************************************
|
|
|
|
ULONG FASTCALL WU32GetWindow(PVDMFRAME pFrame)
|
|
{
|
|
ULONG ul;
|
|
register PGETWINDOW16 parg16;
|
|
|
|
GETARGPTR(pFrame, sizeof(GETWINDOW16), parg16);
|
|
|
|
ul = GETHWND16(GetWindow(HWND32(parg16->f1), WORD32(parg16->f2)));
|
|
|
|
FREEARGPTR(parg16);
|
|
RETURN(ul);
|
|
}
|
|
|
|
|
|
//**************************************************************************
|
|
// WU32GetWindowRect -
|
|
//
|
|
//**************************************************************************
|
|
|
|
ULONG FASTCALL WU32GetWindowRect(PVDMFRAME pFrame)
|
|
{
|
|
RECT t2;
|
|
register PGETWINDOWRECT16 parg16;
|
|
|
|
GETARGPTR(pFrame, sizeof(GETWINDOWRECT16), parg16);
|
|
|
|
/*
|
|
* Home Design Gold 2.0
|
|
*
|
|
* If the call fails, don't overwrite the passed-in
|
|
* rect.
|
|
*/
|
|
if (GetWindowRect(HWND32(parg16->f1), &t2)) {
|
|
PUTRECT16(parg16->f2, &t2);
|
|
}
|
|
|
|
FREEARGPTR(parg16);
|
|
RETURN(0);
|
|
}
|
|
|
|
|
|
|
|
//**************************************************************************
|
|
// WU32IsWindow -
|
|
//
|
|
//**************************************************************************
|
|
|
|
ULONG FASTCALL WU32IsWindow(PVDMFRAME pFrame)
|
|
{
|
|
ULONG ul;
|
|
register PISWINDOW16 parg16;
|
|
|
|
GETARGPTR(pFrame, sizeof(ISWINDOW16), parg16);
|
|
|
|
ul = GETBOOL16(IsWindow( HWND32(parg16->f1) ));
|
|
|
|
FREEARGPTR(parg16);
|
|
RETURN(ul);
|
|
}
|
|
|
|
|
|
//**************************************************************************
|
|
// WU32ScreenToClient -
|
|
//
|
|
//**************************************************************************
|
|
|
|
ULONG FASTCALL WU32ScreenToClient(PVDMFRAME pFrame)
|
|
{
|
|
POINT t2;
|
|
register PSCREENTOCLIENT16 parg16;
|
|
|
|
GETARGPTR(pFrame, sizeof(SCREENTOCLIENT16), parg16);
|
|
GETPOINT16(parg16->f2, &t2);
|
|
|
|
ScreenToClient( HWND32(parg16->f1), &t2 );
|
|
|
|
PUTPOINT16(parg16->f2, &t2);
|
|
FREEARGPTR(parg16);
|
|
RETURN(0);
|
|
}
|
|
|
|
|
|
//**************************************************************************
|
|
// WU32IsChild -
|
|
//
|
|
//**************************************************************************
|
|
|
|
ULONG FASTCALL WU32IsChild(PVDMFRAME pFrame)
|
|
{
|
|
ULONG ul;
|
|
register PISCHILD16 parg16;
|
|
|
|
GETARGPTR(pFrame, sizeof(ISCHILD16), parg16);
|
|
|
|
ul = GETBOOL16(IsChild( HWND32(parg16->f1), HWND32(parg16->f2) ));
|
|
|
|
FREEARGPTR(parg16);
|
|
RETURN(ul);
|
|
}
|
|
|
|
|
|
|
|
//**************************************************************************
|
|
// WU32IsIconic -
|
|
//
|
|
//**************************************************************************
|
|
|
|
ULONG FASTCALL WU32IsIconic(PVDMFRAME pFrame)
|
|
{
|
|
ULONG ul;
|
|
register PISICONIC16 parg16;
|
|
|
|
GETARGPTR(pFrame, sizeof(ISICONIC16), parg16);
|
|
|
|
ul = GETBOOL16(IsIconic( HWND32(parg16->f1) ));
|
|
|
|
FREEARGPTR(parg16);
|
|
RETURN(ul);
|
|
}
|
|
|
|
|
|
|
|
//**************************************************************************
|
|
// WU32IsWindowEnabled -
|
|
//
|
|
//**************************************************************************
|
|
|
|
ULONG FASTCALL WU32IsWindowEnabled(PVDMFRAME pFrame)
|
|
{
|
|
ULONG ul;
|
|
register PISWINDOWENABLED16 parg16;
|
|
|
|
GETARGPTR(pFrame, sizeof(ISWINDOWENABLED16), parg16);
|
|
|
|
ul = GETBOOL16(IsWindowEnabled( HWND32(parg16->f1) ));
|
|
|
|
FREEARGPTR(parg16);
|
|
RETURN(ul);
|
|
}
|
|
|
|
|
|
|
|
//**************************************************************************
|
|
// WU32IsWindowVisible -
|
|
//
|
|
//**************************************************************************
|
|
|
|
ULONG FASTCALL WU32IsWindowVisible(PVDMFRAME pFrame)
|
|
{
|
|
ULONG ul;
|
|
register PISWINDOWVISIBLE16 parg16;
|
|
|
|
GETARGPTR(pFrame, sizeof(ISWINDOWVISIBLE16), parg16);
|
|
|
|
ul = GETBOOL16(IsWindowVisible( HWND32(parg16->f1) ));
|
|
|
|
FREEARGPTR(parg16);
|
|
RETURN(ul);
|
|
}
|
|
|
|
|
|
//**************************************************************************
|
|
// WU32IsZoomed -
|
|
//
|
|
//**************************************************************************
|
|
|
|
ULONG FASTCALL WU32IsZoomed(PVDMFRAME pFrame)
|
|
{
|
|
ULONG ul;
|
|
register PISZOOMED16 parg16;
|
|
|
|
GETARGPTR(pFrame, sizeof(ISZOOMED16), parg16);
|
|
|
|
ul = GETBOOL16(IsZoomed( HWND32(parg16->f1) ));
|
|
|
|
FREEARGPTR(parg16);
|
|
RETURN(ul);
|
|
}
|
|
|
|
|
|
|
|
//**************************************************************************
|
|
// WU32GetTickCount -
|
|
//
|
|
//**************************************************************************
|
|
|
|
ULONG FASTCALL WU32GetTickCount(PVDMFRAME pFrame)
|
|
{
|
|
ULONG ul;
|
|
|
|
UNREFERENCED_PARAMETER(pFrame);
|
|
|
|
ul = (ULONG)GetTickCount();
|
|
|
|
if (CURRENTPTD()->dwWOWCompatFlags & WOWCF_GRAINYTICS) {
|
|
|
|
//
|
|
// round down to the nearest 55ms this is for RelayGold, which
|
|
// spins calling this API until consecutive calls return a delta
|
|
// greater than 52.
|
|
//
|
|
|
|
ul = ul - (ul % 55);
|
|
}
|
|
|
|
RETURN(ul);
|
|
}
|
|
|
|
|
|
#endif // ALL THE ABOVE NOT INCLUDED FOR I386/PMODE32
|
|
|
|
|
|
|
|
//**************************************************************************
|
|
// On I386 all these functions her handled on clientside. But conditionally
|
|
// they may endup doing the actual work via these thunks.
|
|
//
|
|
// So any changes here like 'win31 compatiblity code' may have to be added
|
|
// in mvdm\wow16\user\usercli.asm too.
|
|
//
|
|
// - nanduri
|
|
//**************************************************************************
|
|
|
|
|
|
//**************************************************************************
|
|
// WU32DefHookProc -
|
|
//
|
|
//**************************************************************************
|
|
|
|
ULONG FASTCALL WU32DefHookProc(PVDMFRAME pFrame)
|
|
{
|
|
ULONG ul = 0;
|
|
register PDEFHOOKPROC16 parg16;
|
|
HOOKSTATEDATA HkData;
|
|
ULONG hHook16;
|
|
INT iHookCode;
|
|
INT nCode;
|
|
LONG wParam;
|
|
LONG lParam;
|
|
LPINT lpiFunc;
|
|
|
|
GETARGPTR(pFrame, sizeof(DEFHOOKPROC16), parg16);
|
|
|
|
nCode = INT32(parg16->f1);
|
|
wParam = WORD32(parg16->f2);
|
|
lParam = DWORD32(parg16->f3);
|
|
|
|
GETMISCPTR(parg16->f4, lpiFunc);
|
|
hHook16 = FETCHDWORD(*lpiFunc);
|
|
FREEVDMPTR(lpiFunc);
|
|
|
|
if (ISVALIDHHOOK(hHook16)) {
|
|
iHookCode = GETHHOOKINDEX(hHook16);
|
|
HkData.iIndex = iHookCode;
|
|
if ( W32GetHookStateData( &HkData ) ) {
|
|
ul = (ULONG)WU32StdDefHookProc(nCode, wParam, lParam, iHookCode);
|
|
}
|
|
}
|
|
|
|
FREEARGPTR(parg16);
|
|
RETURN(ul);
|
|
}
|
|
|
|
|
|
//**************************************************************************
|
|
// WU32EnableMenuItem -
|
|
//
|
|
//**************************************************************************
|
|
|
|
ULONG FASTCALL WU32EnableMenuItem(PVDMFRAME pFrame)
|
|
{
|
|
ULONG ul;
|
|
register PENABLEMENUITEM16 parg16;
|
|
|
|
GETARGPTR(pFrame, sizeof(ENABLEMENUITEM16), parg16);
|
|
|
|
ul = GETBOOL16(EnableMenuItem( HMENU32(parg16->f1), WORD32(parg16->f2),
|
|
WORD32(parg16->f3) ));
|
|
|
|
FREEARGPTR(parg16);
|
|
RETURN(ul);
|
|
}
|
|
|
|
|
|
//**************************************************************************
|
|
// WU32GetKeyState -
|
|
//
|
|
//**************************************************************************
|
|
|
|
ULONG FASTCALL WU32GetKeyState(PVDMFRAME pFrame)
|
|
{
|
|
ULONG ul;
|
|
SHORT sTmp;
|
|
register PGETKEYSTATE16 parg16;
|
|
|
|
GETARGPTR(pFrame, sizeof(GETKEYSTATE16), parg16);
|
|
|
|
sTmp = GetKeyState(INT32(parg16->f1));
|
|
|
|
// compatiblity:
|
|
// MSTEST (testdrvr.exe) tests the bit 0x80 for checking the
|
|
// shift key state. This works in win31 because the keystate in win31 is
|
|
// one byte long and because of similar code below
|
|
//
|
|
// win31 code is similar to:
|
|
// mov al, byte ptr keystate
|
|
// cbw
|
|
// ret
|
|
//
|
|
// if 'al' is 0x80, cbw will make ax = 0xff80 and thus in win31
|
|
// (state & 0x8000) and (state & 0x0080) will work and mean the same.
|
|
//
|
|
|
|
ul = (ULONG)((sTmp & 0x8000) ? (sTmp | 0x80) : sTmp);
|
|
|
|
|
|
|
|
FREEARGPTR(parg16);
|
|
RETURN(ul);
|
|
}
|
|
|
|
|
|
|
|
//**************************************************************************
|
|
// WU32GetKeyboardState -
|
|
//
|
|
//**************************************************************************
|
|
|
|
ULONG FASTCALL WU32GetKeyboardState(PVDMFRAME pFrame)
|
|
{
|
|
PBYTE pb1;
|
|
register PGETKEYBOARDSTATE16 parg16;
|
|
|
|
GETARGPTR(pFrame, sizeof(GETKEYBOARDSTATE16), parg16);
|
|
ALLOCVDMPTR(parg16->f1, 256, pb1);
|
|
|
|
#ifdef HACK32 // bug 5704
|
|
if (pb1) {
|
|
GetKeyboardState( pb1 );
|
|
}
|
|
#else
|
|
GetKeyboardState( pb1 );
|
|
#endif
|
|
|
|
FLUSHVDMPTR(parg16->f1, 256, pb1);
|
|
FREEVDMPTR(pb1);
|
|
FREEARGPTR(parg16);
|
|
RETURN(0);
|
|
}
|
|
|