[WIN32K] -Stub NtUserPaintMenuBar. I'm still not sure about the last parameter and...
[reactos.git] / reactos / win32ss / user / ntuser / ntstubs.c
index bc9705e..51476fe 100644 (file)
@@ -2,7 +2,7 @@
  * 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)
  */
 
@@ -66,44 +66,6 @@ NtUserBuildHimcList(
     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 +104,6 @@ NtUserEvent(
    return 0;
 }
 
-DWORD
-APIENTRY
-NtUserExcludeUpdateRgn(
-  HDC hDC,
-  HWND hWnd)
-{
-   STUB
-
-   return 0;
-}
-
 BOOL
 APIENTRY
 NtUserGetAltTabInfo(
@@ -168,30 +119,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 +218,6 @@ NtUserModifyUserStartupInfoFlags(
    return 0;
 }
 
-DWORD
-APIENTRY
-NtUserNotifyIMEStatus(
-   DWORD Unknown0,
-   DWORD Unknown1,
-   DWORD Unknown2)
-{
-   STUB
-
-   return 0;
-}
-
 DWORD
 APIENTRY
 NtUserQueryUserCounters(
@@ -344,31 +259,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
 
@@ -492,103 +423,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(
@@ -607,34 +441,6 @@ NtUserDestroyInputContext(
     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,62 +515,116 @@ 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
-     {
+    NTSTATUS Status;
+    PEPROCESS Process = NULL;
+    PPROCESSINFO W32Process;
+
+    TRACE("NtUserProcessConnect\n");
+
+    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
+    {
+        // FIXME: Check that pUserConnect->ulVersion == USER_VERSION;
+
+        ProbeForWrite(pUserConnect, sizeof(*pUserConnect), sizeof(PVOID));
         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)
-     {
+        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))
-     {
+    }
+    _SEH2_END;
+
+    if (!NT_SUCCESS(Status))
         SetLastNtError(Status);
-     }
-     UserLeave();
-     return Status;
-  }
-  return STATUS_UNSUCCESSFUL;
+
+    UserLeave();
+
+    /* Dereference the process object */
+    ObDereferenceObject(Process);
+
+    return Status;
 }
 
-DWORD
+NTSTATUS
 APIENTRY
-NtUserQueryInformationThread(
-    DWORD dwUnknown1,
-    DWORD dwUnknown2,
-    DWORD dwUnknown3,
-    DWORD dwUnknown4,
-    DWORD dwUnknown5)
+NtUserQueryInformationThread(IN HANDLE ThreadHandle,
+                             IN USERTHREADINFOCLASS ThreadInformationClass,
+                             OUT PVOID ThreadInformation,
+                             IN ULONG ThreadInformationLength)
 {
-    STUB;
-    return 0;
+    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;
 }
 
 DWORD
@@ -812,34 +672,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;
 }
 
@@ -861,22 +697,142 @@ 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;
+
+            ERR("Shutdown initiated\n");
+
+            if (ThreadInformationLength != sizeof(ULONG))
+            {
+                Status = STATUS_INFO_LENGTH_MISMATCH;
+                break;
+            }
+
+            /* Capture the caller value */
+            Status = STATUS_SUCCESS;
+            _SEH2_TRY
+            {
+                ProbeForWrite(ThreadInformation, sizeof(CapturedFlags), sizeof(PVOID));
+                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;
+
+            ERR("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), sizeof(PVOID));
+                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;
+
+            ERR("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), sizeof(PVOID));
+                CsrPortHandle = *(PHANDLE)ThreadInformation;
+            }
+            _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+            {
+                Status = _SEH2_GetExceptionCode();
+                _SEH2_YIELD(break);
+            }
+            _SEH2_END;
+
+            Status = InitCsrApiPort(CsrPortHandle);
+            break;
+        }
+
+        default:
+        {
+            STUB;
+            Status = STATUS_NOT_IMPLEMENTED;
+            break;
+        }
     }
 
-    return STATUS_SUCCESS;
+    ObDereferenceObject(Thread);
+
+Quit:
+    UserLeave();
+    return Status;
 }
 
 DWORD
@@ -920,21 +876,6 @@ NtUserCalcMenuBar(
     return 0;
 }
 
-DWORD
-APIENTRY
-NtUserPaintMenuBar(
-    DWORD dwUnknown1,
-    DWORD dwUnknown2,
-    DWORD dwUnknown3,
-    DWORD dwUnknown4,
-    DWORD dwUnknown5,
-    DWORD dwUnknown6)
-{
-    STUB;
-    return 0;
-}
-
-
 DWORD
 APIENTRY
 NtUserRemoteConnect(
@@ -985,40 +926,6 @@ 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
  */
@@ -1030,108 +937,6 @@ NtUserLockWindowUpdate(HWND hWnd)
    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;
-}
-
-/*
- * 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;
-}
-
 DWORD APIENTRY
 NtUserQuerySendMessage(DWORD Unknown0)
 {
@@ -1140,38 +945,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
 )
@@ -1198,16 +971,25 @@ BOOL APIENTRY NtUserGetUpdatedClipboardFormats(
     return FALSE;
 }
 
-/*
- * @unimplemented
- */
+// 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;
 }
 
+DWORD
+APIENTRY
+NtDxEngGetRedirectionBitmap(
+    DWORD Unknown0)
+{
+    STUB;
+    return 0;
+}
+
+
 /* EOF */