[CMAKE]
[reactos.git] / subsystems / win32 / win32k / ntuser / ntstubs.c
index 50d84e3..281fe71 100644 (file)
@@ -7,13 +7,13 @@
  * REVISION HISTORY:
  *       04-06-2001  CSH  Created
  */
-#include <w32k.h>
+#include <win32k.h>
 
 #define NDEBUG
 #include <debug.h>
 
 DWORD
-NTAPI
+APIENTRY
 NtUserAssociateInputContext(
     DWORD dwUnknown1,
     DWORD dwUnknown2,
@@ -25,22 +25,49 @@ NtUserAssociateInputContext(
 
 
 BOOL
-NTAPI
+APIENTRY
 NtUserAttachThreadInput(
     IN DWORD idAttach,
     IN DWORD idAttachTo,
     IN BOOL fAttach)
 {
-   UNIMPLEMENTED
+  NTSTATUS Status;
+  PETHREAD Thread, ThreadTo;
+  PTHREADINFO pti, ptiTo;
+  BOOL Ret = FALSE;
 
-   return 0;
+  UserEnterExclusive();
+  Status = PsLookupThreadByThreadId((HANDLE)idAttach, &Thread);
+  if (!NT_SUCCESS(Status))
+  {
+     EngSetLastError(ERROR_INVALID_PARAMETER);
+     goto Exit;
+  }
+  Status = PsLookupThreadByThreadId((HANDLE)idAttachTo, &ThreadTo);
+  if (!NT_SUCCESS(Status))
+  {
+     EngSetLastError(ERROR_INVALID_PARAMETER);
+     ObDereferenceObject(Thread);
+     goto Exit;
+  }
+
+  pti = PsGetThreadWin32Thread(Thread);
+  ptiTo = PsGetThreadWin32Thread(ThreadTo);
+  ObDereferenceObject(Thread);
+  ObDereferenceObject(ThreadTo);
+
+  Ret = UserAttachThreadInput( pti, ptiTo, fAttach);
+
+Exit:
+  UserLeave();
+  return Ret;
 }
 
 //
 // Works like BitBlt, http://msdn.microsoft.com/en-us/library/ms532278(VS.85).aspx
 //
 BOOL
-NTAPI
+APIENTRY
 NtUserBitBltSysBmp(
    HDC hdc,
    INT nXDest,
@@ -57,11 +84,11 @@ NtUserBitBltSysBmp(
    Ret = NtGdiBitBlt( hdc,
                    nXDest,
                    nYDest,
-                   nWidth, 
-                  nHeight, 
+                   nWidth,
+                  nHeight,
                 hSystemBM,
-                    nXSrc, 
-                    nYSrc, 
+                    nXSrc,
+                    nYSrc,
                     dwRop,
                         0,
                         0);
@@ -71,7 +98,7 @@ NtUserBitBltSysBmp(
 }
 
 DWORD
-NTAPI
+APIENTRY
 NtUserBuildHimcList(
     DWORD dwUnknown1,
     DWORD dwUnknown2,
@@ -83,7 +110,7 @@ NtUserBuildHimcList(
 }
 
 DWORD
-STDCALL
+APIENTRY
 NtUserConvertMemHandle(
    DWORD Unknown0,
    DWORD Unknown1)
@@ -94,7 +121,7 @@ NtUserConvertMemHandle(
 }
 
 DWORD
-STDCALL
+APIENTRY
 NtUserCreateLocalMemHandle(
    DWORD Unknown0,
    DWORD Unknown1,
@@ -107,7 +134,7 @@ NtUserCreateLocalMemHandle(
 }
 
 BOOL
-NTAPI
+APIENTRY
 NtUserDdeGetQualityOfService(
    IN HWND hwndClient,
    IN HWND hWndServer,
@@ -119,7 +146,7 @@ NtUserDdeGetQualityOfService(
 }
 
 DWORD
-STDCALL
+APIENTRY
 NtUserDdeInitialize(
    DWORD Unknown0,
    DWORD Unknown1,
@@ -133,7 +160,7 @@ NtUserDdeInitialize(
 }
 
 BOOL
-NTAPI
+APIENTRY
 NtUserDdeSetQualityOfService(
    IN  HWND hwndClient,
    IN  PSECURITY_QUALITY_OF_SERVICE pqosNew,
@@ -145,7 +172,7 @@ NtUserDdeSetQualityOfService(
 }
 
 DWORD
-NTAPI
+APIENTRY
 NtUserDragObject(
    HWND    hwnd1,
    HWND    hwnd2,
@@ -160,7 +187,7 @@ NtUserDragObject(
 }
 
 BOOL
-NTAPI
+APIENTRY
 NtUserDrawAnimatedRects(
    HWND hwnd,
    INT idAni,
@@ -172,41 +199,8 @@ NtUserDrawAnimatedRects(
    return 0;
 }
 
-BOOL
-STDCALL
-NtUserEnumDisplayDevices (
-   PUNICODE_STRING lpDevice, /* device name */
-   DWORD iDevNum, /* display device */
-   PDISPLAY_DEVICEW lpDisplayDevice, /* device information */
-   DWORD dwFlags ) /* reserved */
-{
-   DPRINT1("NtUserEnumDisplayDevices() is UNIMPLEMENTED!\n");
-   if (lpDevice->Length == 0 && iDevNum > 0)
-   {
-      /* Only one display device present */
-      return FALSE;
-   }
-   else if (lpDevice->Length != 0)
-   {
-       /* Can't enumerate monitors :( */
-       return FALSE;
-   }
-   if (lpDisplayDevice->cb < sizeof(DISPLAY_DEVICE))
-      return FALSE;
-
-   wcscpy(lpDisplayDevice->DeviceName, L"\\\\.\\DISPLAY1");
-   wcscpy(lpDisplayDevice->DeviceString, L"<Unknown>");
-   lpDisplayDevice->StateFlags = DISPLAY_DEVICE_ATTACHED_TO_DESKTOP
-                                 | DISPLAY_DEVICE_MODESPRUNED
-                                 | DISPLAY_DEVICE_PRIMARY_DEVICE
-                                 | DISPLAY_DEVICE_VGA_COMPATIBLE;
-   lpDisplayDevice->DeviceID[0] = L'0';
-   lpDisplayDevice->DeviceKey[0] = L'0';
-   return TRUE;
-}
-
 DWORD
-STDCALL
+APIENTRY
 NtUserEvent(
    DWORD Unknown0)
 {
@@ -216,7 +210,7 @@ NtUserEvent(
 }
 
 DWORD
-NTAPI
+APIENTRY
 NtUserExcludeUpdateRgn(
   HDC hDC,
   HWND hWnd)
@@ -227,12 +221,12 @@ NtUserExcludeUpdateRgn(
 }
 
 BOOL
-NTAPI
+APIENTRY
 NtUserGetAltTabInfo(
    HWND hwnd,
    INT  iItem,
    PALTTABINFO pati,
-   LPTSTR pszItemText,
+   LPWSTR pszItemText,
    UINT   cchItemText,
    BOOL   Ansi)
 {
@@ -242,7 +236,7 @@ NtUserGetAltTabInfo(
 }
 
 HBRUSH
-NTAPI
+APIENTRY
 NtUserGetControlBrush(
    HWND hwnd,
    HDC  hdc,
@@ -258,10 +252,10 @@ NtUserGetControlBrush(
  * Called from PaintRect, works almost like wine PaintRect16 but returns hBrush.
  */
 HBRUSH
-STDCALL
+APIENTRY
 NtUserGetControlColor(
    HWND hwndParent,
-   HWND hwnd, 
+   HWND hwnd,
    HDC hdc,
    UINT CtlMsg) // Wine PaintRect: WM_CTLCOLORMSGBOX + hbrush
 {
@@ -271,19 +265,7 @@ NtUserGetControlColor(
 }
 
 DWORD
-STDCALL
-NtUserGetCPD(
-   DWORD Unknown0,
-   DWORD Unknown1,
-   DWORD Unknown2)
-{
-   UNIMPLEMENTED
-
-   return 0;
-}
-
-DWORD
-STDCALL
+APIENTRY
 NtUserGetImeHotKey(
    DWORD Unknown0,
    DWORD Unknown1,
@@ -295,54 +277,8 @@ NtUserGetImeHotKey(
    return 0;
 }
 
-
-DWORD
-STDCALL
-NtUserGetMouseMovePointsEx(
-   UINT cbSize,
-   LPMOUSEMOVEPOINT lppt,
-   LPMOUSEMOVEPOINT lpptBuf,
-   int nBufPoints,
-   DWORD resolution)
-{
-/*
-   if (cbSize != sizeof (MOUSEMOVEPOINT)
-   {
-       SetLastWin32Error(GMMP_ERR_POINT_NOT_FOUND);
-       return GMMP_ERR_POINT_NOT_FOUND;
-   }
-
-   if (!lppt)
-   {
-       SetLastWin32Error(GMMP_ERR_POINT_NOT_FOUND);
-       return GMMP_ERR_POINT_NOT_FOUND;
-   }
-
-   if (!lpptBuf)
-   {
-       SetLastWin32Error(GMMP_ERR_POINT_NOT_FOUND);
-       return GMMP_ERR_POINT_NOT_FOUND;
-   }
-
-   switch(resolution)
-   {
-     case GMMP_USE_DISPLAY_POINTS:
-     case GMMP_USE_HIGH_RESOLUTION_POINTS:
-          break;
-     default:
-        SetLastWin32Error(GMMP_ERR_POINT_NOT_FOUND);
-        return GMMP_ERR_POINT_NOT_FOUND;
-   }
-  */
-   UNIMPLEMENTED
-
-   return 0;
-}
-
-
-
 BOOL
-NTAPI
+APIENTRY
 NtUserImpersonateDdeClientWindow(
    HWND hWndClient,
    HWND hWndServer)
@@ -353,20 +289,54 @@ NtUserImpersonateDdeClientWindow(
 }
 
 NTSTATUS
-STDCALL
+APIENTRY
 NtUserInitializeClientPfnArrays(
   PPFNCLIENT pfnClientA,
   PPFNCLIENT pfnClientW,
   PPFNCLIENTWORKER pfnClientWorker,
   HINSTANCE hmodUser)
 {
-   UNIMPLEMENTED
+   NTSTATUS Status = STATUS_SUCCESS;
+   DPRINT("Enter NtUserInitializeClientPfnArrays User32 0x%x\n",hmodUser);
+
+   if (ClientPfnInit) return Status;
+
+   UserEnterExclusive();
+
+   _SEH2_TRY
+   {
+      ProbeForRead( pfnClientA, sizeof(PFNCLIENT), 1);
+      ProbeForRead( pfnClientW, sizeof(PFNCLIENT), 1);
+      ProbeForRead( pfnClientWorker, sizeof(PFNCLIENTWORKER), 1);
+      RtlCopyMemory(&gpsi->apfnClientA, pfnClientA, sizeof(PFNCLIENT));
+      RtlCopyMemory(&gpsi->apfnClientW, pfnClientW, sizeof(PFNCLIENT));
+      RtlCopyMemory(&gpsi->apfnClientWorker, pfnClientWorker, sizeof(PFNCLIENTWORKER));
+
+      //// FIXME! HAX! Temporary until server side is finished.
+      //// Copy the client side procs for now.
+      RtlCopyMemory(&gpsi->aStoCidPfn, pfnClientW, sizeof(gpsi->aStoCidPfn));
+
+      hModClient = hmodUser;
+      ClientPfnInit = TRUE;
+   }
+   _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+   {
+      Status =_SEH2_GetExceptionCode();
+   }
+   _SEH2_END
+
+   if (!NT_SUCCESS(Status))
+   {
+      DPRINT1("Failed reading Client Pfns from user space.\n");
+      SetLastNtError(Status);
+   }
 
-   return STATUS_UNSUCCESSFUL;
+   UserLeave();
+   return Status;
 }
 
 DWORD
-STDCALL
+APIENTRY
 NtUserInitTask(
    DWORD Unknown0,
    DWORD Unknown1,
@@ -387,7 +357,7 @@ NtUserInitTask(
 }
 
 BOOL
-NTAPI
+APIENTRY
 NtUserLockWorkStation(VOID)
 {
    UNIMPLEMENTED
@@ -396,7 +366,7 @@ NtUserLockWorkStation(VOID)
 }
 
 DWORD
-STDCALL
+APIENTRY
 NtUserMNDragLeave(VOID)
 {
    UNIMPLEMENTED
@@ -405,7 +375,7 @@ NtUserMNDragLeave(VOID)
 }
 
 DWORD
-STDCALL
+APIENTRY
 NtUserMNDragOver(
    DWORD Unknown0,
    DWORD Unknown1)
@@ -416,7 +386,7 @@ NtUserMNDragOver(
 }
 
 DWORD
-STDCALL
+APIENTRY
 NtUserModifyUserStartupInfoFlags(
    DWORD Unknown0,
    DWORD Unknown1)
@@ -427,7 +397,7 @@ NtUserModifyUserStartupInfoFlags(
 }
 
 DWORD
-STDCALL
+APIENTRY
 NtUserNotifyIMEStatus(
    DWORD Unknown0,
    DWORD Unknown1,
@@ -439,7 +409,7 @@ NtUserNotifyIMEStatus(
 }
 
 DWORD
-STDCALL
+APIENTRY
 NtUserQueryUserCounters(
    DWORD Unknown0,
    DWORD Unknown1,
@@ -452,9 +422,8 @@ NtUserQueryUserCounters(
    return 0;
 }
 
-
 DWORD
-STDCALL
+APIENTRY
 NtUserRegisterTasklist(
    DWORD Unknown0)
 {
@@ -463,22 +432,8 @@ NtUserRegisterTasklist(
    return 0;
 }
 
-
 DWORD
-STDCALL
-NtUserSBGetParms(
-   DWORD Unknown0,
-   DWORD Unknown1,
-   DWORD Unknown2,
-   DWORD Unknown3)
-{
-   UNIMPLEMENTED
-
-   return 0;
-}
-
-DWORD
-STDCALL
+APIENTRY
 NtUserSetConsoleReserveKeys(
    DWORD Unknown0,
    DWORD Unknown1)
@@ -489,7 +444,7 @@ NtUserSetConsoleReserveKeys(
 }
 
 DWORD
-STDCALL
+APIENTRY
 NtUserSetDbgTag(
    DWORD Unknown0,
    DWORD Unknown1)
@@ -500,7 +455,7 @@ NtUserSetDbgTag(
 }
 
 DWORD
-STDCALL
+APIENTRY
 NtUserSetImeHotKey(
    DWORD Unknown0,
    DWORD Unknown1,
@@ -515,7 +470,7 @@ NtUserSetImeHotKey(
 
 
 DWORD
-STDCALL
+APIENTRY
 NtUserSetRipFlags(
    DWORD Unknown0,
    DWORD Unknown1)
@@ -526,47 +481,54 @@ NtUserSetRipFlags(
 }
 
 BOOL
-STDCALL
+APIENTRY
 NtUserSetSysColors(
    int cElements,
    IN CONST INT *lpaElements,
    IN CONST COLORREF *lpaRgbValues,
    FLONG Flags)
 {
-  DWORD Ret = FALSE;
-  NTSTATUS Status = STATUS_SUCCESS;
-  UserEnterExclusive();
-  _SEH_TRY
-  {
-     ProbeForRead(lpaElements,
-                   sizeof(INT),
-                   1);
-     ProbeForRead(lpaRgbValues,
-                   sizeof(INT),
-                   1);
-// Developers: We are thread locked and calling gdi.
-     Ret = IntSetSysColors(cElements, (INT*)lpaElements, (COLORREF*)lpaRgbValues);
-  }
-  _SEH_HANDLE
-  {
-      Status = _SEH_GetExceptionCode();
-  }
-  _SEH_END;
-  if (!NT_SUCCESS(Status))
-  {
-      SetLastNtError(Status);
+   DWORD Ret = TRUE;
+
+   if (cElements == 0)
+      return TRUE;
+
+   /* We need this check to prevent overflow later */
+   if ((ULONG)cElements >= 0x40000000)
+   {
+      EngSetLastError(ERROR_NOACCESS);
+      return FALSE;
+   }
+
+   UserEnterExclusive();
+
+   _SEH2_TRY
+   {
+      ProbeForRead(lpaElements, cElements * sizeof(INT), 1);
+      ProbeForRead(lpaRgbValues, cElements * sizeof(COLORREF), 1);
+
+      IntSetSysColors(cElements, lpaElements, lpaRgbValues);
+   }
+   _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+   {
+      SetLastNtError(_SEH2_GetExceptionCode());
       Ret = FALSE;
-  }
-  if (Ret)
-  {
-     UserPostMessage(HWND_BROADCAST, WM_SYSCOLORCHANGE, 0, 0);
-  }
-  UserLeave();
-  return Ret;
+   }
+   _SEH2_END;
+
+   if (Ret)
+   {
+      UserSendNotifyMessage(HWND_BROADCAST, WM_SYSCOLORCHANGE, 0, 0);
+
+      UserRedrawDesktop();
+   }
+
+   UserLeave();
+   return Ret;
 }
 
 DWORD
-STDCALL
+APIENTRY
 NtUserSetThreadState(
    DWORD Unknown0,
    DWORD Unknown1)
@@ -576,19 +538,8 @@ NtUserSetThreadState(
    return 0;
 }
 
-BOOL
-NTAPI
-NtUserTrackMouseEvent(
-   LPTRACKMOUSEEVENT lpEventTrack)
-{
-   UNIMPLEMENTED
-
-   return 0;
-}
-
-
 DWORD
-STDCALL
+APIENTRY
 NtUserUpdateInputContext(
    DWORD Unknown0,
    DWORD Unknown1,
@@ -600,7 +551,7 @@ NtUserUpdateInputContext(
 }
 
 DWORD
-STDCALL
+APIENTRY
 NtUserUpdateInstance(
    DWORD Unknown0,
    DWORD Unknown1,
@@ -612,7 +563,7 @@ NtUserUpdateInstance(
 }
 
 BOOL
-NTAPI
+APIENTRY
 NtUserUserHandleGrantAccess(
    IN HANDLE hUserHandle,
    IN HANDLE hJob,
@@ -624,7 +575,7 @@ NtUserUserHandleGrantAccess(
 }
 
 DWORD
-STDCALL
+APIENTRY
 NtUserWaitForMsgAndEvent(
    DWORD Unknown0)
 {
@@ -634,7 +585,7 @@ NtUserWaitForMsgAndEvent(
 }
 
 DWORD
-STDCALL
+APIENTRY
 NtUserWin32PoolAllocationStats(
    DWORD Unknown0,
    DWORD Unknown1,
@@ -649,7 +600,7 @@ NtUserWin32PoolAllocationStats(
 }
 
 DWORD
-STDCALL
+APIENTRY
 NtUserYieldTask(VOID)
 {
    UNIMPLEMENTED
@@ -659,7 +610,7 @@ NtUserYieldTask(VOID)
 
 
 DWORD
-STDCALL
+APIENTRY
 NtUserCheckImeHotKey(
     DWORD dwUnknown1,
     DWORD dwUnknown2)
@@ -669,7 +620,7 @@ NtUserCheckImeHotKey(
 }
 
 DWORD
-NTAPI
+APIENTRY
 NtUserConsoleControl(
     DWORD dwUnknown1,
     DWORD dwUnknown2,
@@ -680,7 +631,7 @@ NtUserConsoleControl(
 }
 
 DWORD
-NTAPI
+APIENTRY
 NtUserCreateInputContext(
     DWORD dwUnknown1)
 {
@@ -689,7 +640,7 @@ NtUserCreateInputContext(
 }
 
 DWORD
-NTAPI
+APIENTRY
 NtUserDestroyInputContext(
     DWORD dwUnknown1)
 {
@@ -698,7 +649,7 @@ NtUserDestroyInputContext(
 }
 
 DWORD
-NTAPI
+APIENTRY
 NtUserDisableThreadIme(
     DWORD dwUnknown1)
 {
@@ -707,7 +658,7 @@ NtUserDisableThreadIme(
 }
 
 DWORD
-NTAPI
+APIENTRY
 NtUserGetAppImeLevel(
     DWORD dwUnknown1)
 {
@@ -716,7 +667,7 @@ NtUserGetAppImeLevel(
 }
 
 DWORD
-NTAPI
+APIENTRY
 NtUserGetAtomName(
     ATOM nAtom,
     LPWSTR lpBuffer)
@@ -726,7 +677,7 @@ NtUserGetAtomName(
 }
 
 DWORD
-NTAPI
+APIENTRY
 NtUserGetImeInfoEx(
     DWORD dwUnknown1,
     DWORD dwUnknown2)
@@ -736,7 +687,7 @@ NtUserGetImeInfoEx(
 }
 
 DWORD
-NTAPI
+APIENTRY
 NtUserGetRawInputBuffer(
     PRAWINPUT pData,
     PUINT pcbSize,
@@ -747,7 +698,7 @@ NtUserGetRawInputBuffer(
 }
 
 DWORD
-NTAPI
+APIENTRY
 NtUserGetRawInputData(
     HRAWINPUT hRawInput,
     UINT uiCommand,
@@ -760,7 +711,7 @@ NtUserGetRawInputData(
 }
 
 DWORD
-NTAPI
+APIENTRY
 NtUserGetRawInputDeviceInfo(
     HANDLE hDevice,
     UINT uiCommand,
@@ -773,7 +724,7 @@ NtUserGetRawInputDeviceInfo(
 }
 
 DWORD
-NTAPI
+APIENTRY
 NtUserGetRawInputDeviceList(
     PRAWINPUTDEVICELIST pRawInputDeviceList,
     PUINT puiNumDevices,
@@ -784,7 +735,7 @@ NtUserGetRawInputDeviceList(
 }
 
 DWORD
-NTAPI
+APIENTRY
 NtUserGetRegisteredRawInputDevices(
     PRAWINPUTDEVICE pRawInputDevices,
     PUINT puiNumDevices,
@@ -795,7 +746,7 @@ NtUserGetRegisteredRawInputDevices(
 }
 
 DWORD
-NTAPI
+APIENTRY
 NtUserHardErrorControl(
     DWORD dwUnknown1,
     DWORD dwUnknown2,
@@ -806,29 +757,55 @@ NtUserHardErrorControl(
 }
 
 DWORD
-NTAPI
-NtUserInitialize(
-    DWORD dwUnknown1,
-    DWORD dwUnknown2,
-    DWORD dwUnknown3)
-{
-    UNIMPLEMENTED;
-    return 0;
-}
-
-DWORD
-NTAPI
+APIENTRY
 NtUserMinMaximize(
     HWND hWnd,
     UINT cmd, // Wine SW_ commands
     BOOL Hide)
 {
-    UNIMPLEMENTED;
-    return 0;
+  RECTL NewPos;
+  UINT SwFlags;
+  PWND pWnd;
+
+  DPRINT("Enter NtUserMinMaximize\n");
+  UserEnterExclusive();
+
+  pWnd = UserGetWindowObject(hWnd);
+  if ( !pWnd ||                          // FIXME:
+        pWnd == IntGetDesktopWindow() || // pWnd->fnid == FNID_DESKTOP
+        pWnd == IntGetMessageWindow() )  // pWnd->fnid == FNID_MESSAGEWND
+  {
+     goto Exit;
+  }
+
+  if ( cmd > SW_MAX || pWnd->state2 & WNDS2_INDESTROY)
+  {
+     EngSetLastError(ERROR_INVALID_PARAMETER);
+     goto Exit;
+  }
+
+  co_WinPosMinMaximize(pWnd, cmd, &NewPos);
+
+  SwFlags = Hide ? SWP_NOACTIVATE|SWP_NOZORDER|SWP_FRAMECHANGED : SWP_NOZORDER|SWP_FRAMECHANGED;
+
+  co_WinPosSetWindowPos( pWnd,
+                         NULL,
+                         NewPos.left,
+                         NewPos.top,
+                         NewPos.right,
+                         NewPos.bottom,
+                         SwFlags);
+
+  co_WinPosShowWindow(pWnd, cmd);
+
+Exit:
+  DPRINT("Leave NtUserMinMaximize\n");
+  UserLeave();
+  return 0; // Always NULL?
 }
 
 DWORD
-NTAPI
+APIENTRY
 NtUserNotifyProcessCreate(
     DWORD dwUnknown1,
     DWORD dwUnknown2,
@@ -839,30 +816,45 @@ NtUserNotifyProcessCreate(
     return 0;
 }
 
-BOOL
-NTAPI
-NtUserPrintWindow(
-    HWND hwnd,
-    HDC  hdcBlt,
-    UINT nFlags)
-{
-    UNIMPLEMENTED;
-    return 0;
-}
-
 NTSTATUS
-NTAPI
+APIENTRY
 NtUserProcessConnect(
     HANDLE Process,
     PUSERCONNECT pUserConnect,
     DWORD Size)
 {
-    UNIMPLEMENTED;
-    return 0;
+  NTSTATUS Status = STATUS_SUCCESS;
+  DPRINT("NtUserProcessConnect\n");
+  if (pUserConnect && ( Size == sizeof(USERCONNECT) ))
+  {
+     PPROCESSINFO W32Process;
+     UserEnterShared();
+     GetW32ThreadInfo();
+     W32Process = PsGetCurrentProcessWin32Process();
+     _SEH2_TRY
+     {
+        pUserConnect->siClient.psi = gpsi;
+        pUserConnect->siClient.aheList = gHandleTable;
+        pUserConnect->siClient.ulSharedDelta = (ULONG_PTR)W32Process->HeapMappings.KernelMapping -
+                                               (ULONG_PTR)W32Process->HeapMappings.UserMapping;
+     }
+     _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+     {
+        Status = _SEH2_GetExceptionCode();
+     }
+     _SEH2_END
+     if (!NT_SUCCESS(Status))
+     {
+        SetLastNtError(Status);
+     }
+     UserLeave();
+     return Status;
+  }
+  return STATUS_UNSUCCESSFUL;
 }
 
 DWORD
-NTAPI
+APIENTRY
 NtUserQueryInformationThread(
     DWORD dwUnknown1,
     DWORD dwUnknown2,
@@ -875,7 +867,7 @@ NtUserQueryInformationThread(
 }
 
 DWORD
-NTAPI
+APIENTRY
 NtUserQueryInputContext(
     DWORD dwUnknown1,
     DWORD dwUnknown2)
@@ -884,42 +876,46 @@ NtUserQueryInputContext(
     return 0;
 }
 
-DWORD
-NTAPI
+BOOL
+APIENTRY
 NtUserRealInternalGetMessage(
-    DWORD dwUnknown1,
-    DWORD dwUnknown2,
-    DWORD dwUnknown3,
-    DWORD dwUnknown4,
-    DWORD dwUnknown5,
-    DWORD dwUnknown6)
+    LPMSG lpMsg,
+    HWND hWnd,
+    UINT wMsgFilterMin,
+    UINT wMsgFilterMax,
+    UINT wRemoveMsg,
+    BOOL bGMSG)
 {
     UNIMPLEMENTED;
     return 0;
 }
 
-DWORD
-NTAPI
+BOOL
+APIENTRY
 NtUserRealWaitMessageEx(
-    DWORD dwUnknown1,
-    DWORD dwUnknown2)
+    DWORD dwWakeMask,
+    UINT uTimeout)
 {
     UNIMPLEMENTED;
     return 0;
 }
 
-DWORD
-NTAPI
+BOOL
+APIENTRY
 NtUserRegisterUserApiHook(
-    DWORD dwUnknown1,
-    DWORD dwUnknown2)
+    PUNICODE_STRING m_dllname1,
+    PUNICODE_STRING m_funname1,
+    DWORD dwUnknown3,
+    DWORD dwUnknown4)
 {
+    UserEnterExclusive();
     UNIMPLEMENTED;
+    UserLeave();
     return 0;
 }
 
 BOOL
-NTAPI
+APIENTRY
 NtUserRegisterRawInputDevices(
     IN PCRAWINPUTDEVICE pRawInputDevices,
     IN UINT uiNumDevices,
@@ -930,7 +926,7 @@ NtUserRegisterRawInputDevices(
 }
 
 DWORD
-NTAPI
+APIENTRY
 NtUserResolveDesktop(
     DWORD dwUnknown1,
     DWORD dwUnknown2,
@@ -942,7 +938,7 @@ NtUserResolveDesktop(
 }
 
 DWORD
-NTAPI
+APIENTRY
 NtUserSetAppImeLevel(
     DWORD dwUnknown1,
     DWORD dwUnknown2)
@@ -952,7 +948,7 @@ NtUserSetAppImeLevel(
 }
 
 DWORD
-NTAPI
+APIENTRY
 NtUserSetImeInfoEx(
     DWORD dwUnknown1)
 {
@@ -961,7 +957,7 @@ NtUserSetImeInfoEx(
 }
 
 DWORD
-NTAPI
+APIENTRY
 NtUserSetInformationProcess(
     DWORD dwUnknown1,
     DWORD dwUnknown2,
@@ -972,20 +968,32 @@ NtUserSetInformationProcess(
     return 0;
 }
 
-DWORD
-NTAPI
-NtUserSetInformationThread(
-    DWORD dwUnknown1,
-    DWORD dwUnknown2,
-    DWORD dwUnknown3,
-    DWORD dwUnknown4)
+NTSTATUS
+APIENTRY
+NtUserSetInformationThread(IN HANDLE ThreadHandle,
+                           IN USERTHREADINFOCLASS ThreadInformationClass,
+                           IN PVOID ThreadInformation,
+                           IN ULONG ThreadInformationLength)
+
 {
-    UNIMPLEMENTED;
-    return 0;
+    if (ThreadInformationClass == UserThreadInitiateShutdown)
+    {
+        DPRINT1("Shutdown initiated\n");
+    }
+    else if (ThreadInformationClass == UserThreadEndShutdown)
+    {
+        DPRINT1("Shutdown ended\n");
+    }
+    else
+    {
+        UNIMPLEMENTED;
+    }
+
+    return STATUS_SUCCESS;
 }
 
 DWORD
-NTAPI
+APIENTRY
 NtUserSetThreadLayoutHandles(
     DWORD dwUnknown1,
     DWORD dwUnknown2)
@@ -995,7 +1003,7 @@ NtUserSetThreadLayoutHandles(
 }
 
 BOOL
-NTAPI
+APIENTRY
 NtUserSoundSentry(VOID)
 {
     UNIMPLEMENTED;
@@ -1003,7 +1011,7 @@ NtUserSoundSentry(VOID)
 }
 
 DWORD
-NTAPI
+APIENTRY
 NtUserTestForInteractiveUser(
     DWORD dwUnknown1)
 {
@@ -1013,7 +1021,7 @@ NtUserTestForInteractiveUser(
 
 /* http://www.cyber-ta.org/releases/malware-analysis/public/SOURCES/b47155634ccb2c30630da7e3666d3d07/b47155634ccb2c30630da7e3666d3d07.trace.html#NtUserGetIconSize */
 DWORD
-NTAPI
+APIENTRY
 NtUserCalcMenuBar(
     DWORD dwUnknown1,
     DWORD dwUnknown2,
@@ -1026,7 +1034,7 @@ NtUserCalcMenuBar(
 }
 
 DWORD
-NTAPI
+APIENTRY
 NtUserPaintMenuBar(
     DWORD dwUnknown1,
     DWORD dwUnknown2,
@@ -1039,8 +1047,8 @@ NtUserPaintMenuBar(
     return 0;
 }
 
-DWORD
-NTAPI
+BOOL
+APIENTRY
 NtUserUnregisterUserApiHook(VOID)
 {
     UNIMPLEMENTED;
@@ -1048,7 +1056,7 @@ NtUserUnregisterUserApiHook(VOID)
 }
 
 BOOL
-NTAPI
+APIENTRY
 NtUserGetLayeredWindowAttributes(
     HWND hwnd,
     COLORREF *pcrKey,
@@ -1059,31 +1067,25 @@ NtUserGetLayeredWindowAttributes(
     return 0;
 }
 
-/* ValidateRect gets redirected to NtUserValidateRect:
-   http://blog.csdn.net/ntdll/archive/2005/10/19/509299.aspx */
 BOOL
-NTAPI
-NtUserValidateRect(
+APIENTRY
+NtUserValidateTimerCallback(
     HWND hWnd,
-    CONST RECT *lpRect)
+    WPARAM wParam,
+    LPARAM lParam)
 {
-    UNIMPLEMENTED;
-    return 0;
-}
+  BOOL Ret = FALSE;
 
-DWORD
-NTAPI
-NtUserValidateTimerCallback(
-    DWORD dwUnknown1,
-    DWORD dwUnknown2,
-    DWORD dwUnknown3)
-{
-    UNIMPLEMENTED;
-    return 0;
+  UserEnterShared();
+
+  Ret = ValidateTimerCallback(PsGetCurrentThreadWin32Thread(), lParam);
+
+  UserLeave();
+  return Ret;
 }
 
 DWORD
-NTAPI
+APIENTRY
 NtUserRemoteConnect(
     DWORD dwUnknown1,
     DWORD dwUnknown2,
@@ -1094,7 +1096,7 @@ NtUserRemoteConnect(
 }
 
 DWORD
-NTAPI
+APIENTRY
 NtUserRemoteRedrawRectangle(
     DWORD dwUnknown1,
     DWORD dwUnknown2,
@@ -1106,7 +1108,7 @@ NtUserRemoteRedrawRectangle(
 }
 
 DWORD
-NTAPI
+APIENTRY
 NtUserRemoteRedrawScreen(VOID)
 {
     UNIMPLEMENTED;
@@ -1114,7 +1116,7 @@ NtUserRemoteRedrawScreen(VOID)
 }
 
 DWORD
-NTAPI
+APIENTRY
 NtUserRemoteStopScreenUpdates(VOID)
 {
     UNIMPLEMENTED;
@@ -1122,7 +1124,7 @@ NtUserRemoteStopScreenUpdates(VOID)
 }
 
 DWORD
-NTAPI
+APIENTRY
 NtUserCtxDisplayIOCtl(
     DWORD dwUnknown1,
     DWORD dwUnknown2,
@@ -1132,5 +1134,283 @@ NtUserCtxDisplayIOCtl(
     return 0;
 }
 
+/*
+ * @unimplemented
+ */
+DWORD
+APIENTRY
+NtUserDrawMenuBarTemp(
+   HWND hWnd,
+   HDC hDC,
+   PRECT hRect,
+   HMENU hMenu,
+   HFONT hFont)
+{
+   /* we'll use this function just for caching the menu bar */
+   UNIMPLEMENTED
+   return 0;
+}
+
+/*
+ * FillWindow: Called from User; Dialog, Edit and ListBox procs during a WM_ERASEBKGND.
+ */
+/*
+ * @unimplemented
+ */
+BOOL APIENTRY
+NtUserFillWindow(HWND hWndPaint,
+                 HWND hWndPaint1,
+                 HDC  hDC,
+                 HBRUSH hBrush)
+{
+   UNIMPLEMENTED
+
+   return 0;
+}
+
+/*
+ * @unimplemented
+ */
+BOOL APIENTRY
+NtUserFlashWindowEx(IN PFLASHWINFO pfwi)
+{
+   UNIMPLEMENTED
+
+   return 1;
+}
+
+/*
+ * @unimplemented
+ */
+BOOL APIENTRY
+NtUserLockWindowUpdate(HWND hWnd)
+{
+   UNIMPLEMENTED
+
+   return 0;
+}
+
+/*
+ * @unimplemented
+ */
+HWND APIENTRY
+NtUserRealChildWindowFromPoint(HWND Parent,
+                               LONG x,
+                               LONG y)
+{
+   UNIMPLEMENTED
+
+   return 0;
+}
+
+/*
+ * @unimplemented
+ */
+DWORD APIENTRY
+NtUserSetImeOwnerWindow(DWORD Unknown0,
+                        DWORD Unknown1)
+{
+   UNIMPLEMENTED
+
+   return 0;
+}
+
+/*
+ * @unimplemented
+ */
+DWORD APIENTRY
+NtUserSetInternalWindowPos(
+   HWND    hwnd,
+   UINT    showCmd,
+   LPRECT  rect,
+   LPPOINT pt)
+{
+   UNIMPLEMENTED
+
+   return 0;
+}
+
+/*
+ * @unimplemented
+ */
+BOOL APIENTRY
+NtUserSetLayeredWindowAttributes(HWND hwnd,
+                          COLORREF crKey,
+                          BYTE bAlpha,
+                          DWORD dwFlags)
+{
+  UNIMPLEMENTED;
+  return FALSE;
+}
+
+/*
+ * @unimplemented
+ */
+BOOL
+APIENTRY
+NtUserUpdateLayeredWindow(
+   HWND hwnd,
+   HDC hdcDst,
+   POINT *pptDst,
+   SIZE *psize,
+   HDC hdcSrc,
+   POINT *pptSrc,
+   COLORREF crKey,
+   BLENDFUNCTION *pblend,
+   DWORD dwFlags,
+   RECT *prcDirty)
+{
+   UNIMPLEMENTED
+
+   return 0;
+}
+
+/*
+ *    @unimplemented
+ */
+HWND APIENTRY
+NtUserWindowFromPhysicalPoint(POINT Point)
+{
+   UNIMPLEMENTED
+
+   return NULL;
+}
+
+/*
+ * NtUserResolveDesktopForWOW
+ *
+ * Status
+ *    @unimplemented
+ */
+
+DWORD APIENTRY
+NtUserResolveDesktopForWOW(DWORD Unknown0)
+{
+   UNIMPLEMENTED
+   return 0;
+}
+
+/*
+ * @unimplemented
+ */
+BOOL APIENTRY
+NtUserEndMenu(VOID)
+{
+   UNIMPLEMENTED
+
+   return 0;
+}
+
+/*
+ * @implemented
+ */
+/* NOTE: unused function */
+BOOL APIENTRY
+NtUserTrackPopupMenuEx(
+   HMENU hMenu,
+   UINT fuFlags,
+   int x,
+   int y,
+   HWND hWnd,
+   LPTPMPARAMS lptpm)
+{
+   UNIMPLEMENTED
+
+   return FALSE;
+}
+
+DWORD APIENTRY
+NtUserQuerySendMessage(DWORD Unknown0)
+{
+    UNIMPLEMENTED;
+
+    return 0;
+}
+
+/*
+ * @unimplemented
+ */
+DWORD APIENTRY
+NtUserAlterWindowStyle(DWORD Unknown0,
+                       DWORD Unknown1,
+                       DWORD Unknown2)
+{
+   UNIMPLEMENTED
+
+   return(0);
+}
+
+/*
+ * NtUserSetWindowStationUser
+ *
+ * Status
+ *    @unimplemented
+ */
+
+DWORD APIENTRY
+NtUserSetWindowStationUser(
+   DWORD Unknown0,
+   DWORD Unknown1,
+   DWORD Unknown2,
+   DWORD Unknown3)
+{
+   UNIMPLEMENTED
+
+   return 0;
+}
+
+BOOL APIENTRY NtUserAddClipboardFormatListener(
+    HWND hwnd
+)
+{
+    UNIMPLEMENTED;
+    return FALSE;
+}
+
+BOOL APIENTRY NtUserRemoveClipboardFormatListener(
+    HWND hwnd
+)
+{
+    UNIMPLEMENTED;
+    return FALSE;
+}
+
+BOOL APIENTRY NtUserGetUpdatedClipboardFormats(
+    PUINT lpuiFormats,
+    UINT cFormats,
+    PUINT pcFormatsOut
+)
+{
+    UNIMPLEMENTED;
+    return FALSE;
+}
+
+/*
+ * @unimplemented
+ */
+DWORD
+APIENTRY
+NtUserGetCursorFrameInfo(
+    DWORD Unknown0,
+    DWORD Unknown1,
+    DWORD Unknown2,
+    DWORD Unknown3)
+{
+    UNIMPLEMENTED
+
+    return 0;
+}
+
+/*
+ * @unimplemented
+ */
+BOOL
+APIENTRY
+NtUserSetSystemCursor(
+    HCURSOR hcur,
+    DWORD id)
+{
+    return FALSE;
+}
 
 /* EOF */