summaryrefslogtreecommitdiffstats
path: root/private/mvdm/wow32/wusercli.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--private/mvdm/wow32/wusercli.c711
1 files changed, 711 insertions, 0 deletions
diff --git a/private/mvdm/wow32/wusercli.c b/private/mvdm/wow32/wusercli.c
new file mode 100644
index 000000000..c93e9f1b6
--- /dev/null
+++ b/private/mvdm/wow32/wusercli.c
@@ -0,0 +1,711 @@
+//**************************************************************************
+// 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);
+}
+