2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS Win32k subsystem
4 * PURPOSE: Native User stubs
5 * FILE: subsystems/win32/win32k/ntuser/ntstubs.c
6 * PROGRAMER: Casper S. Hornstrup (chorns@users.sourceforge.net)
10 DBG_DEFAULT_CHANNEL(UserMisc
);
14 NtUserAssociateInputContext(
26 NtUserAttachThreadInput(
32 PETHREAD Thread
, ThreadTo
;
33 PTHREADINFO pti
, ptiTo
;
37 ERR("Enter NtUserAttachThreadInput %s\n",(fAttach
? "TRUE" : "FALSE" ));
38 Status
= PsLookupThreadByThreadId((HANDLE
)idAttach
, &Thread
);
39 if (!NT_SUCCESS(Status
))
41 EngSetLastError(ERROR_INVALID_PARAMETER
);
44 Status
= PsLookupThreadByThreadId((HANDLE
)idAttachTo
, &ThreadTo
);
45 if (!NT_SUCCESS(Status
))
47 EngSetLastError(ERROR_INVALID_PARAMETER
);
48 ObDereferenceObject(Thread
);
52 pti
= PsGetThreadWin32Thread(Thread
);
53 ptiTo
= PsGetThreadWin32Thread(ThreadTo
);
54 ObDereferenceObject(Thread
);
55 ObDereferenceObject(ThreadTo
);
57 Status
= UserAttachThreadInput( pti
, ptiTo
, fAttach
);
58 if (!NT_SUCCESS(Status
))
60 EngSetLastError(RtlNtStatusToDosError(Status
));
65 ERR("Leave NtUserAttachThreadInput, ret=%d\n",Ret
);
71 // Works like BitBlt, http://msdn.microsoft.com/en-us/library/ms532278(VS.85).aspx
88 Ret
= NtGdiBitBlt( hdc
,
118 NtUserDdeGetQualityOfService(
121 OUT PSECURITY_QUALITY_OF_SERVICE pqosPrev
)
144 NtUserDdeSetQualityOfService(
146 IN PSECURITY_QUALITY_OF_SERVICE pqosNew
,
147 OUT PSECURITY_QUALITY_OF_SERVICE pqosPrev
)
171 NtUserDrawAnimatedRects(
194 NtUserExcludeUpdateRgn(
233 NtUserImpersonateDdeClientWindow(
244 NtUserInitializeClientPfnArrays(
245 PPFNCLIENT pfnClientA
,
246 PPFNCLIENT pfnClientW
,
247 PPFNCLIENTWORKER pfnClientWorker
,
250 NTSTATUS Status
= STATUS_SUCCESS
;
251 TRACE("Enter NtUserInitializeClientPfnArrays User32 0x%p\n", hmodUser
);
253 if (ClientPfnInit
) return Status
;
255 UserEnterExclusive();
259 ProbeForRead( pfnClientA
, sizeof(PFNCLIENT
), 1);
260 ProbeForRead( pfnClientW
, sizeof(PFNCLIENT
), 1);
261 ProbeForRead( pfnClientWorker
, sizeof(PFNCLIENTWORKER
), 1);
262 RtlCopyMemory(&gpsi
->apfnClientA
, pfnClientA
, sizeof(PFNCLIENT
));
263 RtlCopyMemory(&gpsi
->apfnClientW
, pfnClientW
, sizeof(PFNCLIENT
));
264 RtlCopyMemory(&gpsi
->apfnClientWorker
, pfnClientWorker
, sizeof(PFNCLIENTWORKER
));
266 //// FIXME: HAX! Temporary until server side is finished.
267 //// Copy the client side procs for now.
268 RtlCopyMemory(&gpsi
->aStoCidPfn
, pfnClientW
, sizeof(gpsi
->aStoCidPfn
));
270 hModClient
= hmodUser
;
271 ClientPfnInit
= TRUE
;
273 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
275 Status
=_SEH2_GetExceptionCode();
279 if (!NT_SUCCESS(Status
))
281 ERR("Failed reading Client Pfns from user space.\n");
282 SetLastNtError(Status
);
312 NtUserMNDragLeave(VOID
)
332 NtUserModifyUserStartupInfoFlags(
343 NtUserNotifyIMEStatus(
355 NtUserQueryUserCounters(
369 NtUserRegisterTasklist(
379 NtUserSetConsoleReserveKeys(
429 IN CONST INT
*lpaElements
,
430 IN CONST COLORREF
*lpaRgbValues
,
438 /* We need this check to prevent overflow later */
439 if ((ULONG
)cElements
>= 0x40000000)
441 EngSetLastError(ERROR_NOACCESS
);
445 UserEnterExclusive();
449 ProbeForRead(lpaElements
, cElements
* sizeof(INT
), 1);
450 ProbeForRead(lpaRgbValues
, cElements
* sizeof(COLORREF
), 1);
452 IntSetSysColors(cElements
, lpaElements
, lpaRgbValues
);
454 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
456 SetLastNtError(_SEH2_GetExceptionCode());
463 UserSendNotifyMessage(HWND_BROADCAST
, WM_SYSCOLORCHANGE
, 0, 0);
474 NtUserUpdateInputContext(
486 NtUserUpdateInstance(
498 NtUserUserHandleGrantAccess(
499 IN HANDLE hUserHandle
,
510 NtUserWaitForMsgAndEvent(
520 NtUserWin32PoolAllocationStats(
535 NtUserYieldTask(VOID
)
545 NtUserCheckImeHotKey(
555 NtUserConsoleControl(
556 IN CONSOLECONTROL ConsoleCtrl
,
557 IN PVOID ConsoleCtrlInfo
,
558 IN DWORD ConsoleCtrlInfoLength
)
560 NTSTATUS Status
= STATUS_SUCCESS
;
562 /* Allow only Console Server to perform this operation (via CSRSS) */
563 if (gpepCSRSS
!= PsGetCurrentProcess())
564 return STATUS_ACCESS_DENIED
;
566 UserEnterExclusive();
570 case GuiConsoleWndClassAtom
:
574 ProbeForRead(ConsoleCtrlInfo
, ConsoleCtrlInfoLength
, 1);
575 ASSERT(ConsoleCtrlInfoLength
== sizeof(ATOM
));
576 gaGuiConsoleWndClass
= *(ATOM
*)ConsoleCtrlInfo
;
578 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
580 Status
= _SEH2_GetExceptionCode();
587 case TuiConsoleWndClassAtom
:
591 ProbeForRead(ConsoleCtrlInfo
, ConsoleCtrlInfoLength
, 1);
592 ASSERT(ConsoleCtrlInfoLength
== sizeof(ATOM
));
593 gaTuiConsoleWndClass
= *(ATOM
*)ConsoleCtrlInfo
;
595 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
597 Status
= _SEH2_GetExceptionCode();
605 ERR("Calling invalid control %lu in NtUserConsoleControl\n", ConsoleCtrl
);
606 Status
= STATUS_INVALID_INFO_CLASS
;
617 NtUserCreateInputContext(
626 NtUserDestroyInputContext(
635 NtUserDisableThreadIme(
644 NtUserGetAppImeLevel(
663 NtUserGetRawInputBuffer(
674 NtUserGetRawInputData(
687 NtUserGetRawInputDeviceInfo(
700 NtUserGetRawInputDeviceList(
701 PRAWINPUTDEVICELIST pRawInputDeviceList
,
711 NtUserGetRegisteredRawInputDevices(
712 PRAWINPUTDEVICE pRawInputDevices
,
722 NtUserHardErrorControl(
733 NtUserNotifyProcessCreate(
745 NtUserProcessConnect(
747 PUSERCONNECT pUserConnect
,
750 NTSTATUS Status
= STATUS_SUCCESS
;
751 TRACE("NtUserProcessConnect\n");
752 if (pUserConnect
&& ( Size
== sizeof(USERCONNECT
) ))
754 PPROCESSINFO W32Process
;
757 W32Process
= PsGetCurrentProcessWin32Process();
760 pUserConnect
->siClient
.psi
= gpsi
;
761 pUserConnect
->siClient
.aheList
= gHandleTable
;
762 pUserConnect
->siClient
.ulSharedDelta
= (ULONG_PTR
)W32Process
->HeapMappings
.KernelMapping
-
763 (ULONG_PTR
)W32Process
->HeapMappings
.UserMapping
;
765 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
767 Status
= _SEH2_GetExceptionCode();
770 if (!NT_SUCCESS(Status
))
772 SetLastNtError(Status
);
777 return STATUS_UNSUCCESSFUL
;
782 NtUserQueryInformationThread(
795 NtUserQueryInputContext(
805 NtUserRealInternalGetMessage(
819 NtUserRealWaitMessageEx(
829 NtUserRegisterRawInputDevices(
830 IN PCRAWINPUTDEVICE pRawInputDevices
,
831 IN UINT uiNumDevices
,
840 NtUserResolveDesktop(
852 NtUserSetAppImeLevel(
871 NtUserSetInformationProcess(
883 NtUserSetInformationThread(IN HANDLE ThreadHandle
,
884 IN USERTHREADINFOCLASS ThreadInformationClass
,
885 IN PVOID ThreadInformation
,
886 IN ULONG ThreadInformationLength
)
889 if (ThreadInformationClass
== UserThreadInitiateShutdown
)
891 ERR("Shutdown initiated\n");
893 else if (ThreadInformationClass
== UserThreadEndShutdown
)
895 ERR("Shutdown ended\n");
902 return STATUS_SUCCESS
;
907 NtUserSetThreadLayoutHandles(
917 NtUserSoundSentry(VOID
)
925 NtUserTestForInteractiveUser(
932 /* http://www.cyber-ta.org/releases/malware-analysis/public/SOURCES/b47155634ccb2c30630da7e3666d3d07/b47155634ccb2c30630da7e3666d3d07.trace.html#NtUserGetIconSize */
974 NtUserRemoteRedrawRectangle(
986 NtUserRemoteRedrawScreen(VOID
)
994 NtUserRemoteStopScreenUpdates(VOID
)
1002 NtUserCtxDisplayIOCtl(
1016 NtUserDrawMenuBarTemp(
1023 /* We'll use this function just for caching the menu bar */
1029 * FillWindow: Called from User; Dialog, Edit and ListBox procs during a WM_ERASEBKGND.
1035 NtUserFillWindow(HWND hWndPaint
,
1049 NtUserLockWindowUpdate(HWND hWnd
)
1060 NtUserSetImeOwnerWindow(DWORD Unknown0
,
1070 NtUserGetLayeredWindowAttributes(
1084 NtUserSetLayeredWindowAttributes(HWND hwnd
,
1098 NtUserUpdateLayeredWindow(
1106 BLENDFUNCTION
*pblend
,
1119 NtUserWindowFromPhysicalPoint(POINT Point
)
1127 * NtUserResolveDesktopForWOW
1134 NtUserResolveDesktopForWOW(DWORD Unknown0
)
1154 /* NOTE: unused function */
1156 NtUserTrackPopupMenuEx(
1170 NtUserQuerySendMessage(DWORD Unknown0
)
1181 NtUserAlterWindowStyle(DWORD Unknown0
,
1191 * NtUserSetWindowStationUser
1198 NtUserSetWindowStationUser(
1209 BOOL APIENTRY
NtUserAddClipboardFormatListener(
1217 BOOL APIENTRY
NtUserRemoveClipboardFormatListener(
1225 BOOL APIENTRY
NtUserGetUpdatedClipboardFormats(
1240 NtUserGetCursorFrameInfo(
1243 PDWORD rate_jiffies
,
1256 NtUserSetSystemCursor(