* 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)
*/
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(
return 0;
}
-DWORD
-APIENTRY
-NtUserExcludeUpdateRgn(
- HDC hDC,
- HWND hWnd)
-{
- STUB
-
- return 0;
-}
-
BOOL
APIENTRY
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(
return 0;
}
-DWORD
-APIENTRY
-NtUserNotifyIMEStatus(
- DWORD Unknown0,
- DWORD Unknown1,
- DWORD Unknown2)
-{
- STUB
-
- return 0;
-}
-
DWORD
APIENTRY
NtUserQueryUserCounters(
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
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(
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(
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
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;
}
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
return 0;
}
-DWORD
-APIENTRY
-NtUserPaintMenuBar(
- DWORD dwUnknown1,
- DWORD dwUnknown2,
- DWORD dwUnknown3,
- DWORD dwUnknown4,
- DWORD dwUnknown5,
- DWORD dwUnknown6)
-{
- STUB;
- return 0;
-}
-
-
DWORD
APIENTRY
NtUserRemoteConnect(
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
*/
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)
{
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
)
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 */