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 NtUserLockWorkStation(VOID
)
321 NtUserMNDragLeave(VOID
)
341 NtUserModifyUserStartupInfoFlags(
352 NtUserNotifyIMEStatus(
364 NtUserQueryUserCounters(
378 NtUserRegisterTasklist(
388 NtUserSetConsoleReserveKeys(
438 IN CONST INT
*lpaElements
,
439 IN CONST COLORREF
*lpaRgbValues
,
447 /* We need this check to prevent overflow later */
448 if ((ULONG
)cElements
>= 0x40000000)
450 EngSetLastError(ERROR_NOACCESS
);
454 UserEnterExclusive();
458 ProbeForRead(lpaElements
, cElements
* sizeof(INT
), 1);
459 ProbeForRead(lpaRgbValues
, cElements
* sizeof(COLORREF
), 1);
461 IntSetSysColors(cElements
, lpaElements
, lpaRgbValues
);
463 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
465 SetLastNtError(_SEH2_GetExceptionCode());
472 UserSendNotifyMessage(HWND_BROADCAST
, WM_SYSCOLORCHANGE
, 0, 0);
483 NtUserUpdateInputContext(
495 NtUserUpdateInstance(
507 NtUserUserHandleGrantAccess(
508 IN HANDLE hUserHandle
,
519 NtUserWaitForMsgAndEvent(
529 NtUserWin32PoolAllocationStats(
544 NtUserYieldTask(VOID
)
554 NtUserCheckImeHotKey(
564 NtUserConsoleControl(
565 IN CONSOLECONTROL ConsoleCtrl
,
566 IN PVOID ConsoleCtrlInfo
,
567 IN DWORD ConsoleCtrlInfoLength
)
569 NTSTATUS Status
= STATUS_SUCCESS
;
571 /* Allow only Console Server to perform this operation (via CSRSS) */
572 if (gpepCSRSS
!= PsGetCurrentProcess())
573 return STATUS_ACCESS_DENIED
;
575 UserEnterExclusive();
579 case GuiConsoleWndClassAtom
:
583 ProbeForRead(ConsoleCtrlInfo
, ConsoleCtrlInfoLength
, 1);
584 ASSERT(ConsoleCtrlInfoLength
== sizeof(ATOM
));
585 gaGuiConsoleWndClass
= *(ATOM
*)ConsoleCtrlInfo
;
587 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
589 Status
= _SEH2_GetExceptionCode();
596 case TuiConsoleWndClassAtom
:
600 ProbeForRead(ConsoleCtrlInfo
, ConsoleCtrlInfoLength
, 1);
601 ASSERT(ConsoleCtrlInfoLength
== sizeof(ATOM
));
602 gaTuiConsoleWndClass
= *(ATOM
*)ConsoleCtrlInfo
;
604 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
606 Status
= _SEH2_GetExceptionCode();
614 ERR("Calling invalid control %lu in NtUserConsoleControl\n", ConsoleCtrl
);
615 Status
= STATUS_INVALID_INFO_CLASS
;
626 NtUserCreateInputContext(
635 NtUserDestroyInputContext(
644 NtUserDisableThreadIme(
653 NtUserGetAppImeLevel(
672 NtUserGetRawInputBuffer(
683 NtUserGetRawInputData(
696 NtUserGetRawInputDeviceInfo(
709 NtUserGetRawInputDeviceList(
710 PRAWINPUTDEVICELIST pRawInputDeviceList
,
720 NtUserGetRegisteredRawInputDevices(
721 PRAWINPUTDEVICE pRawInputDevices
,
731 NtUserHardErrorControl(
742 NtUserNotifyProcessCreate(
754 NtUserProcessConnect(
756 PUSERCONNECT pUserConnect
,
759 NTSTATUS Status
= STATUS_SUCCESS
;
760 TRACE("NtUserProcessConnect\n");
761 if (pUserConnect
&& ( Size
== sizeof(USERCONNECT
) ))
763 PPROCESSINFO W32Process
;
766 W32Process
= PsGetCurrentProcessWin32Process();
769 pUserConnect
->siClient
.psi
= gpsi
;
770 pUserConnect
->siClient
.aheList
= gHandleTable
;
771 pUserConnect
->siClient
.ulSharedDelta
= (ULONG_PTR
)W32Process
->HeapMappings
.KernelMapping
-
772 (ULONG_PTR
)W32Process
->HeapMappings
.UserMapping
;
774 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
776 Status
= _SEH2_GetExceptionCode();
779 if (!NT_SUCCESS(Status
))
781 SetLastNtError(Status
);
786 return STATUS_UNSUCCESSFUL
;
791 NtUserQueryInformationThread(
804 NtUserQueryInputContext(
814 NtUserRealInternalGetMessage(
828 NtUserRealWaitMessageEx(
838 NtUserRegisterRawInputDevices(
839 IN PCRAWINPUTDEVICE pRawInputDevices
,
840 IN UINT uiNumDevices
,
849 NtUserResolveDesktop(
861 NtUserSetAppImeLevel(
880 NtUserSetInformationProcess(
892 NtUserSetInformationThread(IN HANDLE ThreadHandle
,
893 IN USERTHREADINFOCLASS ThreadInformationClass
,
894 IN PVOID ThreadInformation
,
895 IN ULONG ThreadInformationLength
)
898 if (ThreadInformationClass
== UserThreadInitiateShutdown
)
900 ERR("Shutdown initiated\n");
902 else if (ThreadInformationClass
== UserThreadEndShutdown
)
904 ERR("Shutdown ended\n");
911 return STATUS_SUCCESS
;
916 NtUserSetThreadLayoutHandles(
926 NtUserSoundSentry(VOID
)
934 NtUserTestForInteractiveUser(
941 /* http://www.cyber-ta.org/releases/malware-analysis/public/SOURCES/b47155634ccb2c30630da7e3666d3d07/b47155634ccb2c30630da7e3666d3d07.trace.html#NtUserGetIconSize */
983 NtUserRemoteRedrawRectangle(
995 NtUserRemoteRedrawScreen(VOID
)
1003 NtUserRemoteStopScreenUpdates(VOID
)
1011 NtUserCtxDisplayIOCtl(
1025 NtUserDrawMenuBarTemp(
1032 /* We'll use this function just for caching the menu bar */
1038 * FillWindow: Called from User; Dialog, Edit and ListBox procs during a WM_ERASEBKGND.
1044 NtUserFillWindow(HWND hWndPaint
,
1058 NtUserLockWindowUpdate(HWND hWnd
)
1069 NtUserSetImeOwnerWindow(DWORD Unknown0
,
1079 NtUserGetLayeredWindowAttributes(
1093 NtUserSetLayeredWindowAttributes(HWND hwnd
,
1107 NtUserUpdateLayeredWindow(
1115 BLENDFUNCTION
*pblend
,
1128 NtUserWindowFromPhysicalPoint(POINT Point
)
1136 * NtUserResolveDesktopForWOW
1143 NtUserResolveDesktopForWOW(DWORD Unknown0
)
1163 /* NOTE: unused function */
1165 NtUserTrackPopupMenuEx(
1179 NtUserQuerySendMessage(DWORD Unknown0
)
1190 NtUserAlterWindowStyle(DWORD Unknown0
,
1200 * NtUserSetWindowStationUser
1207 NtUserSetWindowStationUser(
1218 BOOL APIENTRY
NtUserAddClipboardFormatListener(
1226 BOOL APIENTRY
NtUserRemoveClipboardFormatListener(
1234 BOOL APIENTRY
NtUserGetUpdatedClipboardFormats(
1249 NtUserGetCursorFrameInfo(
1252 PDWORD rate_jiffies
,
1265 NtUserSetSystemCursor(