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(
280 NtUserSetDbgTagCount(
300 NtUserDbgWin32HeapFail(
311 NtUserDbgWin32HeapStat(
324 IN CONST INT
*lpaElements
,
325 IN CONST COLORREF
*lpaRgbValues
,
333 /* We need this check to prevent overflow later */
334 if ((ULONG
)cElements
>= 0x40000000)
336 EngSetLastError(ERROR_NOACCESS
);
340 UserEnterExclusive();
344 ProbeForRead(lpaElements
, cElements
* sizeof(INT
), 1);
345 ProbeForRead(lpaRgbValues
, cElements
* sizeof(COLORREF
), 1);
347 IntSetSysColors(cElements
, lpaElements
, lpaRgbValues
);
349 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
351 SetLastNtError(_SEH2_GetExceptionCode());
358 UserSendNotifyMessage(HWND_BROADCAST
, WM_SYSCOLORCHANGE
, 0, 0);
369 NtUserUpdateInputContext(
381 NtUserUpdateInstance(
393 NtUserUserHandleGrantAccess(
394 IN HANDLE hUserHandle
,
405 NtUserWaitForMsgAndEvent(
415 NtUserWin32PoolAllocationStats(
430 NtUserYieldTask(VOID
)
439 NtUserCreateInputContext(
448 NtUserDestroyInputContext(
457 NtUserGetRawInputBuffer(
468 NtUserGetRawInputData(
481 NtUserGetRawInputDeviceInfo(
494 NtUserGetRawInputDeviceList(
495 PRAWINPUTDEVICELIST pRawInputDeviceList
,
505 NtUserGetRegisteredRawInputDevices(
506 PRAWINPUTDEVICE pRawInputDevices
,
516 NtUserHardErrorControl(
527 NtUserNotifyProcessCreate(
529 HANDLE ParentThreadId
,
534 TRACE("NtUserNotifyProcessCreate is UNIMPLEMENTED\n");
540 NtUserProcessConnect(
541 IN HANDLE ProcessHandle
,
542 OUT PUSERCONNECT pUserConnect
,
546 PEPROCESS Process
= NULL
;
547 PPROCESSINFO W32Process
;
549 TRACE("NtUserProcessConnect\n");
551 if ( pUserConnect
== NULL
||
552 Size
!= sizeof(*pUserConnect
) )
554 return STATUS_UNSUCCESSFUL
;
557 /* Get the process object the user handle was referencing */
558 Status
= ObReferenceObjectByHandle(ProcessHandle
,
559 PROCESS_VM_OPERATION
,
564 if (!NT_SUCCESS(Status
)) return Status
;
568 /* Get Win32 process information */
569 W32Process
= PsGetProcessWin32Process(Process
);
573 // FIXME: Check that pUserConnect->ulVersion == USER_VERSION;
575 ProbeForWrite(pUserConnect
, sizeof(*pUserConnect
), sizeof(PVOID
));
576 pUserConnect
->siClient
.psi
= gpsi
;
577 pUserConnect
->siClient
.aheList
= gHandleTable
;
578 pUserConnect
->siClient
.ulSharedDelta
=
579 (ULONG_PTR
)W32Process
->HeapMappings
.KernelMapping
-
580 (ULONG_PTR
)W32Process
->HeapMappings
.UserMapping
;
582 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
584 Status
= _SEH2_GetExceptionCode();
588 if (!NT_SUCCESS(Status
))
589 SetLastNtError(Status
);
593 /* Dereference the process object */
594 ObDereferenceObject(Process
);
601 NtUserQueryInformationThread(IN HANDLE ThreadHandle
,
602 IN USERTHREADINFOCLASS ThreadInformationClass
,
603 OUT PVOID ThreadInformation
,
604 IN ULONG ThreadInformationLength
)
606 NTSTATUS Status
= STATUS_SUCCESS
;
609 /* Allow only CSRSS to perform this operation */
610 if (PsGetCurrentProcess() != gpepCSRSS
)
611 return STATUS_ACCESS_DENIED
;
613 UserEnterExclusive();
616 Status
= ObReferenceObjectByHandle(ThreadHandle
,
617 THREAD_QUERY_INFORMATION
,
622 if (!NT_SUCCESS(Status
)) goto Quit
;
624 switch (ThreadInformationClass
)
629 Status
= STATUS_NOT_IMPLEMENTED
;
634 ObDereferenceObject(Thread
);
643 NtUserQueryInputContext(
653 NtUserRealInternalGetMessage(
667 NtUserRealWaitMessageEx(
677 NtUserRegisterRawInputDevices(
678 IN PCRAWINPUTDEVICE pRawInputDevices
,
679 IN UINT uiNumDevices
,
687 NtUserResolveDesktopForWOW(DWORD Unknown0
)
695 NtUserSetInformationProcess(
707 NtUserSetInformationThread(IN HANDLE ThreadHandle
,
708 IN USERTHREADINFOCLASS ThreadInformationClass
,
709 IN PVOID ThreadInformation
,
710 IN ULONG ThreadInformationLength
)
712 NTSTATUS Status
= STATUS_SUCCESS
;
715 /* Allow only CSRSS to perform this operation */
716 if (PsGetCurrentProcess() != gpepCSRSS
)
717 return STATUS_ACCESS_DENIED
;
719 UserEnterExclusive();
722 Status
= ObReferenceObjectByHandle(ThreadHandle
,
723 THREAD_SET_INFORMATION
,
728 if (!NT_SUCCESS(Status
)) goto Quit
;
730 switch (ThreadInformationClass
)
732 case UserThreadInitiateShutdown
:
734 ULONG CapturedFlags
= 0;
736 ERR("Shutdown initiated\n");
738 if (ThreadInformationLength
!= sizeof(ULONG
))
740 Status
= STATUS_INFO_LENGTH_MISMATCH
;
744 /* Capture the caller value */
745 Status
= STATUS_SUCCESS
;
748 ProbeForWrite(ThreadInformation
, sizeof(CapturedFlags
), sizeof(PVOID
));
749 CapturedFlags
= *(PULONG
)ThreadInformation
;
751 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
753 Status
= _SEH2_GetExceptionCode();
758 Status
= UserInitiateShutdown(Thread
, &CapturedFlags
);
760 /* Return the modified value to the caller */
763 *(PULONG
)ThreadInformation
= CapturedFlags
;
765 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
767 Status
= _SEH2_GetExceptionCode();
774 case UserThreadEndShutdown
:
776 NTSTATUS ShutdownStatus
;
778 ERR("Shutdown ended\n");
780 if (ThreadInformationLength
!= sizeof(ShutdownStatus
))
782 Status
= STATUS_INFO_LENGTH_MISMATCH
;
786 /* Capture the caller value */
787 Status
= STATUS_SUCCESS
;
790 ProbeForRead(ThreadInformation
, sizeof(ShutdownStatus
), sizeof(PVOID
));
791 ShutdownStatus
= *(NTSTATUS
*)ThreadInformation
;
793 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
795 Status
= _SEH2_GetExceptionCode();
800 Status
= UserEndShutdown(Thread
, ShutdownStatus
);
804 case UserThreadCsrApiPort
:
806 HANDLE CsrPortHandle
;
808 ERR("Set CSR API Port for Win32k\n");
810 if (ThreadInformationLength
!= sizeof(CsrPortHandle
))
812 Status
= STATUS_INFO_LENGTH_MISMATCH
;
816 /* Capture the caller value */
817 Status
= STATUS_SUCCESS
;
820 ProbeForRead(ThreadInformation
, sizeof(CsrPortHandle
), sizeof(PVOID
));
821 CsrPortHandle
= *(PHANDLE
)ThreadInformation
;
823 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
825 Status
= _SEH2_GetExceptionCode();
830 Status
= InitCsrApiPort(CsrPortHandle
);
837 Status
= STATUS_NOT_IMPLEMENTED
;
842 ObDereferenceObject(Thread
);
851 NtUserSetThreadLayoutHandles(
861 NtUserSoundSentry(VOID
)
869 NtUserTestForInteractiveUser(
876 /* http://www.cyber-ta.org/releases/malware-analysis/public/SOURCES/b47155634ccb2c30630da7e3666d3d07/b47155634ccb2c30630da7e3666d3d07.trace.html#NtUserGetIconSize */
918 NtUserRemoteRedrawRectangle(
930 NtUserRemoteRedrawScreen(VOID
)
938 NtUserRemoteStopScreenUpdates(VOID
)
946 NtUserCtxDisplayIOCtl(
959 NtUserLockWindowUpdate(HWND hWnd
)
967 NtUserQuerySendMessage(DWORD Unknown0
)
974 BOOL APIENTRY
NtUserAddClipboardFormatListener(
982 BOOL APIENTRY
NtUserRemoveClipboardFormatListener(
990 BOOL APIENTRY
NtUserGetUpdatedClipboardFormats(
1000 // Yes, I know, these do not belong here, just tell me where to put them
1003 NtGdiMakeObjectXferable(
1004 _In_ HANDLE hHandle
,
1005 _In_ DWORD dwProcessId
)
1013 NtDxEngGetRedirectionBitmap(