2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS kernel
4 * PURPOSE: NtUserCallXxx call stubs
5 * FILE: subsystem/win32/win32k/ntuser/simplecall.c
6 * PROGRAMER: Ge van Geldorp (ge@gse.nl)
10 DBG_DEFAULT_CHANNEL(UserMisc
);
12 /* registered Logon process */
13 PPROCESSINFO LogonProcess
= NULL
;
16 co_IntRegisterLogonProcess(HANDLE ProcessId
, BOOL Register
)
20 USER_API_MESSAGE Request
;
22 Status
= PsLookupProcessByProcessId(ProcessId
,
24 if (!NT_SUCCESS(Status
))
26 EngSetLastError(RtlNtStatusToDosError(Status
));
32 /* Register the logon process */
33 if (LogonProcess
!= NULL
)
35 ObDereferenceObject(Process
);
39 LogonProcess
= (PPROCESSINFO
)Process
->Win32Process
;
43 /* Deregister the logon process */
44 if (LogonProcess
!= (PPROCESSINFO
)Process
->Win32Process
)
46 ObDereferenceObject(Process
);
53 ObDereferenceObject(Process
);
55 Request
.ApiNumber
= CSR_CREATE_API_NUMBER(USERSRV_SERVERDLL_INDEX
, UserpRegisterLogonProcess
);
56 Request
.Data
.RegisterLogonProcessRequest
.ProcessId
= ProcessId
;
57 Request
.Data
.RegisterLogonProcessRequest
.Register
= Register
;
59 Status
= co_CsrNotify((PCSR_API_MESSAGE
)&Request
,
60 sizeof(CSRSS_REGISTER_LOGON_PROCESS
));
61 if (!NT_SUCCESS(Status
))
63 ERR("Failed to register logon process with CSRSS\n");
75 NtUserCallNoParam(DWORD Routine
)
78 DECLARE_RETURN(DWORD_PTR
);
80 TRACE("Enter NtUserCallNoParam\n");
85 case NOPARAM_ROUTINE_CREATEMENU
:
86 Result
= (DWORD_PTR
)UserCreateMenu(FALSE
);
89 case NOPARAM_ROUTINE_CREATEMENUPOPUP
:
90 Result
= (DWORD_PTR
)UserCreateMenu(TRUE
);
93 case NOPARAM_ROUTINE_DESTROY_CARET
:
94 Result
= (DWORD_PTR
)co_IntDestroyCaret(PsGetCurrentThread()->Tcb
.Win32Thread
);
97 case NOPARAM_ROUTINE_INIT_MESSAGE_PUMP
:
98 Result
= (DWORD_PTR
)IntInitMessagePumpHook();
101 case NOPARAM_ROUTINE_UNINIT_MESSAGE_PUMP
:
102 Result
= (DWORD_PTR
)IntUninitMessagePumpHook();
105 case NOPARAM_ROUTINE_GETMESSAGEEXTRAINFO
:
106 Result
= (DWORD_PTR
)MsqGetMessageExtraInfo();
109 case NOPARAM_ROUTINE_MSQCLEARWAKEMASK
:
110 RETURN( (DWORD_PTR
)IntMsqClearWakeMask());
112 case NOPARAM_ROUTINE_GETMSESSAGEPOS
:
114 PTHREADINFO pti
= PsGetCurrentThreadWin32Thread();
115 RETURN( (DWORD_PTR
)MAKELONG(pti
->ptLast
.x
, pti
->ptLast
.y
));
118 case NOPARAM_ROUTINE_RELEASECAPTURE
:
119 RETURN( (DWORD_PTR
)IntReleaseCapture());
121 case NOPARAM_ROUTINE_LOADUSERAPIHOOK
:
122 RETURN(UserLoadApiHook());
124 case NOPARAM_ROUTINE_ZAPACTIVEANDFOUS
:
126 PTHREADINFO pti
= PsGetCurrentThreadWin32Thread();
127 TRACE("Zapping the Active and Focus window out of the Queue!\n");
128 pti
->MessageQueue
->spwndFocus
= NULL
;
129 pti
->MessageQueue
->spwndActive
= NULL
;
134 ERR("Calling invalid routine number 0x%x in NtUserCallNoParam\n", Routine
);
135 EngSetLastError(ERROR_INVALID_PARAMETER
);
141 TRACE("Leave NtUserCallNoParam, ret=%p\n",(PVOID
)_ret_
);
156 DECLARE_RETURN(DWORD_PTR
);
158 TRACE("Enter NtUserCallOneParam\n");
160 UserEnterExclusive();
164 case ONEPARAM_ROUTINE_POSTQUITMESSAGE
:
167 pti
= PsGetCurrentThreadWin32Thread();
168 MsqPostQuitMessage(pti
->MessageQueue
, Param
);
172 case ONEPARAM_ROUTINE_BEGINDEFERWNDPOS
:
176 INT count
= (INT
)Param
;
180 EngSetLastError(ERROR_INVALID_PARAMETER
);
183 /* Windows allows zero count, in which case it allocates context for 8 moves */
184 if (count
== 0) count
= 8;
186 psmwp
= (PSMWP
) UserCreateObject( gHandleTable
,
192 if (!psmwp
) RETURN(0);
193 psmwp
->acvr
= ExAllocatePoolWithTag(PagedPool
, count
* sizeof(CVR
), USERTAG_SWP
);
196 UserDeleteObject(hDwp
, otSMWP
);
199 RtlZeroMemory(psmwp
->acvr
, count
* sizeof(CVR
));
200 psmwp
->bHandle
= TRUE
;
201 psmwp
->ccvr
= 0; // actualCount
202 psmwp
->ccvrAlloc
= count
; // suggestedCount
203 RETURN((DWORD_PTR
)hDwp
);
206 case ONEPARAM_ROUTINE_SHOWCURSOR
:
207 RETURN( (DWORD_PTR
)UserShowCursor((BOOL
)Param
) );
209 case ONEPARAM_ROUTINE_GETDESKTOPMAPPING
:
212 ti
= GetW32ThreadInfo();
215 /* Try convert the pointer to a user mode pointer if the desktop is
216 mapped into the process */
217 RETURN((DWORD_PTR
)DesktopHeapAddressToUser((PVOID
)Param
));
225 case ONEPARAM_ROUTINE_WINDOWFROMDC
:
226 RETURN( (DWORD_PTR
)IntWindowFromDC((HDC
)Param
));
228 case ONEPARAM_ROUTINE_SWAPMOUSEBUTTON
:
232 Result
= gspv
.bMouseBtnSwap
;
233 gspv
.bMouseBtnSwap
= Param
? TRUE
: FALSE
;
234 gpsi
->aiSysMet
[SM_SWAPBUTTON
] = gspv
.bMouseBtnSwap
;
238 case ONEPARAM_ROUTINE_SWITCHCARETSHOWING
:
239 RETURN( (DWORD_PTR
)IntSwitchCaretShowing((PVOID
)Param
));
241 case ONEPARAM_ROUTINE_SETCARETBLINKTIME
:
242 RETURN( (DWORD_PTR
)IntSetCaretBlinkTime((UINT
)Param
));
244 case ONEPARAM_ROUTINE_SETMESSAGEEXTRAINFO
:
245 RETURN( (DWORD_PTR
)MsqSetMessageExtraInfo((LPARAM
)Param
));
247 case ONEPARAM_ROUTINE_CREATEEMPTYCUROBJECT
:
249 PCURICON_OBJECT CurIcon
;
252 if (!(CurIcon
= IntCreateCurIconHandle()))
254 EngSetLastError(ERROR_NOT_ENOUGH_MEMORY
);
258 Result
= (DWORD_PTR
)CurIcon
->Self
;
259 UserDereferenceObject(CurIcon
);
263 case ONEPARAM_ROUTINE_GETCURSORPOSITION
:
269 ProbeForWrite((POINT
*)Param
,sizeof(POINT
),1);
270 RtlCopyMemory((POINT
*)Param
,&gpsi
->ptCursor
,sizeof(POINT
));
272 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
274 SetLastNtError(_SEH2_GetExceptionCode());
282 case ONEPARAM_ROUTINE_ENABLEPROCWNDGHSTING
:
285 PPROCESSINFO Process
= PsGetCurrentProcessWin32Process();
289 Enable
= (BOOL
)(Param
!= 0);
293 Process
->W32PF_flags
&= ~W32PF_NOWINDOWGHOSTING
;
297 Process
->W32PF_flags
|= W32PF_NOWINDOWGHOSTING
;
306 case ONEPARAM_ROUTINE_GETINPUTEVENT
:
307 RETURN( (DWORD_PTR
)IntMsqSetWakeMask(Param
));
309 case ONEPARAM_ROUTINE_GETKEYBOARDTYPE
:
310 RETURN( UserGetKeyboardType(Param
));
312 case ONEPARAM_ROUTINE_GETKEYBOARDLAYOUT
:
313 RETURN( (DWORD_PTR
)UserGetKeyboardLayout(Param
));
315 case ONEPARAM_ROUTINE_RELEASEDC
:
316 RETURN (UserReleaseDC(NULL
, (HDC
) Param
, FALSE
));
318 case ONEPARAM_ROUTINE_REALIZEPALETTE
:
319 RETURN (UserRealizePalette((HDC
) Param
));
321 case ONEPARAM_ROUTINE_GETQUEUESTATUS
:
323 RETURN (IntGetQueueStatus((DWORD
)Param
));
325 case ONEPARAM_ROUTINE_ENUMCLIPBOARDFORMATS
:
326 /* FIXME: Should use UserEnterShared */
327 RETURN(UserEnumClipboardFormats(Param
));
329 case ONEPARAM_ROUTINE_CSRSS_GUICHECK
:
330 IntUserManualGuiCheck(Param
);
333 case ONEPARAM_ROUTINE_GETCURSORPOS
:
337 PTHREADINFO pti
= PsGetCurrentThreadWin32Thread();
338 if (pti
->hdesk
!= InputDesktopHandle
) RETURN(FALSE
);
341 pptl
= (PPOINTL
)Param
;
342 *pptl
= gpsi
->ptCursor
;
344 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
351 case ONEPARAM_ROUTINE_SETPROCDEFLAYOUT
:
354 if (Param
& LAYOUT_ORIENTATIONMASK
)
356 ppi
= PsGetCurrentProcessWin32Process();
357 ppi
->dwLayout
= Param
;
360 EngSetLastError(ERROR_INVALID_PARAMETER
);
363 case ONEPARAM_ROUTINE_GETPROCDEFLAYOUT
:
368 if ( PsGetCurrentProcess() == CsrProcess
)
370 EngSetLastError(ERROR_INVALID_ACCESS
);
373 ppi
= PsGetCurrentProcessWin32Process();
376 pdwLayout
= (PDWORD
)Param
;
377 *pdwLayout
= ppi
->dwLayout
;
379 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
381 SetLastNtError(_SEH2_GetExceptionCode());
387 case ONEPARAM_ROUTINE_REPLYMESSAGE
:
388 RETURN (co_MsqReplyMessage((LRESULT
) Param
));
389 case ONEPARAM_ROUTINE_MESSAGEBEEP
:
390 RETURN ( UserPostMessage(hwndSAS
, WM_LOGONNOTIFY
, LN_MESSAGE_BEEP
, Param
) );
391 /* TODO: Implement sound sentry */
392 case ONEPARAM_ROUTINE_CREATESYSTEMTHREADS
:
393 RETURN(CreateSystemThreads(Param
));
394 case ONEPARAM_ROUTINE_LOCKFOREGNDWINDOW
:
395 RETURN( (DWORD_PTR
)IntLockSetForegroundWindow(Param
));
396 case ONEPARAM_ROUTINE_ALLOWSETFOREGND
:
397 RETURN( (DWORD_PTR
)IntAllowSetForegroundWindow(Param
));
399 ERR("Calling invalid routine number 0x%x in NtUserCallOneParam(), Param=0x%x\n",
401 EngSetLastError(ERROR_INVALID_PARAMETER
);
405 TRACE("Leave NtUserCallOneParam, ret=%p\n", (PVOID
)_ret_
);
422 DECLARE_RETURN(DWORD_PTR
);
424 TRACE("Enter NtUserCallTwoParam\n");
425 UserEnterExclusive();
429 case TWOPARAM_ROUTINE_SETMENUBARHEIGHT
:
432 PMENU_OBJECT MenuObject
= IntGetMenuObject((HMENU
)Param1
);
438 Ret
= (MenuObject
->MenuInfo
.Height
== (int)Param2
);
439 MenuObject
->MenuInfo
.Height
= (int)Param2
;
442 Ret
= (DWORD_PTR
)MenuObject
->MenuInfo
.Height
;
443 IntReleaseMenuObject(MenuObject
);
447 case TWOPARAM_ROUTINE_SETGUITHRDHANDLE
:
449 PUSER_MESSAGE_QUEUE MsgQueue
= ((PTHREADINFO
)PsGetCurrentThread()->Tcb
.Win32Thread
)->MessageQueue
;
452 RETURN( (DWORD_PTR
)MsqSetStateWindow(MsgQueue
, (ULONG
)Param1
, (HWND
)Param2
));
455 case TWOPARAM_ROUTINE_ENABLEWINDOW
:
456 RETURN( IntEnableWindow((HWND
)Param1
, (BOOL
)Param2
));
458 case TWOPARAM_ROUTINE_SHOWOWNEDPOPUPS
:
460 Window
= UserGetWindowObject((HWND
)Param1
);
461 if (!Window
) RETURN(0);
463 RETURN( (DWORD_PTR
)IntShowOwnedPopups(Window
, (BOOL
) Param2
));
466 case TWOPARAM_ROUTINE_ROS_UPDATEUISTATE
:
469 Window
= UserGetWindowObject((HWND
)Param1
);
470 if (!Window
) RETURN(0);
473 wParam
= MAKEWPARAM((Param2
>> 3) & 0x3,
474 Param2
& (UISF_HIDEFOCUS
| UISF_HIDEACCEL
| UISF_ACTIVE
));
476 RETURN( UserUpdateUiState(Window
, wParam
) );
479 case TWOPARAM_ROUTINE_SWITCHTOTHISWINDOW
:
484 case TWOPARAM_ROUTINE_SETCARETPOS
:
485 RETURN( (DWORD_PTR
)co_IntSetCaretPos((int)Param1
, (int)Param2
));
487 case TWOPARAM_ROUTINE_REGISTERLOGONPROCESS
:
488 RETURN( (DWORD_PTR
)co_IntRegisterLogonProcess((HANDLE
)Param1
, (BOOL
)Param2
));
490 case TWOPARAM_ROUTINE_SETCURSORPOS
:
491 RETURN( (DWORD_PTR
)UserSetCursorPos((int)Param1
, (int)Param2
, 0, 0, FALSE
));
493 case TWOPARAM_ROUTINE_UNHOOKWINDOWSHOOK
:
494 RETURN( IntUnhookWindowsHook((int)Param1
, (HOOKPROC
)Param2
));
496 ERR("Calling invalid routine number 0x%x in NtUserCallTwoParam(), Param1=0x%x Parm2=0x%x\n",
497 Routine
, Param1
, Param2
);
498 EngSetLastError(ERROR_INVALID_PARAMETER
);
502 TRACE("Leave NtUserCallTwoParam, ret=%p\n", (PVOID
)_ret_
);
519 USER_REFERENCE_ENTRY Ref
;
520 DECLARE_RETURN(BOOLEAN
);
522 TRACE("Enter NtUserCallHwndLock\n");
523 UserEnterExclusive();
525 if (!(Window
= UserGetWindowObject(hWnd
)))
529 UserRefObjectCo(Window
, &Ref
);
531 /* FIXME: Routine can be 0x53 - 0x5E */
534 case HWNDLOCK_ROUTINE_ARRANGEICONICWINDOWS
:
535 co_WinPosArrangeIconicWindows(Window
);
538 case HWNDLOCK_ROUTINE_DRAWMENUBAR
:
540 TRACE("HWNDLOCK_ROUTINE_DRAWMENUBAR\n");
542 if ((Window
->style
& (WS_CHILD
| WS_POPUP
)) != WS_CHILD
)
543 co_WinPosSetWindowPos( Window
,
554 case HWNDLOCK_ROUTINE_REDRAWFRAME
:
555 co_WinPosSetWindowPos( Window
,
566 case HWNDLOCK_ROUTINE_REDRAWFRAMEANDHOOK
:
567 co_WinPosSetWindowPos( Window
,
575 if (!Window
->spwndOwner
&& !IntGetParent(Window
))
577 co_IntShellHookNotify(HSHELL_REDRAW
, (WPARAM
) hWnd
, FALSE
); // FIXME Flashing?
582 case HWNDLOCK_ROUTINE_SETFOREGROUNDWINDOW
:
583 TRACE("co_IntSetForegroundWindow 1 %p\n",hWnd
);
584 Ret
= co_IntSetForegroundWindow(Window
);
585 TRACE("co_IntSetForegroundWindow 2 \n");
588 case HWNDLOCK_ROUTINE_UPDATEWINDOW
:
589 Ret
= co_UserRedrawWindow( Window
, NULL
, 0, RDW_UPDATENOW
| RDW_ALLCHILDREN
);
593 UserDerefObjectCo(Window
);
598 TRACE("Leave NtUserCallHwndLock, ret=%u\n",_ret_
);
614 case HWNDOPT_ROUTINE_SETPROGMANWINDOW
:
615 GetW32ThreadInfo()->pDeskInfo
->hProgmanWindow
= hWnd
;
618 case HWNDOPT_ROUTINE_SETTASKMANWINDOW
:
619 GetW32ThreadInfo()->pDeskInfo
->hTaskManWindow
= hWnd
;
634 case HWND_ROUTINE_GETWNDCONTEXTHLPID
:
638 USER_REFERENCE_ENTRY Ref
;
640 UserEnterExclusive();
642 if (!(Window
= UserGetWindowObject(hWnd
)))
647 UserRefObjectCo(Window
, &Ref
);
649 HelpId
= IntGetProp(Window
, gpsi
->atomContextHelpIdProp
);
651 UserDerefObjectCo(Window
);
653 return (DWORD
)HelpId
->Data
;
655 case HWND_ROUTINE_REGISTERSHELLHOOKWINDOW
:
656 if (IntIsWindow(hWnd
))
657 return IntRegisterShellHookWindow(hWnd
);
660 case HWND_ROUTINE_DEREGISTERSHELLHOOKWINDOW
:
661 if (IntIsWindow(hWnd
))
662 return IntDeRegisterShellHookWindow(hWnd
);
664 case HWND_ROUTINE_SETMSGBOX
:
667 UserEnterExclusive();
668 if ((Window
= UserGetWindowObject(hWnd
)))
670 Window
->state
|= WNDS_MSGBOX
;
691 case HWNDPARAM_ROUTINE_KILLSYSTEMTIMER
:
692 return IntKillTimer(UserGetWindowObject(hWnd
), (UINT_PTR
)Param
, TRUE
);
694 case HWNDPARAM_ROUTINE_SETWNDCONTEXTHLPID
:
698 UserEnterExclusive();
699 if(!(Window
= UserGetWindowObject(hWnd
)))
706 IntSetProp(Window
, gpsi
->atomContextHelpIdProp
, (HANDLE
)Param
);
708 IntRemoveProp(Window
, gpsi
->atomContextHelpIdProp
);
714 case HWNDPARAM_ROUTINE_SETDIALOGPOINTER
:
717 USER_REFERENCE_ENTRY Ref
;
719 UserEnterExclusive();
721 if (!(pWnd
= UserGetWindowObject(hWnd
)))
726 UserRefObjectCo(pWnd
, &Ref
);
728 if (pWnd
->head
.pti
->ppi
== PsGetCurrentProcessWin32Process() &&
729 pWnd
->cbwndExtra
== DLGWINDOWEXTRA
&&
730 !(pWnd
->state
& WNDS_SERVERSIDEWINDOWPROC
))
734 if (!pWnd
->fnid
) pWnd
->fnid
= FNID_DIALOG
;
735 pWnd
->state
|= WNDS_DIALOGWINDOW
;
739 pWnd
->fnid
|= FNID_DESTROY
;
740 pWnd
->state
&= ~WNDS_DIALOGWINDOW
;
744 UserDerefObjectCo(pWnd
);
749 case HWNDPARAM_ROUTINE_ROS_NOTIFYWINEVENT
:
753 UserEnterExclusive();
754 pne
= (PNOTIFYEVENT
)Param
;
756 pWnd
= UserGetWindowObject(hWnd
);
759 IntNotifyWinEvent(pne
->event
, pWnd
, pne
->idObject
, pne
->idChild
, pne
->flags
);
763 case HWNDPARAM_ROUTINE_CLEARWINDOWSTATE
:
766 UserEnterExclusive();
767 pWnd
= UserGetWindowObject(hWnd
);
768 if (pWnd
) IntClearWindowState(pWnd
, (UINT
)Param
);
772 case HWNDPARAM_ROUTINE_SETWINDOWSTATE
:
775 UserEnterExclusive();
776 pWnd
= UserGetWindowObject(hWnd
);
777 if (pWnd
) IntSetWindowState(pWnd
, (UINT
)Param
);
790 NtUserCallHwndParamLock(
797 USER_REFERENCE_ENTRY Ref
;
798 DECLARE_RETURN(DWORD
);
800 TRACE("Enter NtUserCallHwndParamLock\n");
801 UserEnterExclusive();
803 if (!(Window
= UserGetWindowObject(hWnd
)))
807 UserRefObjectCo(Window
, &Ref
);
811 case TWOPARAM_ROUTINE_VALIDATERGN
:
812 Ret
= (DWORD
)co_UserRedrawWindow( Window
, NULL
, (HRGN
)Param
, RDW_VALIDATE
);
816 UserDerefObjectCo(Window
);
821 TRACE("Leave NtUserCallHwndParamLock, ret=%lu\n",_ret_
);