[BROWSEUI] SHExplorerParseCmdLine: Fix parsing of /root (#6752)
[reactos.git] / win32ss / user / ntuser / ntstubs.c
index 2176cde..99e34dc 100644 (file)
@@ -2,24 +2,13 @@
  * COPYRIGHT:        See COPYING in the top level directory
  * PROJECT:          ReactOS Win32k subsystem
  * PURPOSE:          Native User stubs
- * FILE:             subsystems/win32/win32k/ntuser/ntstubs.c
+ * FILE:             win32ss/user/ntuser/ntstubs.c
  * PROGRAMER:        Casper S. Hornstrup (chorns@users.sourceforge.net)
  */
 
 #include <win32k.h>
 DBG_DEFAULT_CHANNEL(UserMisc);
 
-DWORD
-APIENTRY
-NtUserAssociateInputContext(
-    DWORD dwUnknown1,
-    DWORD dwUnknown2,
-    DWORD dwUnknown3)
-{
-    STUB
-    return 0;
-}
-
 //
 // Works like BitBlt, http://msdn.microsoft.com/en-us/library/ms532278(VS.85).aspx
 //
@@ -54,56 +43,6 @@ NtUserBitBltSysBmp(
    return Ret;
 }
 
-DWORD
-APIENTRY
-NtUserBuildHimcList(
-    DWORD dwUnknown1,
-    DWORD dwUnknown2,
-    DWORD dwUnknown3,
-    DWORD dwUnknown4)
-{
-    STUB;
-    return 0;
-}
-
-BOOL
-APIENTRY
-NtUserDdeGetQualityOfService(
-   IN HWND hwndClient,
-   IN HWND hWndServer,
-   OUT PSECURITY_QUALITY_OF_SERVICE pqosPrev)
-{
-   STUB
-
-   return 0;
-}
-
-DWORD
-APIENTRY
-NtUserDdeInitialize(
-   DWORD Unknown0,
-   DWORD Unknown1,
-   DWORD Unknown2,
-   DWORD Unknown3,
-   DWORD Unknown4)
-{
-   STUB
-
-   return 0;
-}
-
-BOOL
-APIENTRY
-NtUserDdeSetQualityOfService(
-   IN  HWND hwndClient,
-   IN  PSECURITY_QUALITY_OF_SERVICE pqosNew,
-   OUT PSECURITY_QUALITY_OF_SERVICE pqosPrev)
-{
-   STUB
-
-   return 0;
-}
-
 DWORD
 APIENTRY
 NtUserDragObject(
@@ -142,17 +81,6 @@ NtUserEvent(
    return 0;
 }
 
-DWORD
-APIENTRY
-NtUserExcludeUpdateRgn(
-  HDC hDC,
-  HWND hWnd)
-{
-   STUB
-
-   return 0;
-}
-
 BOOL
 APIENTRY
 NtUserGetAltTabInfo(
@@ -168,30 +96,6 @@ NtUserGetAltTabInfo(
    return 0;
 }
 
-DWORD
-APIENTRY
-NtUserGetImeHotKey(
-   DWORD Unknown0,
-   DWORD Unknown1,
-   DWORD Unknown2,
-   DWORD Unknown3)
-{
-   STUB
-
-   return 0;
-}
-
-BOOL
-APIENTRY
-NtUserImpersonateDdeClientWindow(
-   HWND hWndClient,
-   HWND hWndServer)
-{
-   STUB
-
-   return 0;
-}
-
 NTSTATUS
 APIENTRY
 NtUserInitializeClientPfnArrays(
@@ -291,18 +195,6 @@ NtUserModifyUserStartupInfoFlags(
    return 0;
 }
 
-DWORD
-APIENTRY
-NtUserNotifyIMEStatus(
-   DWORD Unknown0,
-   DWORD Unknown1,
-   DWORD Unknown2)
-{
-   STUB
-
-   return 0;
-}
-
 DWORD
 APIENTRY
 NtUserQueryUserCounters(
@@ -344,31 +236,47 @@ NtUserSetDbgTag(
    DWORD Unknown0,
    DWORD Unknown1)
 {
-   STUB
+   STUB;
 
    return 0;
 }
 
 DWORD
 APIENTRY
-NtUserSetImeHotKey(
-   DWORD Unknown0,
-   DWORD Unknown1,
-   DWORD Unknown2,
-   DWORD Unknown3,
-   DWORD Unknown4)
+NtUserSetDbgTagCount(
+    DWORD Unknown0)
 {
-   STUB
+    STUB;
+
+    return 0;
+}
+
+DWORD
+APIENTRY
+NtUserSetRipFlags(
+   DWORD Unknown0)
+{
+   STUB;
 
    return 0;
 }
 
+DWORD
+APIENTRY
+NtUserDbgWin32HeapFail(
+    DWORD Unknown0,
+    DWORD Unknown1)
+{
+   STUB
+
+   return 0;
+}
 
 DWORD
 APIENTRY
-NtUserSetRipFlags(
-   DWORD Unknown0,
-   DWORD Unknown1)
+NtUserDbgWin32HeapStat(
+    DWORD Unknown0,
+    DWORD Unknown1)
 {
    STUB
 
@@ -422,18 +330,6 @@ NtUserSetSysColors(
    return Ret;
 }
 
-DWORD
-APIENTRY
-NtUserUpdateInputContext(
-   DWORD Unknown0,
-   DWORD Unknown1,
-   DWORD Unknown2)
-{
-   STUB
-
-   return 0;
-}
-
 DWORD
 APIENTRY
 NtUserUpdateInstance(
@@ -492,149 +388,6 @@ NtUserYieldTask(VOID)
    return 0;
 }
 
-
-DWORD
-APIENTRY
-NtUserCheckImeHotKey(
-    DWORD dwUnknown1,
-    DWORD dwUnknown2)
-{
-    STUB;
-    return 0;
-}
-
-NTSTATUS
-APIENTRY
-NtUserConsoleControl(
-    IN CONSOLECONTROL ConsoleCtrl,
-    IN PVOID ConsoleCtrlInfo,
-    IN ULONG ConsoleCtrlInfoLength)
-{
-    NTSTATUS Status = STATUS_SUCCESS;
-
-    /* Allow only Console Server to perform this operation (via CSRSS) */
-    if (gpepCSRSS != PsGetCurrentProcess())
-        return STATUS_ACCESS_DENIED;
-
-    UserEnterExclusive();
-
-    switch (ConsoleCtrl)
-    {
-        case GuiConsoleWndClassAtom:
-        {
-            if (ConsoleCtrlInfoLength != sizeof(ATOM))
-            {
-                Status = STATUS_INFO_LENGTH_MISMATCH;
-                break;
-            }
-
-            _SEH2_TRY
-            {
-                ProbeForRead(ConsoleCtrlInfo, ConsoleCtrlInfoLength, 1);
-                gaGuiConsoleWndClass = *(ATOM*)ConsoleCtrlInfo;
-            }
-            _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
-            {
-                Status = _SEH2_GetExceptionCode();
-            }
-            _SEH2_END;
-
-            break;
-        }
-
-        case ConsoleMakePalettePublic:
-        {
-            HPALETTE hPalette;
-
-            if (ConsoleCtrlInfoLength != sizeof(HPALETTE))
-            {
-                Status = STATUS_INFO_LENGTH_MISMATCH;
-                break;
-            }
-
-            _SEH2_TRY
-            {
-                ProbeForRead(ConsoleCtrlInfo, ConsoleCtrlInfoLength, 1);
-                hPalette = *(HPALETTE*)ConsoleCtrlInfo;
-            }
-            _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
-            {
-                Status = _SEH2_GetExceptionCode();
-            }
-            _SEH2_END;
-
-            /* Make the palette handle public */
-            GreSetObjectOwnerEx(hPalette,
-                                GDI_OBJ_HMGR_PUBLIC,
-                                GDIOBJFLAG_IGNOREPID);
-
-            break;
-        }
-
-        case ConsoleAcquireDisplayOwnership:
-        {
-            ERR("NtUserConsoleControl - ConsoleAcquireDisplayOwnership is UNIMPLEMENTED\n");
-            Status = STATUS_NOT_IMPLEMENTED;
-            break;
-        }
-
-        default:
-            ERR("Calling invalid control %lu in NtUserConsoleControl\n", ConsoleCtrl);
-            Status = STATUS_INVALID_INFO_CLASS;
-            break;
-    }
-
-    UserLeave();
-
-    return Status;
-}
-
-DWORD
-APIENTRY
-NtUserCreateInputContext(
-    DWORD dwUnknown1)
-{
-    STUB;
-    return 0;
-}
-
-DWORD
-APIENTRY
-NtUserDestroyInputContext(
-    DWORD dwUnknown1)
-{
-    STUB;
-    return 0;
-}
-
-DWORD
-APIENTRY
-NtUserDisableThreadIme(
-    DWORD dwUnknown1)
-{
-    STUB;
-    return 0;
-}
-
-DWORD
-APIENTRY
-NtUserGetAppImeLevel(
-    DWORD dwUnknown1)
-{
-    STUB;
-    return 0;
-}
-
-DWORD
-APIENTRY
-NtUserGetImeInfoEx(
-    DWORD dwUnknown1,
-    DWORD dwUnknown2)
-{
-    STUB;
-    return 0;
-}
-
 DWORD
 APIENTRY
 NtUserGetRawInputBuffer(
@@ -709,72 +462,153 @@ BOOL
 NTAPI
 NtUserNotifyProcessCreate(
     HANDLE NewProcessId,
-    HANDLE SourceThreadId,
-    DWORD dwUnknown,
-    ULONG CreateFlags)
+    HANDLE ParentThreadId,
+    ULONG  dwUnknown,
+    ULONG  CreateFlags)
 {
-    STUB;
+    // STUB;
+    TRACE("NtUserNotifyProcessCreate is UNIMPLEMENTED\n");
     return FALSE;
 }
 
 NTSTATUS
 APIENTRY
 NtUserProcessConnect(
-    HANDLE Process,
-    PUSERCONNECT pUserConnect,
-    DWORD Size)
+    IN  HANDLE ProcessHandle,
+    OUT PUSERCONNECT pUserConnect,
+    IN  ULONG Size)
 {
-  NTSTATUS Status = STATUS_SUCCESS;
-  TRACE("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;
-}
+    NTSTATUS Status;
+    PEPROCESS Process = NULL;
+    PPROCESSINFO W32Process;
 
-DWORD
-APIENTRY
-NtUserQueryInformationThread(
-    DWORD dwUnknown1,
-    DWORD dwUnknown2,
-    DWORD dwUnknown3,
-    DWORD dwUnknown4,
-    DWORD dwUnknown5)
-{
-    STUB;
-    return 0;
-}
+    TRACE("NtUserProcessConnect\n");
 
-DWORD
-APIENTRY
-NtUserQueryInputContext(
-    DWORD dwUnknown1,
-    DWORD dwUnknown2)
-{
-    STUB;
-    return 0;
+    if (pUserConnect == NULL ||
+        Size != sizeof(*pUserConnect))
+    {
+        return STATUS_UNSUCCESSFUL;
+    }
+
+    /* Get the process object the user handle was referencing */
+    Status = ObReferenceObjectByHandle(ProcessHandle,
+                                       PROCESS_VM_OPERATION,
+                                       *PsProcessType,
+                                       UserMode,
+                                       (PVOID*)&Process,
+                                       NULL);
+    if (!NT_SUCCESS(Status)) return Status;
+
+    UserEnterShared();
+
+    /* Get Win32 process information */
+    W32Process = PsGetProcessWin32Process(Process);
+
+    _SEH2_TRY
+    {
+        UINT i;
+
+        // FIXME: Check that pUserConnect->ulVersion == USER_VERSION;
+        // FIXME: Check the value of pUserConnect->dwDispatchCount.
+
+        ProbeForWrite(pUserConnect, sizeof(*pUserConnect), sizeof(PVOID));
+
+        // FIXME: Instead of assuming that the mapping of the heap desktop
+        // also holds there, we **MUST** create and map instead the shared
+        // section! Its client base must be stored in W32Process->pClientBase.
+        // What is currently done (ReactOS-specific only), is that within the
+        // IntUserHeapCommitRoutine()/MapGlobalUserHeap() routines we assume
+        // it's going to be also called early, so that we manually add a very
+        // first memory mapping that corresponds to the "global user heap",
+        // and that we use instead of a actual win32 "shared USER section"
+        // (see slide 29 of https://paper.bobylive.com/Meeting_Papers/BlackHat/USA-2011/BH_US_11_Mandt_win32k_Slides.pdf )
+
+        pUserConnect->siClient.ulSharedDelta =
+            (ULONG_PTR)W32Process->HeapMappings.KernelMapping -
+            (ULONG_PTR)W32Process->HeapMappings.UserMapping;
+
+#define SERVER_TO_CLIENT(ptr) \
+    ((PVOID)((ULONG_PTR)ptr - pUserConnect->siClient.ulSharedDelta))
+
+        ASSERT(gpsi);
+        ASSERT(gHandleTable);
+
+        pUserConnect->siClient.psi       = SERVER_TO_CLIENT(gpsi);
+        pUserConnect->siClient.aheList   = SERVER_TO_CLIENT(gHandleTable);
+        pUserConnect->siClient.pDispInfo = NULL;
+
+        // NOTE: kernel server should also have a SHAREDINFO gSharedInfo;
+        // FIXME: These USER window-proc data should be used somehow!
+
+        pUserConnect->siClient.DefWindowMsgs.maxMsgs     = 0;
+        pUserConnect->siClient.DefWindowMsgs.abMsgs      = NULL;
+        pUserConnect->siClient.DefWindowSpecMsgs.maxMsgs = 0;
+        pUserConnect->siClient.DefWindowSpecMsgs.abMsgs  = NULL;
+
+        for (i = 0; i < ARRAYSIZE(pUserConnect->siClient.awmControl); ++i)
+        {
+            pUserConnect->siClient.awmControl[i].maxMsgs = 0;
+            pUserConnect->siClient.awmControl[i].abMsgs  = NULL;
+        }
+#undef SERVER_TO_CLIENT
+    }
+    _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+    {
+        Status = _SEH2_GetExceptionCode();
+    }
+    _SEH2_END;
+
+    if (!NT_SUCCESS(Status))
+        SetLastNtError(Status);
+
+    UserLeave();
+
+    /* Dereference the process object */
+    ObDereferenceObject(Process);
+
+    return Status;
+}
+
+NTSTATUS
+APIENTRY
+NtUserQueryInformationThread(IN HANDLE ThreadHandle,
+                             IN USERTHREADINFOCLASS ThreadInformationClass,
+                             OUT PVOID ThreadInformation,
+                             IN ULONG ThreadInformationLength)
+{
+    NTSTATUS Status = STATUS_SUCCESS;
+    PETHREAD Thread;
+
+    /* Allow only CSRSS to perform this operation */
+    if (PsGetCurrentProcess() != gpepCSRSS)
+        return STATUS_ACCESS_DENIED;
+
+    UserEnterExclusive();
+
+    /* Get the Thread */
+    Status = ObReferenceObjectByHandle(ThreadHandle,
+                                       THREAD_QUERY_INFORMATION,
+                                       *PsThreadType,
+                                       UserMode,
+                                       (PVOID)&Thread,
+                                       NULL);
+    if (!NT_SUCCESS(Status)) goto Quit;
+
+    switch (ThreadInformationClass)
+    {
+        default:
+        {
+            STUB;
+            Status = STATUS_NOT_IMPLEMENTED;
+            break;
+        }
+    }
+
+    ObDereferenceObject(Thread);
+
+Quit:
+    UserLeave();
+    return Status;
 }
 
 BOOL
@@ -812,34 +646,10 @@ NtUserRegisterRawInputDevices(
     return 0;
 }
 
-DWORD
-APIENTRY
-NtUserResolveDesktop(
-    DWORD dwUnknown1,
-    DWORD dwUnknown2,
-    DWORD dwUnknown3,
-    DWORD dwUnknown4)
-{
-    STUB;
-    return 0;
-}
-
-DWORD
-APIENTRY
-NtUserSetAppImeLevel(
-    DWORD dwUnknown1,
-    DWORD dwUnknown2)
-{
-    STUB;
-    return 0;
-}
-
-DWORD
-APIENTRY
-NtUserSetImeInfoEx(
-    DWORD dwUnknown1)
+DWORD APIENTRY
+NtUserResolveDesktopForWOW(DWORD Unknown0)
 {
-    STUB;
+    STUB
     return 0;
 }
 
@@ -855,38 +665,177 @@ NtUserSetInformationProcess(
     return 0;
 }
 
+HDESK FASTCALL
+IntGetDesktopObjectHandle(PDESKTOP DesktopObject);
+
 NTSTATUS
 APIENTRY
 NtUserSetInformationThread(IN HANDLE ThreadHandle,
                            IN USERTHREADINFOCLASS ThreadInformationClass,
                            IN PVOID ThreadInformation,
                            IN ULONG ThreadInformationLength)
-
 {
-    if (ThreadInformationClass == UserThreadInitiateShutdown)
-    {
-        ERR("Shutdown initiated\n");
-    }
-    else if (ThreadInformationClass == UserThreadEndShutdown)
-    {
-        ERR("Shutdown ended\n");
-    }
-    else
+    NTSTATUS Status = STATUS_SUCCESS;
+    PETHREAD Thread;
+
+    /* Allow only CSRSS to perform this operation */
+    if (PsGetCurrentProcess() != gpepCSRSS)
+        return STATUS_ACCESS_DENIED;
+
+    UserEnterExclusive();
+
+    /* Get the Thread */
+    Status = ObReferenceObjectByHandle(ThreadHandle,
+                                       THREAD_SET_INFORMATION,
+                                       *PsThreadType,
+                                       UserMode,
+                                       (PVOID)&Thread,
+                                       NULL);
+    if (!NT_SUCCESS(Status)) goto Quit;
+
+    switch (ThreadInformationClass)
     {
-        STUB;
+        case UserThreadInitiateShutdown:
+        {
+            ULONG CapturedFlags = 0;
+
+            TRACE("Shutdown initiated\n");
+
+            if (ThreadInformationLength != sizeof(CapturedFlags))
+            {
+                Status = STATUS_INFO_LENGTH_MISMATCH;
+                break;
+            }
+
+            /* Capture the caller value */
+            Status = STATUS_SUCCESS;
+            _SEH2_TRY
+            {
+                ProbeForWrite(ThreadInformation, sizeof(CapturedFlags), __alignof(CapturedFlags));
+                CapturedFlags = *(PULONG)ThreadInformation;
+            }
+            _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+            {
+                Status = _SEH2_GetExceptionCode();
+                _SEH2_YIELD(break);
+            }
+            _SEH2_END;
+
+            Status = UserInitiateShutdown(Thread, &CapturedFlags);
+
+            /* Return the modified value to the caller */
+            _SEH2_TRY
+            {
+                *(PULONG)ThreadInformation = CapturedFlags;
+            }
+            _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+            {
+                Status = _SEH2_GetExceptionCode();
+            }
+            _SEH2_END;
+
+            break;
+        }
+
+        case UserThreadEndShutdown:
+        {
+            NTSTATUS ShutdownStatus;
+
+            TRACE("Shutdown ended\n");
+
+            if (ThreadInformationLength != sizeof(ShutdownStatus))
+            {
+                Status = STATUS_INFO_LENGTH_MISMATCH;
+                break;
+            }
+
+            /* Capture the caller value */
+            Status = STATUS_SUCCESS;
+            _SEH2_TRY
+            {
+                ProbeForRead(ThreadInformation, sizeof(ShutdownStatus), __alignof(ShutdownStatus));
+                ShutdownStatus = *(NTSTATUS*)ThreadInformation;
+            }
+            _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+            {
+                Status = _SEH2_GetExceptionCode();
+                _SEH2_YIELD(break);
+            }
+            _SEH2_END;
+
+            Status = UserEndShutdown(Thread, ShutdownStatus);
+            break;
+        }
+
+        case UserThreadCsrApiPort:
+        {
+            HANDLE CsrPortHandle;
+
+
+            TRACE("Set CSR API Port for Win32k\n");
+            if (ThreadInformationLength != sizeof(CsrPortHandle))
+            {
+                Status = STATUS_INFO_LENGTH_MISMATCH;
+                break;
+            }
+
+            /* Capture the caller value */
+            Status = STATUS_SUCCESS;
+            _SEH2_TRY
+            {
+                ProbeForRead(ThreadInformation, sizeof(CsrPortHandle), __alignof(CsrPortHandle));
+                CsrPortHandle = *(PHANDLE)ThreadInformation;
+            }
+            _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+            {
+                Status = _SEH2_GetExceptionCode();
+                _SEH2_YIELD(break);
+            }
+            _SEH2_END;
+
+            Status = InitCsrApiPort(CsrPortHandle);
+            break;
+        }
+
+        case UserThreadUseActiveDesktop:
+        {
+            HDESK hdesk;
+
+            if (Thread != PsGetCurrentThread())
+            {
+                Status = STATUS_NOT_IMPLEMENTED;
+                break;
+            }
+
+            hdesk = IntGetDesktopObjectHandle(gpdeskInputDesktop);
+            IntSetThreadDesktop(hdesk, FALSE);
+
+            break;
+        }
+        case UserThreadRestoreDesktop:
+        {
+            if (Thread != PsGetCurrentThread())
+            {
+                Status = STATUS_NOT_IMPLEMENTED;
+                break;
+            }
+
+            IntSetThreadDesktop(NULL, FALSE);
+            break;
+        }
+        default:
+        {
+            STUB;
+            Status = STATUS_NOT_IMPLEMENTED;
+            break;
+        }
     }
 
-    return STATUS_SUCCESS;
-}
+    ObDereferenceObject(Thread);
 
-DWORD
-APIENTRY
-NtUserSetThreadLayoutHandles(
-    DWORD dwUnknown1,
-    DWORD dwUnknown2)
-{
-    STUB;
-    return 0;
+Quit:
+    UserLeave();
+    return Status;
 }
 
 BOOL
@@ -906,35 +855,6 @@ NtUserTestForInteractiveUser(
     return 0;
 }
 
-/* http://www.cyber-ta.org/releases/malware-analysis/public/SOURCES/b47155634ccb2c30630da7e3666d3d07/b47155634ccb2c30630da7e3666d3d07.trace.html#NtUserGetIconSize */
-DWORD
-APIENTRY
-NtUserCalcMenuBar(
-    DWORD dwUnknown1,
-    DWORD dwUnknown2,
-    DWORD dwUnknown3,
-    DWORD dwUnknown4,
-    DWORD dwUnknown5)
-{
-    STUB;
-    return 0;
-}
-
-DWORD
-APIENTRY
-NtUserPaintMenuBar(
-    DWORD dwUnknown1,
-    DWORD dwUnknown2,
-    DWORD dwUnknown3,
-    DWORD dwUnknown4,
-    DWORD dwUnknown5,
-    DWORD dwUnknown6)
-{
-    STUB;
-    return 0;
-}
-
-
 DWORD
 APIENTRY
 NtUserRemoteConnect(
@@ -985,162 +905,14 @@ 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 */
-   STUB
-   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)
-{
-   STUB
-
-   return 0;
-}
-
 /*
  * @unimplemented
  */
 BOOL APIENTRY
 NtUserLockWindowUpdate(HWND hWnd)
-{
-   STUB
-
-   return 0;
-}
-
-/*
- * @unimplemented
- */
-DWORD APIENTRY
-NtUserSetImeOwnerWindow(DWORD Unknown0,
-                        DWORD Unknown1)
-{
-   STUB
-
-   return 0;
-}
-
-BOOL
-APIENTRY
-NtUserGetLayeredWindowAttributes(
-    HWND hwnd,
-    COLORREF *pcrKey,
-    BYTE *pbAlpha,
-    DWORD *pdwFlags)
 {
     STUB;
-    return 0;
-}
-
-/*
- * @unimplemented
- */
-BOOL APIENTRY
-NtUserSetLayeredWindowAttributes(HWND hwnd,
-                          COLORREF crKey,
-                          BYTE bAlpha,
-                          DWORD dwFlags)
-{
-  STUB;
-  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)
-{
-   STUB
-
-   return 0;
-}
-
-/*
- *    @unimplemented
- */
-HWND APIENTRY
-NtUserWindowFromPhysicalPoint(POINT Point)
-{
-   STUB
-
-   return NULL;
-}
-
-/*
- * NtUserResolveDesktopForWOW
- *
- * Status
- *    @unimplemented
- */
-
-DWORD APIENTRY
-NtUserResolveDesktopForWOW(DWORD Unknown0)
-{
-   STUB
-   return 0;
-}
-
-/*
- * @unimplemented
- */
-BOOL APIENTRY
-NtUserEndMenu(VOID)
-{
-   STUB
-
-   return 0;
-}
-
-/*
- * @implemented
- */
-/* NOTE: unused function */
-BOOL APIENTRY
-NtUserTrackPopupMenuEx(
-   HMENU hMenu,
-   UINT fuFlags,
-   int x,
-   int y,
-   HWND hWnd,
-   LPTPMPARAMS lptpm)
-{
-   STUB
-
-   return FALSE;
+    return FALSE;
 }
 
 DWORD APIENTRY
@@ -1151,38 +923,6 @@ NtUserQuerySendMessage(DWORD Unknown0)
     return 0;
 }
 
-/*
- * @unimplemented
- */
-DWORD APIENTRY
-NtUserAlterWindowStyle(DWORD Unknown0,
-                       DWORD Unknown1,
-                       DWORD Unknown2)
-{
-   STUB
-
-   return(0);
-}
-
-/*
- * NtUserSetWindowStationUser
- *
- * Status
- *    @unimplemented
- */
-
-DWORD APIENTRY
-NtUserSetWindowStationUser(
-   DWORD Unknown0,
-   DWORD Unknown1,
-   DWORD Unknown2,
-   DWORD Unknown3)
-{
-   STUB
-
-   return 0;
-}
-
 BOOL APIENTRY NtUserAddClipboardFormatListener(
     HWND hwnd
 )
@@ -1209,16 +949,42 @@ BOOL APIENTRY NtUserGetUpdatedClipboardFormats(
     return FALSE;
 }
 
-/*
- * @unimplemented
- */
+LONG_PTR
+APIENTRY
+NtUserSetClassLongPtr(
+    VOID)
+{
+    STUB;
+    return 0;
+}
+
+// Yes, I know, these do not belong here, just tell me where to put them
 BOOL
 APIENTRY
-NtUserSetSystemCursor(
-    HCURSOR hcur,
-    DWORD id)
+NtGdiMakeObjectXferable(
+    _In_ HANDLE hHandle,
+    _In_ DWORD dwProcessId)
 {
-    return FALSE;
+    STUB;
+    return 0;
+}
+
+BOOL
+APIENTRY
+NtGdiMakeObjectUnXferable(
+    _In_ HANDLE hHandle)
+{
+    STUB;
+    return 0;
+}
+
+DWORD
+APIENTRY
+NtDxEngGetRedirectionBitmap(
+    DWORD Unknown0)
+{
+    STUB;
+    return 0;
 }
 
 /* EOF */