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(
293 IN CONST INT
*lpaElements
,
294 IN CONST COLORREF
*lpaRgbValues
,
302 /* We need this check to prevent overflow later */
303 if ((ULONG
)cElements
>= 0x40000000)
305 EngSetLastError(ERROR_NOACCESS
);
309 UserEnterExclusive();
313 ProbeForRead(lpaElements
, cElements
* sizeof(INT
), 1);
314 ProbeForRead(lpaRgbValues
, cElements
* sizeof(COLORREF
), 1);
316 IntSetSysColors(cElements
, lpaElements
, lpaRgbValues
);
318 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
320 SetLastNtError(_SEH2_GetExceptionCode());
327 UserSendNotifyMessage(HWND_BROADCAST
, WM_SYSCOLORCHANGE
, 0, 0);
338 NtUserUpdateInputContext(
350 NtUserUpdateInstance(
362 NtUserUserHandleGrantAccess(
363 IN HANDLE hUserHandle
,
374 NtUserWaitForMsgAndEvent(
384 NtUserWin32PoolAllocationStats(
399 NtUserYieldTask(VOID
)
408 NtUserCreateInputContext(
417 NtUserDestroyInputContext(
426 NtUserGetRawInputBuffer(
437 NtUserGetRawInputData(
450 NtUserGetRawInputDeviceInfo(
463 NtUserGetRawInputDeviceList(
464 PRAWINPUTDEVICELIST pRawInputDeviceList
,
474 NtUserGetRegisteredRawInputDevices(
475 PRAWINPUTDEVICE pRawInputDevices
,
485 NtUserHardErrorControl(
496 NtUserNotifyProcessCreate(
498 HANDLE ParentThreadId
,
503 TRACE("NtUserNotifyProcessCreate is UNIMPLEMENTED\n");
509 NtUserProcessConnect(
510 IN HANDLE ProcessHandle
,
511 OUT PUSERCONNECT pUserConnect
,
515 PEPROCESS Process
= NULL
;
516 PPROCESSINFO W32Process
;
518 TRACE("NtUserProcessConnect\n");
520 if ( pUserConnect
== NULL
||
521 Size
!= sizeof(*pUserConnect
) )
523 return STATUS_UNSUCCESSFUL
;
526 /* Get the process object the user handle was referencing */
527 Status
= ObReferenceObjectByHandle(ProcessHandle
,
528 PROCESS_VM_OPERATION
,
533 if (!NT_SUCCESS(Status
)) return Status
;
537 /* Get Win32 process information */
538 W32Process
= PsGetProcessWin32Process(Process
);
542 // FIXME: Check that pUserConnect->ulVersion == USER_VERSION;
544 ProbeForWrite(pUserConnect
, sizeof(*pUserConnect
), sizeof(PVOID
));
545 pUserConnect
->siClient
.psi
= gpsi
;
546 pUserConnect
->siClient
.aheList
= gHandleTable
;
547 pUserConnect
->siClient
.ulSharedDelta
=
548 (ULONG_PTR
)W32Process
->HeapMappings
.KernelMapping
-
549 (ULONG_PTR
)W32Process
->HeapMappings
.UserMapping
;
551 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
553 Status
= _SEH2_GetExceptionCode();
557 if (!NT_SUCCESS(Status
))
558 SetLastNtError(Status
);
562 /* Dereference the process object */
563 ObDereferenceObject(Process
);
570 NtUserQueryInformationThread(IN HANDLE ThreadHandle
,
571 IN USERTHREADINFOCLASS ThreadInformationClass
,
572 OUT PVOID ThreadInformation
,
573 IN ULONG ThreadInformationLength
)
575 NTSTATUS Status
= STATUS_SUCCESS
;
578 /* Allow only CSRSS to perform this operation */
579 if (PsGetCurrentProcess() != gpepCSRSS
)
580 return STATUS_ACCESS_DENIED
;
582 UserEnterExclusive();
585 Status
= ObReferenceObjectByHandle(ThreadHandle
,
586 THREAD_QUERY_INFORMATION
,
591 if (!NT_SUCCESS(Status
)) goto Quit
;
593 switch (ThreadInformationClass
)
598 Status
= STATUS_NOT_IMPLEMENTED
;
603 ObDereferenceObject(Thread
);
612 NtUserQueryInputContext(
622 NtUserRealInternalGetMessage(
636 NtUserRealWaitMessageEx(
646 NtUserRegisterRawInputDevices(
647 IN PCRAWINPUTDEVICE pRawInputDevices
,
648 IN UINT uiNumDevices
,
656 NtUserResolveDesktopForWOW(DWORD Unknown0
)
664 NtUserSetInformationProcess(
676 NtUserSetInformationThread(IN HANDLE ThreadHandle
,
677 IN USERTHREADINFOCLASS ThreadInformationClass
,
678 IN PVOID ThreadInformation
,
679 IN ULONG ThreadInformationLength
)
681 NTSTATUS Status
= STATUS_SUCCESS
;
684 /* Allow only CSRSS to perform this operation */
685 if (PsGetCurrentProcess() != gpepCSRSS
)
686 return STATUS_ACCESS_DENIED
;
688 UserEnterExclusive();
691 Status
= ObReferenceObjectByHandle(ThreadHandle
,
692 THREAD_SET_INFORMATION
,
697 if (!NT_SUCCESS(Status
)) goto Quit
;
699 switch (ThreadInformationClass
)
701 case UserThreadInitiateShutdown
:
703 ULONG CapturedFlags
= 0;
705 ERR("Shutdown initiated\n");
707 if (ThreadInformationLength
!= sizeof(ULONG
))
709 Status
= STATUS_INFO_LENGTH_MISMATCH
;
713 /* Capture the caller value */
714 Status
= STATUS_SUCCESS
;
717 ProbeForWrite(ThreadInformation
, sizeof(CapturedFlags
), sizeof(PVOID
));
718 CapturedFlags
= *(PULONG
)ThreadInformation
;
720 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
722 Status
= _SEH2_GetExceptionCode();
727 Status
= UserInitiateShutdown(Thread
, &CapturedFlags
);
729 /* Return the modified value to the caller */
732 *(PULONG
)ThreadInformation
= CapturedFlags
;
734 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
736 Status
= _SEH2_GetExceptionCode();
743 case UserThreadEndShutdown
:
745 NTSTATUS ShutdownStatus
;
747 ERR("Shutdown ended\n");
749 if (ThreadInformationLength
!= sizeof(ShutdownStatus
))
751 Status
= STATUS_INFO_LENGTH_MISMATCH
;
755 /* Capture the caller value */
756 Status
= STATUS_SUCCESS
;
759 ProbeForRead(ThreadInformation
, sizeof(ShutdownStatus
), sizeof(PVOID
));
760 ShutdownStatus
= *(NTSTATUS
*)ThreadInformation
;
762 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
764 Status
= _SEH2_GetExceptionCode();
769 Status
= UserEndShutdown(Thread
, ShutdownStatus
);
773 case UserThreadCsrApiPort
:
775 HANDLE CsrPortHandle
;
777 ERR("Set CSR API Port for Win32k\n");
779 if (ThreadInformationLength
!= sizeof(CsrPortHandle
))
781 Status
= STATUS_INFO_LENGTH_MISMATCH
;
785 /* Capture the caller value */
786 Status
= STATUS_SUCCESS
;
789 ProbeForRead(ThreadInformation
, sizeof(CsrPortHandle
), sizeof(PVOID
));
790 CsrPortHandle
= *(PHANDLE
)ThreadInformation
;
792 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
794 Status
= _SEH2_GetExceptionCode();
799 Status
= InitCsrApiPort(CsrPortHandle
);
806 Status
= STATUS_NOT_IMPLEMENTED
;
811 ObDereferenceObject(Thread
);
820 NtUserSetThreadLayoutHandles(
830 NtUserSoundSentry(VOID
)
838 NtUserTestForInteractiveUser(
845 /* http://www.cyber-ta.org/releases/malware-analysis/public/SOURCES/b47155634ccb2c30630da7e3666d3d07/b47155634ccb2c30630da7e3666d3d07.trace.html#NtUserGetIconSize */
887 NtUserRemoteRedrawRectangle(
899 NtUserRemoteRedrawScreen(VOID
)
907 NtUserRemoteStopScreenUpdates(VOID
)
915 NtUserCtxDisplayIOCtl(
925 * FillWindow: Called from User; Dialog, Edit and ListBox procs during a WM_ERASEBKGND.
931 NtUserFillWindow(HWND hWndPaint
,
945 NtUserLockWindowUpdate(HWND hWnd
)
954 NtUserGetLayeredWindowAttributes(
968 NtUserSetLayeredWindowAttributes(HWND hwnd
,
982 NtUserUpdateLayeredWindow(
990 BLENDFUNCTION
*pblend
,
1000 NtUserQuerySendMessage(DWORD Unknown0
)
1007 BOOL APIENTRY
NtUserAddClipboardFormatListener(
1015 BOOL APIENTRY
NtUserRemoveClipboardFormatListener(
1023 BOOL APIENTRY
NtUserGetUpdatedClipboardFormats(