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)
8 * 2008/03/20 Split from misc.c
13 DBG_DEFAULT_CHANNEL(UserMisc
);
15 /* registered Logon process */
16 PPROCESSINFO LogonProcess
= NULL
;
19 co_IntRegisterLogonProcess(HANDLE ProcessId
, BOOL Register
)
23 CSR_API_MESSAGE Request
;
25 Status
= PsLookupProcessByProcessId(ProcessId
,
27 if (!NT_SUCCESS(Status
))
29 EngSetLastError(RtlNtStatusToDosError(Status
));
35 /* Register the logon process */
36 if (LogonProcess
!= NULL
)
38 ObDereferenceObject(Process
);
42 LogonProcess
= (PPROCESSINFO
)Process
->Win32Process
;
46 /* Deregister the logon process */
47 if (LogonProcess
!= (PPROCESSINFO
)Process
->Win32Process
)
49 ObDereferenceObject(Process
);
56 ObDereferenceObject(Process
);
58 Request
.Type
= MAKE_CSR_API(REGISTER_LOGON_PROCESS
, CSR_GUI
);
59 Request
.Data
.RegisterLogonProcessRequest
.ProcessId
= ProcessId
;
60 Request
.Data
.RegisterLogonProcessRequest
.Register
= Register
;
62 Status
= co_CsrNotify(&Request
);
63 if (! NT_SUCCESS(Status
))
65 ERR("Failed to register logon process with CSRSS\n");
77 NtUserCallNoParam(DWORD Routine
)
80 DECLARE_RETURN(DWORD_PTR
);
82 TRACE("Enter NtUserCallNoParam\n");
87 case NOPARAM_ROUTINE_CREATEMENU
:
88 Result
= (DWORD_PTR
)UserCreateMenu(FALSE
);
91 case NOPARAM_ROUTINE_CREATEMENUPOPUP
:
92 Result
= (DWORD_PTR
)UserCreateMenu(TRUE
);
95 case NOPARAM_ROUTINE_DESTROY_CARET
:
96 Result
= (DWORD_PTR
)co_IntDestroyCaret(PsGetCurrentThread()->Tcb
.Win32Thread
);
99 case NOPARAM_ROUTINE_INIT_MESSAGE_PUMP
:
100 Result
= (DWORD_PTR
)IntInitMessagePumpHook();
103 case NOPARAM_ROUTINE_UNINIT_MESSAGE_PUMP
:
104 Result
= (DWORD_PTR
)IntUninitMessagePumpHook();
107 case NOPARAM_ROUTINE_GETMESSAGEEXTRAINFO
:
108 Result
= (DWORD_PTR
)MsqGetMessageExtraInfo();
111 case NOPARAM_ROUTINE_MSQCLEARWAKEMASK
:
112 RETURN( (DWORD_PTR
)IntMsqClearWakeMask());
114 case NOPARAM_ROUTINE_GETMSESSAGEPOS
:
116 PTHREADINFO pti
= PsGetCurrentThreadWin32Thread();
117 RETURN( (DWORD_PTR
)MAKELONG(pti
->ptLast
.x
, pti
->ptLast
.y
));
120 case NOPARAM_ROUTINE_RELEASECAPTURE
:
121 RETURN( (DWORD_PTR
)IntReleaseCapture());
123 case NOPARAM_ROUTINE_LOADUSERAPIHOOK
:
124 RETURN(UserLoadApiHook());
127 ERR("Calling invalid routine number 0x%x in NtUserCallNoParam\n", Routine
);
128 EngSetLastError(ERROR_INVALID_PARAMETER
);
134 TRACE("Leave NtUserCallNoParam, ret=%i\n",_ret_
);
149 DECLARE_RETURN(DWORD_PTR
);
151 TRACE("Enter NtUserCallOneParam\n");
153 UserEnterExclusive();
157 case ONEPARAM_ROUTINE_POSTQUITMESSAGE
:
160 pti
= PsGetCurrentThreadWin32Thread();
161 MsqPostQuitMessage(pti
->MessageQueue
, Param
);
165 case ONEPARAM_ROUTINE_BEGINDEFERWNDPOS
:
169 INT count
= (INT
)Param
;
173 EngSetLastError(ERROR_INVALID_PARAMETER
);
176 /* Windows allows zero count, in which case it allocates context for 8 moves */
177 if (count
== 0) count
= 8;
179 psmwp
= (PSMWP
) UserCreateObject( gHandleTable
,
184 if (!psmwp
) RETURN(0);
185 psmwp
->acvr
= ExAllocatePoolWithTag(PagedPool
, count
* sizeof(CVR
), USERTAG_SWP
);
188 UserDeleteObject(hDwp
, otSMWP
);
191 RtlZeroMemory(psmwp
->acvr
, count
* sizeof(CVR
));
192 psmwp
->bHandle
= TRUE
;
193 psmwp
->ccvr
= 0; // actualCount
194 psmwp
->ccvrAlloc
= count
; // suggestedCount
195 RETURN((DWORD_PTR
)hDwp
);
198 case ONEPARAM_ROUTINE_SHOWCURSOR
:
199 RETURN( (DWORD_PTR
)UserShowCursor((BOOL
)Param
) );
201 case ONEPARAM_ROUTINE_GETDESKTOPMAPPING
:
204 ti
= GetW32ThreadInfo();
207 /* Try convert the pointer to a user mode pointer if the desktop is
208 mapped into the process */
209 RETURN((DWORD_PTR
)DesktopHeapAddressToUser((PVOID
)Param
));
217 case ONEPARAM_ROUTINE_WINDOWFROMDC
:
218 RETURN( (DWORD_PTR
)IntWindowFromDC((HDC
)Param
));
220 case ONEPARAM_ROUTINE_SWAPMOUSEBUTTON
:
224 Result
= gspv
.bMouseBtnSwap
;
225 gspv
.bMouseBtnSwap
= Param
? TRUE
: FALSE
;
226 gpsi
->aiSysMet
[SM_SWAPBUTTON
] = gspv
.bMouseBtnSwap
;
230 case ONEPARAM_ROUTINE_SWITCHCARETSHOWING
:
231 RETURN( (DWORD_PTR
)IntSwitchCaretShowing((PVOID
)Param
));
233 case ONEPARAM_ROUTINE_SETCARETBLINKTIME
:
234 RETURN( (DWORD_PTR
)IntSetCaretBlinkTime((UINT
)Param
));
236 case ONEPARAM_ROUTINE_SETMESSAGEEXTRAINFO
:
237 RETURN( (DWORD_PTR
)MsqSetMessageExtraInfo((LPARAM
)Param
));
239 case ONEPARAM_ROUTINE_CREATEEMPTYCUROBJECT
:
241 PCURICON_OBJECT CurIcon
;
244 if (!(CurIcon
= IntCreateCurIconHandle()))
246 EngSetLastError(ERROR_NOT_ENOUGH_MEMORY
);
250 Result
= (DWORD_PTR
)CurIcon
->Self
;
251 UserDereferenceObject(CurIcon
);
255 case ONEPARAM_ROUTINE_GETCURSORPOSITION
:
261 ProbeForWrite((POINT
*)Param
,sizeof(POINT
),1);
262 RtlCopyMemory((POINT
*)Param
,&gpsi
->ptCursor
,sizeof(POINT
));
264 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
266 SetLastNtError(_SEH2_GetExceptionCode());
274 case ONEPARAM_ROUTINE_ENABLEPROCWNDGHSTING
:
277 PPROCESSINFO Process
= PsGetCurrentProcessWin32Process();
281 Enable
= (BOOL
)(Param
!= 0);
285 Process
->W32PF_flags
&= ~W32PF_NOWINDOWGHOSTING
;
289 Process
->W32PF_flags
|= W32PF_NOWINDOWGHOSTING
;
298 case ONEPARAM_ROUTINE_GETINPUTEVENT
:
299 RETURN( (DWORD_PTR
)IntMsqSetWakeMask(Param
));
301 case ONEPARAM_ROUTINE_GETKEYBOARDTYPE
:
302 RETURN( UserGetKeyboardType(Param
));
304 case ONEPARAM_ROUTINE_GETKEYBOARDLAYOUT
:
305 RETURN( (DWORD_PTR
)UserGetKeyboardLayout(Param
));
307 case ONEPARAM_ROUTINE_RELEASEDC
:
308 RETURN (UserReleaseDC(NULL
, (HDC
) Param
, FALSE
));
310 case ONEPARAM_ROUTINE_REALIZEPALETTE
:
311 RETURN (UserRealizePalette((HDC
) Param
));
313 case ONEPARAM_ROUTINE_GETQUEUESTATUS
:
315 RETURN (IntGetQueueStatus((DWORD
)Param
));
317 case ONEPARAM_ROUTINE_ENUMCLIPBOARDFORMATS
:
318 /* FIXME: Should use UserEnterShared */
319 RETURN(UserEnumClipboardFormats(Param
));
321 case ONEPARAM_ROUTINE_CSRSS_GUICHECK
:
322 IntUserManualGuiCheck(Param
);
325 case ONEPARAM_ROUTINE_GETCURSORPOS
:
329 PTHREADINFO pti
= PsGetCurrentThreadWin32Thread();
330 if (pti
->hdesk
!= InputDesktopHandle
) RETURN(FALSE
);
333 pptl
= (PPOINTL
)Param
;
334 *pptl
= gpsi
->ptCursor
;
336 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
343 case ONEPARAM_ROUTINE_SETPROCDEFLAYOUT
:
346 if (Param
& LAYOUT_ORIENTATIONMASK
)
348 ppi
= PsGetCurrentProcessWin32Process();
349 ppi
->dwLayout
= Param
;
352 EngSetLastError(ERROR_INVALID_PARAMETER
);
355 case ONEPARAM_ROUTINE_GETPROCDEFLAYOUT
:
360 if ( PsGetCurrentProcess() == CsrProcess
)
362 EngSetLastError(ERROR_INVALID_ACCESS
);
365 ppi
= PsGetCurrentProcessWin32Process();
368 pdwLayout
= (PDWORD
)Param
;
369 *pdwLayout
= ppi
->dwLayout
;
371 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
373 SetLastNtError(_SEH2_GetExceptionCode());
379 case ONEPARAM_ROUTINE_REPLYMESSAGE
:
380 RETURN (co_MsqReplyMessage((LRESULT
) Param
));
381 case ONEPARAM_ROUTINE_MESSAGEBEEP
:
382 RETURN ( UserPostMessage(hwndSAS
, WM_LOGONNOTIFY
, LN_MESSAGE_BEEP
, Param
) );
383 /* TODO: Implement sound sentry */
385 ERR("Calling invalid routine number 0x%x in NtUserCallOneParam(), Param=0x%x\n",
387 EngSetLastError(ERROR_INVALID_PARAMETER
);
391 TRACE("Leave NtUserCallOneParam, ret=%i\n",_ret_
);
408 DECLARE_RETURN(DWORD_PTR
);
410 TRACE("Enter NtUserCallTwoParam\n");
411 UserEnterExclusive();
415 case TWOPARAM_ROUTINE_SETMENUBARHEIGHT
:
418 PMENU_OBJECT MenuObject
= IntGetMenuObject((HMENU
)Param1
);
424 Ret
= (MenuObject
->MenuInfo
.Height
== (int)Param2
);
425 MenuObject
->MenuInfo
.Height
= (int)Param2
;
428 Ret
= (DWORD_PTR
)MenuObject
->MenuInfo
.Height
;
429 IntReleaseMenuObject(MenuObject
);
433 case TWOPARAM_ROUTINE_SETGUITHRDHANDLE
:
435 PUSER_MESSAGE_QUEUE MsgQueue
= ((PTHREADINFO
)PsGetCurrentThread()->Tcb
.Win32Thread
)->MessageQueue
;
438 RETURN( (DWORD_PTR
)MsqSetStateWindow(MsgQueue
, (ULONG
)Param1
, (HWND
)Param2
));
441 case TWOPARAM_ROUTINE_ENABLEWINDOW
:
442 RETURN( IntEnableWindow((HWND
)Param1
, (BOOL
)Param2
));
444 case TWOPARAM_ROUTINE_SHOWOWNEDPOPUPS
:
446 Window
= UserGetWindowObject((HWND
)Param1
);
447 if (!Window
) RETURN(0);
449 RETURN( (DWORD_PTR
)IntShowOwnedPopups(Window
, (BOOL
) Param2
));
452 case TWOPARAM_ROUTINE_ROS_UPDATEUISTATE
:
455 Window
= UserGetWindowObject((HWND
)Param1
);
456 if (!Window
) RETURN(0);
459 wParam
= MAKEWPARAM((Param2
>> 3) & 0x3,
460 Param2
& (UISF_HIDEFOCUS
| UISF_HIDEACCEL
| UISF_ACTIVE
));
462 RETURN( UserUpdateUiState(Window
, wParam
) );
465 case TWOPARAM_ROUTINE_SWITCHTOTHISWINDOW
:
470 case TWOPARAM_ROUTINE_SETCARETPOS
:
471 RETURN( (DWORD_PTR
)co_IntSetCaretPos((int)Param1
, (int)Param2
));
473 case TWOPARAM_ROUTINE_REGISTERLOGONPROCESS
:
474 RETURN( (DWORD_PTR
)co_IntRegisterLogonProcess((HANDLE
)Param1
, (BOOL
)Param2
));
476 case TWOPARAM_ROUTINE_SETCURSORPOS
:
477 RETURN( (DWORD_PTR
)UserSetCursorPos((int)Param1
, (int)Param2
, 0, 0, FALSE
));
479 case TWOPARAM_ROUTINE_UNHOOKWINDOWSHOOK
:
480 RETURN( IntUnhookWindowsHook((int)Param1
, (HOOKPROC
)Param2
));
482 ERR("Calling invalid routine number 0x%x in NtUserCallTwoParam(), Param1=0x%x Parm2=0x%x\n",
483 Routine
, Param1
, Param2
);
484 EngSetLastError(ERROR_INVALID_PARAMETER
);
488 TRACE("Leave NtUserCallTwoParam, ret=%i\n",_ret_
);
505 USER_REFERENCE_ENTRY Ref
;
506 DECLARE_RETURN(BOOLEAN
);
508 TRACE("Enter NtUserCallHwndLock\n");
509 UserEnterExclusive();
511 if (!(Window
= UserGetWindowObject(hWnd
)))
515 UserRefObjectCo(Window
, &Ref
);
517 /* FIXME: Routine can be 0x53 - 0x5E */
520 case HWNDLOCK_ROUTINE_ARRANGEICONICWINDOWS
:
521 co_WinPosArrangeIconicWindows(Window
);
524 case HWNDLOCK_ROUTINE_DRAWMENUBAR
:
526 TRACE("HWNDLOCK_ROUTINE_DRAWMENUBAR\n");
528 if ((Window
->style
& (WS_CHILD
| WS_POPUP
)) != WS_CHILD
)
529 co_WinPosSetWindowPos( Window
,
540 case HWNDLOCK_ROUTINE_REDRAWFRAME
:
541 co_WinPosSetWindowPos( Window
,
552 case HWNDLOCK_ROUTINE_REDRAWFRAMEANDHOOK
:
553 co_WinPosSetWindowPos( Window
,
561 if (!Window
->spwndOwner
&& !IntGetParent(Window
))
563 co_IntShellHookNotify(HSHELL_REDRAW
, (LPARAM
) hWnd
);
568 case HWNDLOCK_ROUTINE_SETFOREGROUNDWINDOW
:
569 Ret
= co_IntSetForegroundWindow(Window
);
572 case HWNDLOCK_ROUTINE_UPDATEWINDOW
:
573 Ret
= co_UserRedrawWindow( Window
, NULL
, 0, RDW_UPDATENOW
| RDW_ALLCHILDREN
);
577 UserDerefObjectCo(Window
);
582 TRACE("Leave NtUserCallHwndLock, ret=%i\n",_ret_
);
598 case HWNDOPT_ROUTINE_SETPROGMANWINDOW
:
599 GetW32ThreadInfo()->pDeskInfo
->hProgmanWindow
= hWnd
;
602 case HWNDOPT_ROUTINE_SETTASKMANWINDOW
:
603 GetW32ThreadInfo()->pDeskInfo
->hTaskManWindow
= hWnd
;
618 case HWND_ROUTINE_GETWNDCONTEXTHLPID
:
622 USER_REFERENCE_ENTRY Ref
;
624 UserEnterExclusive();
626 if (!(Window
= UserGetWindowObject(hWnd
)))
631 UserRefObjectCo(Window
, &Ref
);
633 HelpId
= IntGetProp(Window
, gpsi
->atomContextHelpIdProp
);
635 UserDerefObjectCo(Window
);
637 return (DWORD
)HelpId
;
639 case HWND_ROUTINE_REGISTERSHELLHOOKWINDOW
:
640 if (IntIsWindow(hWnd
))
641 return IntRegisterShellHookWindow(hWnd
);
644 case HWND_ROUTINE_DEREGISTERSHELLHOOKWINDOW
:
645 if (IntIsWindow(hWnd
))
646 return IntDeRegisterShellHookWindow(hWnd
);
664 case HWNDPARAM_ROUTINE_KILLSYSTEMTIMER
:
665 return IntKillTimer(hWnd
, (UINT_PTR
)Param
, TRUE
);
667 case HWNDPARAM_ROUTINE_SETWNDCONTEXTHLPID
:
671 UserEnterExclusive();
672 if(!(Window
= UserGetWindowObject(hWnd
)))
679 IntSetProp(Window
, gpsi
->atomContextHelpIdProp
, (HANDLE
)Param
);
681 IntRemoveProp(Window
, gpsi
->atomContextHelpIdProp
);
687 case HWNDPARAM_ROUTINE_SETDIALOGPOINTER
:
690 USER_REFERENCE_ENTRY Ref
;
692 UserEnterExclusive();
694 if (!(pWnd
= UserGetWindowObject(hWnd
)))
699 UserRefObjectCo(pWnd
, &Ref
);
701 if (pWnd
->head
.pti
->ppi
== PsGetCurrentProcessWin32Process() &&
702 pWnd
->cbwndExtra
== DLGWINDOWEXTRA
&&
703 !(pWnd
->state
& WNDS_SERVERSIDEWINDOWPROC
))
707 if (!pWnd
->fnid
) pWnd
->fnid
= FNID_DIALOG
;
708 pWnd
->state
|= WNDS_DIALOGWINDOW
;
712 pWnd
->fnid
|= FNID_DESTROY
;
713 pWnd
->state
&= ~WNDS_DIALOGWINDOW
;
717 UserDerefObjectCo(pWnd
);
722 case HWNDPARAM_ROUTINE_ROS_NOTIFYWINEVENT
:
726 UserEnterExclusive();
727 pne
= (PNOTIFYEVENT
)Param
;
729 pWnd
= UserGetWindowObject(hWnd
);
732 IntNotifyWinEvent(pne
->event
, pWnd
, pne
->idObject
, pne
->idChild
, pne
->flags
);
745 NtUserCallHwndParamLock(
752 USER_REFERENCE_ENTRY Ref
;
753 DECLARE_RETURN(DWORD
);
755 TRACE("Enter NtUserCallHwndParamLock\n");
756 UserEnterExclusive();
758 if (!(Window
= UserGetWindowObject(hWnd
)))
762 UserRefObjectCo(Window
, &Ref
);
766 case TWOPARAM_ROUTINE_VALIDATERGN
:
767 Ret
= (DWORD
)co_UserRedrawWindow( Window
, NULL
, (HRGN
)Param
, RDW_VALIDATE
);
771 UserDerefObjectCo(Window
);
776 TRACE("Leave NtUserCallHwndParamLock, ret=%i\n",_ret_
);