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
,
59 NtUserBuildHimcList(DWORD dwThreadId
, DWORD dwCount
, HIMC
*phList
, LPDWORD pdwCount
)
62 return STATUS_NOT_IMPLEMENTED
;
82 NtUserDrawAnimatedRects(
120 NtUserInitializeClientPfnArrays(
121 PPFNCLIENT pfnClientA
,
122 PPFNCLIENT pfnClientW
,
123 PPFNCLIENTWORKER pfnClientWorker
,
126 NTSTATUS Status
= STATUS_SUCCESS
;
127 TRACE("Enter NtUserInitializeClientPfnArrays User32 0x%p\n", hmodUser
);
129 if (ClientPfnInit
) return Status
;
131 UserEnterExclusive();
135 ProbeForRead( pfnClientA
, sizeof(PFNCLIENT
), 1);
136 ProbeForRead( pfnClientW
, sizeof(PFNCLIENT
), 1);
137 ProbeForRead( pfnClientWorker
, sizeof(PFNCLIENTWORKER
), 1);
138 RtlCopyMemory(&gpsi
->apfnClientA
, pfnClientA
, sizeof(PFNCLIENT
));
139 RtlCopyMemory(&gpsi
->apfnClientW
, pfnClientW
, sizeof(PFNCLIENT
));
140 RtlCopyMemory(&gpsi
->apfnClientWorker
, pfnClientWorker
, sizeof(PFNCLIENTWORKER
));
142 //// FIXME: HAX! Temporary until server side is finished.
143 //// Copy the client side procs for now.
144 RtlCopyMemory(&gpsi
->aStoCidPfn
, pfnClientW
, sizeof(gpsi
->aStoCidPfn
));
146 hModClient
= hmodUser
;
147 ClientPfnInit
= TRUE
;
149 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
151 Status
=_SEH2_GetExceptionCode();
155 if (!NT_SUCCESS(Status
))
157 ERR("Failed reading Client Pfns from user space.\n");
158 SetLastNtError(Status
);
188 NtUserMNDragLeave(VOID
)
208 NtUserModifyUserStartupInfoFlags(
219 NtUserQueryUserCounters(
233 NtUserRegisterTasklist(
243 NtUserSetConsoleReserveKeys(
265 NtUserSetDbgTagCount(
285 NtUserDbgWin32HeapFail(
296 NtUserDbgWin32HeapStat(
309 IN CONST INT
*lpaElements
,
310 IN CONST COLORREF
*lpaRgbValues
,
318 /* We need this check to prevent overflow later */
319 if ((ULONG
)cElements
>= 0x40000000)
321 EngSetLastError(ERROR_NOACCESS
);
325 UserEnterExclusive();
329 ProbeForRead(lpaElements
, cElements
* sizeof(INT
), 1);
330 ProbeForRead(lpaRgbValues
, cElements
* sizeof(COLORREF
), 1);
332 IntSetSysColors(cElements
, lpaElements
, lpaRgbValues
);
334 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
336 SetLastNtError(_SEH2_GetExceptionCode());
343 UserSendNotifyMessage(HWND_BROADCAST
, WM_SYSCOLORCHANGE
, 0, 0);
354 NtUserUpdateInputContext(
366 NtUserUpdateInstance(
378 NtUserUserHandleGrantAccess(
379 IN HANDLE hUserHandle
,
390 NtUserWaitForMsgAndEvent(
400 NtUserWin32PoolAllocationStats(
415 NtUserYieldTask(VOID
)
424 NtUserCreateInputContext(PCLIENTIMC pClientImc
)
432 NtUserDestroyInputContext(HIMC hIMC
)
440 NtUserGetRawInputBuffer(
451 NtUserGetRawInputData(
464 NtUserGetRawInputDeviceInfo(
477 NtUserGetRawInputDeviceList(
478 PRAWINPUTDEVICELIST pRawInputDeviceList
,
488 NtUserGetRegisteredRawInputDevices(
489 PRAWINPUTDEVICE pRawInputDevices
,
499 NtUserHardErrorControl(
510 NtUserNotifyProcessCreate(
512 HANDLE ParentThreadId
,
517 TRACE("NtUserNotifyProcessCreate is UNIMPLEMENTED\n");
523 NtUserProcessConnect(
524 IN HANDLE ProcessHandle
,
525 OUT PUSERCONNECT pUserConnect
,
529 PEPROCESS Process
= NULL
;
530 PPROCESSINFO W32Process
;
532 TRACE("NtUserProcessConnect\n");
534 if (pUserConnect
== NULL
||
535 Size
!= sizeof(*pUserConnect
))
537 return STATUS_UNSUCCESSFUL
;
540 /* Get the process object the user handle was referencing */
541 Status
= ObReferenceObjectByHandle(ProcessHandle
,
542 PROCESS_VM_OPERATION
,
547 if (!NT_SUCCESS(Status
)) return Status
;
551 /* Get Win32 process information */
552 W32Process
= PsGetProcessWin32Process(Process
);
558 // FIXME: Check that pUserConnect->ulVersion == USER_VERSION;
559 // FIXME: Check the value of pUserConnect->dwDispatchCount.
561 ProbeForWrite(pUserConnect
, sizeof(*pUserConnect
), sizeof(PVOID
));
563 // FIXME: Instead of assuming that the mapping of the heap desktop
564 // also holds there, we **MUST** create and map instead the shared
565 // section! Its client base must be stored in W32Process->pClientBase.
566 // What is currently done (ReactOS-specific only), is that within the
567 // IntUserHeapCommitRoutine()/MapGlobalUserHeap() routines we assume
568 // it's going to be also called early, so that we manually add a very
569 // first memory mapping that corresponds to the "global user heap",
570 // and that we use instead of a actual win32 "shared USER section"
571 // (see slide 29 of https://paper.bobylive.com/Meeting_Papers/BlackHat/USA-2011/BH_US_11_Mandt_win32k_Slides.pdf )
573 pUserConnect
->siClient
.ulSharedDelta
=
574 (ULONG_PTR
)W32Process
->HeapMappings
.KernelMapping
-
575 (ULONG_PTR
)W32Process
->HeapMappings
.UserMapping
;
577 #define SERVER_TO_CLIENT(ptr) \
578 ((PVOID)((ULONG_PTR)ptr - pUserConnect->siClient.ulSharedDelta))
581 ASSERT(gHandleTable
);
583 pUserConnect
->siClient
.psi
= SERVER_TO_CLIENT(gpsi
);
584 pUserConnect
->siClient
.aheList
= SERVER_TO_CLIENT(gHandleTable
);
585 pUserConnect
->siClient
.pDispInfo
= NULL
;
587 // NOTE: kernel server should also have a SHAREDINFO gSharedInfo;
588 // FIXME: These USER window-proc data should be used somehow!
590 pUserConnect
->siClient
.DefWindowMsgs
.maxMsgs
= 0;
591 pUserConnect
->siClient
.DefWindowMsgs
.abMsgs
= NULL
;
592 pUserConnect
->siClient
.DefWindowSpecMsgs
.maxMsgs
= 0;
593 pUserConnect
->siClient
.DefWindowSpecMsgs
.abMsgs
= NULL
;
595 for (i
= 0; i
< ARRAYSIZE(pUserConnect
->siClient
.awmControl
); ++i
)
597 pUserConnect
->siClient
.awmControl
[i
].maxMsgs
= 0;
598 pUserConnect
->siClient
.awmControl
[i
].abMsgs
= NULL
;
600 #undef SERVER_TO_CLIENT
602 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
604 Status
= _SEH2_GetExceptionCode();
608 if (!NT_SUCCESS(Status
))
609 SetLastNtError(Status
);
613 /* Dereference the process object */
614 ObDereferenceObject(Process
);
621 NtUserQueryInformationThread(IN HANDLE ThreadHandle
,
622 IN USERTHREADINFOCLASS ThreadInformationClass
,
623 OUT PVOID ThreadInformation
,
624 IN ULONG ThreadInformationLength
)
626 NTSTATUS Status
= STATUS_SUCCESS
;
629 /* Allow only CSRSS to perform this operation */
630 if (PsGetCurrentProcess() != gpepCSRSS
)
631 return STATUS_ACCESS_DENIED
;
633 UserEnterExclusive();
636 Status
= ObReferenceObjectByHandle(ThreadHandle
,
637 THREAD_QUERY_INFORMATION
,
642 if (!NT_SUCCESS(Status
)) goto Quit
;
644 switch (ThreadInformationClass
)
649 Status
= STATUS_NOT_IMPLEMENTED
;
654 ObDereferenceObject(Thread
);
663 NtUserQueryInputContext(
667 TRACE("NtUserQueryInputContext(%p, 0x%lX)\n", hIMC
, dwUnknown2
);
673 NtUserRealInternalGetMessage(
687 NtUserRealWaitMessageEx(
697 NtUserRegisterRawInputDevices(
698 IN PCRAWINPUTDEVICE pRawInputDevices
,
699 IN UINT uiNumDevices
,
707 NtUserResolveDesktopForWOW(DWORD Unknown0
)
715 NtUserSetInformationProcess(
726 IntGetDesktopObjectHandle(PDESKTOP DesktopObject
);
730 NtUserSetInformationThread(IN HANDLE ThreadHandle
,
731 IN USERTHREADINFOCLASS ThreadInformationClass
,
732 IN PVOID ThreadInformation
,
733 IN ULONG ThreadInformationLength
)
735 NTSTATUS Status
= STATUS_SUCCESS
;
738 /* Allow only CSRSS to perform this operation */
739 if (PsGetCurrentProcess() != gpepCSRSS
)
740 return STATUS_ACCESS_DENIED
;
742 UserEnterExclusive();
745 Status
= ObReferenceObjectByHandle(ThreadHandle
,
746 THREAD_SET_INFORMATION
,
751 if (!NT_SUCCESS(Status
)) goto Quit
;
753 switch (ThreadInformationClass
)
755 case UserThreadInitiateShutdown
:
757 ULONG CapturedFlags
= 0;
759 TRACE("Shutdown initiated\n");
761 if (ThreadInformationLength
!= sizeof(ULONG
))
763 Status
= STATUS_INFO_LENGTH_MISMATCH
;
767 /* Capture the caller value */
768 Status
= STATUS_SUCCESS
;
771 ProbeForWrite(ThreadInformation
, sizeof(CapturedFlags
), sizeof(PVOID
));
772 CapturedFlags
= *(PULONG
)ThreadInformation
;
774 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
776 Status
= _SEH2_GetExceptionCode();
781 Status
= UserInitiateShutdown(Thread
, &CapturedFlags
);
783 /* Return the modified value to the caller */
786 *(PULONG
)ThreadInformation
= CapturedFlags
;
788 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
790 Status
= _SEH2_GetExceptionCode();
797 case UserThreadEndShutdown
:
799 NTSTATUS ShutdownStatus
;
801 TRACE("Shutdown ended\n");
803 if (ThreadInformationLength
!= sizeof(ShutdownStatus
))
805 Status
= STATUS_INFO_LENGTH_MISMATCH
;
809 /* Capture the caller value */
810 Status
= STATUS_SUCCESS
;
813 ProbeForRead(ThreadInformation
, sizeof(ShutdownStatus
), sizeof(PVOID
));
814 ShutdownStatus
= *(NTSTATUS
*)ThreadInformation
;
816 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
818 Status
= _SEH2_GetExceptionCode();
823 Status
= UserEndShutdown(Thread
, ShutdownStatus
);
827 case UserThreadCsrApiPort
:
829 HANDLE CsrPortHandle
;
832 TRACE("Set CSR API Port for Win32k\n");
833 if (ThreadInformationLength
!= sizeof(CsrPortHandle
))
835 Status
= STATUS_INFO_LENGTH_MISMATCH
;
839 /* Capture the caller value */
840 Status
= STATUS_SUCCESS
;
843 ProbeForRead(ThreadInformation
, sizeof(CsrPortHandle
), sizeof(PVOID
));
844 CsrPortHandle
= *(PHANDLE
)ThreadInformation
;
846 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
848 Status
= _SEH2_GetExceptionCode();
853 Status
= InitCsrApiPort(CsrPortHandle
);
857 case UserThreadUseActiveDesktop
:
861 if (Thread
!= PsGetCurrentThread())
863 Status
= STATUS_NOT_IMPLEMENTED
;
867 hdesk
= IntGetDesktopObjectHandle(gpdeskInputDesktop
);
868 IntSetThreadDesktop(hdesk
, FALSE
);
872 case UserThreadRestoreDesktop
:
874 if (Thread
!= PsGetCurrentThread())
876 Status
= STATUS_NOT_IMPLEMENTED
;
880 IntSetThreadDesktop(NULL
, FALSE
);
886 Status
= STATUS_NOT_IMPLEMENTED
;
891 ObDereferenceObject(Thread
);
900 NtUserSetThreadLayoutHandles(
910 NtUserSoundSentry(VOID
)
918 NtUserTestForInteractiveUser(
938 NtUserRemoteRedrawRectangle(
950 NtUserRemoteRedrawScreen(VOID
)
958 NtUserRemoteStopScreenUpdates(VOID
)
966 NtUserCtxDisplayIOCtl(
979 NtUserLockWindowUpdate(HWND hWnd
)
986 NtUserQuerySendMessage(DWORD Unknown0
)
993 BOOL APIENTRY
NtUserAddClipboardFormatListener(
1001 BOOL APIENTRY
NtUserRemoveClipboardFormatListener(
1009 BOOL APIENTRY
NtUserGetUpdatedClipboardFormats(
1019 // Yes, I know, these do not belong here, just tell me where to put them
1022 NtGdiMakeObjectXferable(
1023 _In_ HANDLE hHandle
,
1024 _In_ DWORD dwProcessId
)
1032 NtDxEngGetRedirectionBitmap(