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(
124 NtUserInitializeClientPfnArrays(
125 PPFNCLIENT pfnClientA
,
126 PPFNCLIENT pfnClientW
,
127 PPFNCLIENTWORKER pfnClientWorker
,
130 NTSTATUS Status
= STATUS_SUCCESS
;
131 TRACE("Enter NtUserInitializeClientPfnArrays User32 0x%p\n", hmodUser
);
133 if (ClientPfnInit
) return Status
;
135 UserEnterExclusive();
139 ProbeForRead( pfnClientA
, sizeof(PFNCLIENT
), 1);
140 ProbeForRead( pfnClientW
, sizeof(PFNCLIENT
), 1);
141 ProbeForRead( pfnClientWorker
, sizeof(PFNCLIENTWORKER
), 1);
142 RtlCopyMemory(&gpsi
->apfnClientA
, pfnClientA
, sizeof(PFNCLIENT
));
143 RtlCopyMemory(&gpsi
->apfnClientW
, pfnClientW
, sizeof(PFNCLIENT
));
144 RtlCopyMemory(&gpsi
->apfnClientWorker
, pfnClientWorker
, sizeof(PFNCLIENTWORKER
));
146 //// FIXME: HAX! Temporary until server side is finished.
147 //// Copy the client side procs for now.
148 RtlCopyMemory(&gpsi
->aStoCidPfn
, pfnClientW
, sizeof(gpsi
->aStoCidPfn
));
150 hModClient
= hmodUser
;
151 ClientPfnInit
= TRUE
;
153 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
155 Status
=_SEH2_GetExceptionCode();
159 if (!NT_SUCCESS(Status
))
161 ERR("Failed reading Client Pfns from user space.\n");
162 SetLastNtError(Status
);
192 NtUserMNDragLeave(VOID
)
212 NtUserModifyUserStartupInfoFlags(
223 NtUserQueryUserCounters(
237 NtUserRegisterTasklist(
247 NtUserSetConsoleReserveKeys(
269 NtUserSetDbgTagCount(
289 NtUserDbgWin32HeapFail(
300 NtUserDbgWin32HeapStat(
313 IN CONST INT
*lpaElements
,
314 IN CONST COLORREF
*lpaRgbValues
,
322 /* We need this check to prevent overflow later */
323 if ((ULONG
)cElements
>= 0x40000000)
325 EngSetLastError(ERROR_NOACCESS
);
329 UserEnterExclusive();
333 ProbeForRead(lpaElements
, cElements
* sizeof(INT
), 1);
334 ProbeForRead(lpaRgbValues
, cElements
* sizeof(COLORREF
), 1);
336 IntSetSysColors(cElements
, lpaElements
, lpaRgbValues
);
338 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
340 SetLastNtError(_SEH2_GetExceptionCode());
347 UserSendNotifyMessage(HWND_BROADCAST
, WM_SYSCOLORCHANGE
, 0, 0);
358 NtUserUpdateInputContext(
370 NtUserUpdateInstance(
382 NtUserUserHandleGrantAccess(
383 IN HANDLE hUserHandle
,
394 NtUserWaitForMsgAndEvent(
404 NtUserWin32PoolAllocationStats(
419 NtUserYieldTask(VOID
)
428 NtUserCreateInputContext(
437 NtUserDestroyInputContext(
446 NtUserGetRawInputBuffer(
457 NtUserGetRawInputData(
470 NtUserGetRawInputDeviceInfo(
483 NtUserGetRawInputDeviceList(
484 PRAWINPUTDEVICELIST pRawInputDeviceList
,
494 NtUserGetRegisteredRawInputDevices(
495 PRAWINPUTDEVICE pRawInputDevices
,
505 NtUserHardErrorControl(
516 NtUserNotifyProcessCreate(
518 HANDLE ParentThreadId
,
523 TRACE("NtUserNotifyProcessCreate is UNIMPLEMENTED\n");
529 NtUserProcessConnect(
530 IN HANDLE ProcessHandle
,
531 OUT PUSERCONNECT pUserConnect
,
535 PEPROCESS Process
= NULL
;
536 PPROCESSINFO W32Process
;
538 TRACE("NtUserProcessConnect\n");
540 if ( pUserConnect
== NULL
||
541 Size
!= sizeof(*pUserConnect
) )
543 return STATUS_UNSUCCESSFUL
;
546 /* Get the process object the user handle was referencing */
547 Status
= ObReferenceObjectByHandle(ProcessHandle
,
548 PROCESS_VM_OPERATION
,
553 if (!NT_SUCCESS(Status
)) return Status
;
557 /* Get Win32 process information */
558 W32Process
= PsGetProcessWin32Process(Process
);
562 // FIXME: Check that pUserConnect->ulVersion == USER_VERSION;
564 ProbeForWrite(pUserConnect
, sizeof(*pUserConnect
), sizeof(PVOID
));
565 pUserConnect
->siClient
.psi
= gpsi
;
566 pUserConnect
->siClient
.aheList
= gHandleTable
;
567 pUserConnect
->siClient
.ulSharedDelta
=
568 (ULONG_PTR
)W32Process
->HeapMappings
.KernelMapping
-
569 (ULONG_PTR
)W32Process
->HeapMappings
.UserMapping
;
571 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
573 Status
= _SEH2_GetExceptionCode();
577 if (!NT_SUCCESS(Status
))
578 SetLastNtError(Status
);
582 /* Dereference the process object */
583 ObDereferenceObject(Process
);
590 NtUserQueryInformationThread(IN HANDLE ThreadHandle
,
591 IN USERTHREADINFOCLASS ThreadInformationClass
,
592 OUT PVOID ThreadInformation
,
593 IN ULONG ThreadInformationLength
)
595 NTSTATUS Status
= STATUS_SUCCESS
;
598 /* Allow only CSRSS to perform this operation */
599 if (PsGetCurrentProcess() != gpepCSRSS
)
600 return STATUS_ACCESS_DENIED
;
602 UserEnterExclusive();
605 Status
= ObReferenceObjectByHandle(ThreadHandle
,
606 THREAD_QUERY_INFORMATION
,
611 if (!NT_SUCCESS(Status
)) goto Quit
;
613 switch (ThreadInformationClass
)
618 Status
= STATUS_NOT_IMPLEMENTED
;
623 ObDereferenceObject(Thread
);
632 NtUserQueryInputContext(
642 NtUserRealInternalGetMessage(
656 NtUserRealWaitMessageEx(
666 NtUserRegisterRawInputDevices(
667 IN PCRAWINPUTDEVICE pRawInputDevices
,
668 IN UINT uiNumDevices
,
676 NtUserResolveDesktopForWOW(DWORD Unknown0
)
684 NtUserSetInformationProcess(
695 IntGetDesktopObjectHandle(PDESKTOP DesktopObject
);
699 NtUserSetInformationThread(IN HANDLE ThreadHandle
,
700 IN USERTHREADINFOCLASS ThreadInformationClass
,
701 IN PVOID ThreadInformation
,
702 IN ULONG ThreadInformationLength
)
704 NTSTATUS Status
= STATUS_SUCCESS
;
707 /* Allow only CSRSS to perform this operation */
708 if (PsGetCurrentProcess() != gpepCSRSS
)
709 return STATUS_ACCESS_DENIED
;
711 UserEnterExclusive();
714 Status
= ObReferenceObjectByHandle(ThreadHandle
,
715 THREAD_SET_INFORMATION
,
720 if (!NT_SUCCESS(Status
)) goto Quit
;
722 switch (ThreadInformationClass
)
724 case UserThreadInitiateShutdown
:
726 ULONG CapturedFlags
= 0;
728 TRACE("Shutdown initiated\n");
730 if (ThreadInformationLength
!= sizeof(ULONG
))
732 Status
= STATUS_INFO_LENGTH_MISMATCH
;
736 /* Capture the caller value */
737 Status
= STATUS_SUCCESS
;
740 ProbeForWrite(ThreadInformation
, sizeof(CapturedFlags
), sizeof(PVOID
));
741 CapturedFlags
= *(PULONG
)ThreadInformation
;
743 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
745 Status
= _SEH2_GetExceptionCode();
750 Status
= UserInitiateShutdown(Thread
, &CapturedFlags
);
752 /* Return the modified value to the caller */
755 *(PULONG
)ThreadInformation
= CapturedFlags
;
757 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
759 Status
= _SEH2_GetExceptionCode();
766 case UserThreadEndShutdown
:
768 NTSTATUS ShutdownStatus
;
770 TRACE("Shutdown ended\n");
772 if (ThreadInformationLength
!= sizeof(ShutdownStatus
))
774 Status
= STATUS_INFO_LENGTH_MISMATCH
;
778 /* Capture the caller value */
779 Status
= STATUS_SUCCESS
;
782 ProbeForRead(ThreadInformation
, sizeof(ShutdownStatus
), sizeof(PVOID
));
783 ShutdownStatus
= *(NTSTATUS
*)ThreadInformation
;
785 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
787 Status
= _SEH2_GetExceptionCode();
792 Status
= UserEndShutdown(Thread
, ShutdownStatus
);
796 case UserThreadCsrApiPort
:
798 HANDLE CsrPortHandle
;
801 TRACE("Set CSR API Port for Win32k\n");
802 if (ThreadInformationLength
!= sizeof(CsrPortHandle
))
804 Status
= STATUS_INFO_LENGTH_MISMATCH
;
808 /* Capture the caller value */
809 Status
= STATUS_SUCCESS
;
812 ProbeForRead(ThreadInformation
, sizeof(CsrPortHandle
), sizeof(PVOID
));
813 CsrPortHandle
= *(PHANDLE
)ThreadInformation
;
815 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
817 Status
= _SEH2_GetExceptionCode();
822 Status
= InitCsrApiPort(CsrPortHandle
);
826 case UserThreadUseActiveDesktop
:
830 if (Thread
!= PsGetCurrentThread())
832 Status
= STATUS_NOT_IMPLEMENTED
;
836 hdesk
= IntGetDesktopObjectHandle(gpdeskInputDesktop
);
837 IntSetThreadDesktop(hdesk
, FALSE
);
841 case UserThreadRestoreDesktop
:
843 if (Thread
!= PsGetCurrentThread())
845 Status
= STATUS_NOT_IMPLEMENTED
;
849 IntSetThreadDesktop(NULL
, FALSE
);
855 Status
= STATUS_NOT_IMPLEMENTED
;
860 ObDereferenceObject(Thread
);
869 NtUserSetThreadLayoutHandles(
879 NtUserSoundSentry(VOID
)
887 NtUserTestForInteractiveUser(
907 NtUserRemoteRedrawRectangle(
919 NtUserRemoteRedrawScreen(VOID
)
927 NtUserRemoteStopScreenUpdates(VOID
)
935 NtUserCtxDisplayIOCtl(
948 NtUserLockWindowUpdate(HWND hWnd
)
955 NtUserQuerySendMessage(DWORD Unknown0
)
962 BOOL APIENTRY
NtUserAddClipboardFormatListener(
970 BOOL APIENTRY
NtUserRemoveClipboardFormatListener(
978 BOOL APIENTRY
NtUserGetUpdatedClipboardFormats(
988 // Yes, I know, these do not belong here, just tell me where to put them
991 NtGdiMakeObjectXferable(
993 _In_ DWORD dwProcessId
)
1001 NtDxEngGetRedirectionBitmap(