Windows NT 4.0 source code leak
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

//**************************************************************************
// 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);
}