2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS Win32k subsystem
4 * PURPOSE: Native User stubs
5 * FILE: win32ss/user/ntuser/ntstubs.c
6 * PROGRAMER: Casper S. Hornstrup (chorns@users.sourceforge.net)
10 DBG_DEFAULT_CHANNEL(UserMisc
);
14 NtUserAssociateInputContext(
24 // Works like BitBlt, http://msdn.microsoft.com/en-us/library/ms532278(VS.85).aspx
41 Ret
= NtGdiBitBlt( hdc
,
86 NtUserDrawAnimatedRects(
109 NtUserExcludeUpdateRgn(
135 NtUserInitializeClientPfnArrays(
136 PPFNCLIENT pfnClientA
,
137 PPFNCLIENT pfnClientW
,
138 PPFNCLIENTWORKER pfnClientWorker
,
141 NTSTATUS Status
= STATUS_SUCCESS
;
142 TRACE("Enter NtUserInitializeClientPfnArrays User32 0x%p\n", hmodUser
);
144 if (ClientPfnInit
) return Status
;
146 UserEnterExclusive();
150 ProbeForRead( pfnClientA
, sizeof(PFNCLIENT
), 1);
151 ProbeForRead( pfnClientW
, sizeof(PFNCLIENT
), 1);
152 ProbeForRead( pfnClientWorker
, sizeof(PFNCLIENTWORKER
), 1);
153 RtlCopyMemory(&gpsi
->apfnClientA
, pfnClientA
, sizeof(PFNCLIENT
));
154 RtlCopyMemory(&gpsi
->apfnClientW
, pfnClientW
, sizeof(PFNCLIENT
));
155 RtlCopyMemory(&gpsi
->apfnClientWorker
, pfnClientWorker
, sizeof(PFNCLIENTWORKER
));
157 //// FIXME: HAX! Temporary until server side is finished.
158 //// Copy the client side procs for now.
159 RtlCopyMemory(&gpsi
->aStoCidPfn
, pfnClientW
, sizeof(gpsi
->aStoCidPfn
));
161 hModClient
= hmodUser
;
162 ClientPfnInit
= TRUE
;
164 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
166 Status
=_SEH2_GetExceptionCode();
170 if (!NT_SUCCESS(Status
))
172 ERR("Failed reading Client Pfns from user space.\n");
173 SetLastNtError(Status
);
203 NtUserMNDragLeave(VOID
)
223 NtUserModifyUserStartupInfoFlags(
234 NtUserQueryUserCounters(
248 NtUserRegisterTasklist(
258 NtUserSetConsoleReserveKeys(
293 IN CONST INT
*lpaElements
,
294 IN CONST COLORREF
*lpaRgbValues
,
302 /* We need this check to prevent overflow later */
303 if ((ULONG
)cElements
>= 0x40000000)
305 EngSetLastError(ERROR_NOACCESS
);
309 UserEnterExclusive();
313 ProbeForRead(lpaElements
, cElements
* sizeof(INT
), 1);
314 ProbeForRead(lpaRgbValues
, cElements
* sizeof(COLORREF
), 1);
316 IntSetSysColors(cElements
, lpaElements
, lpaRgbValues
);
318 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
320 SetLastNtError(_SEH2_GetExceptionCode());
327 UserSendNotifyMessage(HWND_BROADCAST
, WM_SYSCOLORCHANGE
, 0, 0);
338 NtUserUpdateInputContext(
350 NtUserUpdateInstance(
362 NtUserUserHandleGrantAccess(
363 IN HANDLE hUserHandle
,
374 NtUserWaitForMsgAndEvent(
384 NtUserWin32PoolAllocationStats(
399 NtUserYieldTask(VOID
)
408 NtUserConsoleControl(
409 IN CONSOLECONTROL ConsoleCtrl
,
410 IN PVOID ConsoleCtrlInfo
,
411 IN ULONG ConsoleCtrlInfoLength
)
413 NTSTATUS Status
= STATUS_SUCCESS
;
415 /* Allow only the Console Server to perform this operation (via CSRSS) */
416 if (PsGetCurrentProcess() != gpepCSRSS
)
417 return STATUS_ACCESS_DENIED
;
419 UserEnterExclusive();
423 case GuiConsoleWndClassAtom
:
425 if (ConsoleCtrlInfoLength
!= sizeof(ATOM
))
427 Status
= STATUS_INFO_LENGTH_MISMATCH
;
433 ProbeForRead(ConsoleCtrlInfo
, ConsoleCtrlInfoLength
, 1);
434 gaGuiConsoleWndClass
= *(ATOM
*)ConsoleCtrlInfo
;
436 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
438 Status
= _SEH2_GetExceptionCode();
445 case ConsoleMakePalettePublic
:
449 if (ConsoleCtrlInfoLength
!= sizeof(HPALETTE
))
451 Status
= STATUS_INFO_LENGTH_MISMATCH
;
457 ProbeForRead(ConsoleCtrlInfo
, ConsoleCtrlInfoLength
, 1);
458 hPalette
= *(HPALETTE
*)ConsoleCtrlInfo
;
460 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
462 Status
= _SEH2_GetExceptionCode();
466 /* Make the palette handle public */
467 GreSetObjectOwnerEx(hPalette
,
469 GDIOBJFLAG_IGNOREPID
);
474 case ConsoleAcquireDisplayOwnership
:
476 ERR("NtUserConsoleControl - ConsoleAcquireDisplayOwnership is UNIMPLEMENTED\n");
477 Status
= STATUS_NOT_IMPLEMENTED
;
482 ERR("Calling invalid control %lu in NtUserConsoleControl\n", ConsoleCtrl
);
483 Status
= STATUS_INVALID_INFO_CLASS
;
494 NtUserCreateInputContext(
503 NtUserDestroyInputContext(
512 NtUserGetRawInputBuffer(
523 NtUserGetRawInputData(
536 NtUserGetRawInputDeviceInfo(
549 NtUserGetRawInputDeviceList(
550 PRAWINPUTDEVICELIST pRawInputDeviceList
,
560 NtUserGetRegisteredRawInputDevices(
561 PRAWINPUTDEVICE pRawInputDevices
,
571 NtUserHardErrorControl(
582 NtUserNotifyProcessCreate(
584 HANDLE ParentThreadId
,
589 TRACE("NtUserNotifyProcessCreate is UNIMPLEMENTED\n");
595 NtUserProcessConnect(
596 IN HANDLE ProcessHandle
,
597 OUT PUSERCONNECT pUserConnect
,
601 PEPROCESS Process
= NULL
;
602 PPROCESSINFO W32Process
;
604 TRACE("NtUserProcessConnect\n");
606 if ( pUserConnect
== NULL
||
607 Size
!= sizeof(*pUserConnect
) )
609 return STATUS_UNSUCCESSFUL
;
612 /* Get the process object the user handle was referencing */
613 Status
= ObReferenceObjectByHandle(ProcessHandle
,
614 PROCESS_VM_OPERATION
,
619 if (!NT_SUCCESS(Status
)) return Status
;
623 /* Get Win32 process information */
624 W32Process
= PsGetProcessWin32Process(Process
);
628 // FIXME: Check that pUserConnect->ulVersion == USER_VERSION;
630 ProbeForWrite(pUserConnect
, sizeof(*pUserConnect
), sizeof(PVOID
));
631 pUserConnect
->siClient
.psi
= gpsi
;
632 pUserConnect
->siClient
.aheList
= gHandleTable
;
633 pUserConnect
->siClient
.ulSharedDelta
=
634 (ULONG_PTR
)W32Process
->HeapMappings
.KernelMapping
-
635 (ULONG_PTR
)W32Process
->HeapMappings
.UserMapping
;
637 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
639 Status
= _SEH2_GetExceptionCode();
643 if (!NT_SUCCESS(Status
))
644 SetLastNtError(Status
);
648 /* Dereference the process object */
649 ObDereferenceObject(Process
);
656 NtUserQueryInformationThread(IN HANDLE ThreadHandle
,
657 IN USERTHREADINFOCLASS ThreadInformationClass
,
658 OUT PVOID ThreadInformation
,
659 IN ULONG ThreadInformationLength
)
661 NTSTATUS Status
= STATUS_SUCCESS
;
664 /* Allow only CSRSS to perform this operation */
665 if (PsGetCurrentProcess() != gpepCSRSS
)
666 return STATUS_ACCESS_DENIED
;
668 UserEnterExclusive();
671 Status
= ObReferenceObjectByHandle(ThreadHandle
,
672 THREAD_QUERY_INFORMATION
,
677 if (!NT_SUCCESS(Status
)) goto Quit
;
679 switch (ThreadInformationClass
)
684 Status
= STATUS_NOT_IMPLEMENTED
;
689 ObDereferenceObject(Thread
);
698 NtUserQueryInputContext(
708 NtUserRealInternalGetMessage(
722 NtUserRealWaitMessageEx(
732 NtUserRegisterRawInputDevices(
733 IN PCRAWINPUTDEVICE pRawInputDevices
,
734 IN UINT uiNumDevices
,
743 NtUserResolveDesktop(
755 NtUserSetInformationProcess(
767 NtUserSetInformationThread(IN HANDLE ThreadHandle
,
768 IN USERTHREADINFOCLASS ThreadInformationClass
,
769 IN PVOID ThreadInformation
,
770 IN ULONG ThreadInformationLength
)
772 NTSTATUS Status
= STATUS_SUCCESS
;
775 /* Allow only CSRSS to perform this operation */
776 if (PsGetCurrentProcess() != gpepCSRSS
)
777 return STATUS_ACCESS_DENIED
;
779 UserEnterExclusive();
782 Status
= ObReferenceObjectByHandle(ThreadHandle
,
783 THREAD_SET_INFORMATION
,
788 if (!NT_SUCCESS(Status
)) goto Quit
;
790 switch (ThreadInformationClass
)
792 case UserThreadInitiateShutdown
:
794 ULONG CapturedFlags
= 0;
796 ERR("Shutdown initiated\n");
798 if (ThreadInformationLength
!= sizeof(ULONG
))
800 Status
= STATUS_INFO_LENGTH_MISMATCH
;
804 /* Capture the caller value */
805 Status
= STATUS_SUCCESS
;
808 ProbeForWrite(ThreadInformation
, sizeof(CapturedFlags
), sizeof(PVOID
));
809 CapturedFlags
= *(PULONG
)ThreadInformation
;
811 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
813 Status
= _SEH2_GetExceptionCode();
817 if (NT_SUCCESS(Status
))
818 Status
= UserInitiateShutdown(Thread
, &CapturedFlags
);
820 /* Return the modified value to the caller */
823 *(PULONG
)ThreadInformation
= CapturedFlags
;
825 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
827 Status
= _SEH2_GetExceptionCode();
834 case UserThreadEndShutdown
:
836 NTSTATUS ShutdownStatus
;
838 ERR("Shutdown ended\n");
840 if (ThreadInformationLength
!= sizeof(ShutdownStatus
))
842 Status
= STATUS_INFO_LENGTH_MISMATCH
;
846 /* Capture the caller value */
847 Status
= STATUS_SUCCESS
;
850 ProbeForRead(ThreadInformation
, sizeof(ShutdownStatus
), sizeof(PVOID
));
851 ShutdownStatus
= *(NTSTATUS
*)ThreadInformation
;
853 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
855 Status
= _SEH2_GetExceptionCode();
859 if (NT_SUCCESS(Status
))
860 Status
= UserEndShutdown(Thread
, ShutdownStatus
);
865 case UserThreadCsrApiPort
:
867 HANDLE CsrPortHandle
;
869 ERR("Set CSR API Port for Win32k\n");
871 if (ThreadInformationLength
!= sizeof(CsrPortHandle
))
873 Status
= STATUS_INFO_LENGTH_MISMATCH
;
877 /* Capture the caller value */
878 Status
= STATUS_SUCCESS
;
881 ProbeForRead(ThreadInformation
, sizeof(CsrPortHandle
), sizeof(PVOID
));
882 CsrPortHandle
= *(PHANDLE
)ThreadInformation
;
884 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
886 Status
= _SEH2_GetExceptionCode();
890 if (NT_SUCCESS(Status
))
891 Status
= InitCsrApiPort(CsrPortHandle
);
899 Status
= STATUS_NOT_IMPLEMENTED
;
904 ObDereferenceObject(Thread
);
913 NtUserSetThreadLayoutHandles(
923 NtUserSoundSentry(VOID
)
931 NtUserTestForInteractiveUser(
938 /* http://www.cyber-ta.org/releases/malware-analysis/public/SOURCES/b47155634ccb2c30630da7e3666d3d07/b47155634ccb2c30630da7e3666d3d07.trace.html#NtUserGetIconSize */
980 NtUserRemoteRedrawRectangle(
992 NtUserRemoteRedrawScreen(VOID
)
1000 NtUserRemoteStopScreenUpdates(VOID
)
1008 NtUserCtxDisplayIOCtl(
1022 NtUserDrawMenuBarTemp(
1029 /* We'll use this function just for caching the menu bar */
1035 * FillWindow: Called from User; Dialog, Edit and ListBox procs during a WM_ERASEBKGND.
1041 NtUserFillWindow(HWND hWndPaint
,
1055 NtUserLockWindowUpdate(HWND hWnd
)
1064 NtUserGetLayeredWindowAttributes(
1078 NtUserSetLayeredWindowAttributes(HWND hwnd
,
1092 NtUserUpdateLayeredWindow(
1100 BLENDFUNCTION
*pblend
,
1110 * NtUserResolveDesktopForWOW
1117 NtUserResolveDesktopForWOW(DWORD Unknown0
)
1137 /* NOTE: unused function */
1139 NtUserTrackPopupMenuEx(
1153 NtUserQuerySendMessage(DWORD Unknown0
)
1160 BOOL APIENTRY
NtUserAddClipboardFormatListener(
1168 BOOL APIENTRY
NtUserRemoveClipboardFormatListener(
1176 BOOL APIENTRY
NtUserGetUpdatedClipboardFormats(