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)
11 DBG_DEFAULT_CHANNEL(UserMisc
);
13 /* Registered logon process ID */
17 co_IntRegisterLogonProcess(HANDLE ProcessId
, BOOL Register
)
22 Status
= PsLookupProcessByProcessId(ProcessId
, &Process
);
23 if (!NT_SUCCESS(Status
))
25 EngSetLastError(RtlNtStatusToDosError(Status
));
29 ProcessId
= Process
->UniqueProcessId
;
31 ObDereferenceObject(Process
);
35 /* Register the logon process */
39 gpidLogon
= ProcessId
;
43 /* Deregister the logon process */
44 if (gpidLogon
!= ProcessId
)
58 NtUserCallNoParam(DWORD Routine
)
61 DECLARE_RETURN(DWORD_PTR
);
63 TRACE("Enter NtUserCallNoParam\n");
68 case NOPARAM_ROUTINE_CREATEMENU
:
69 Result
= (DWORD_PTR
)UserCreateMenu(GetW32ThreadInfo()->rpdesk
, FALSE
);
72 case NOPARAM_ROUTINE_CREATEMENUPOPUP
:
73 Result
= (DWORD_PTR
)UserCreateMenu(GetW32ThreadInfo()->rpdesk
, TRUE
);
76 case NOPARAM_ROUTINE_DESTROY_CARET
:
77 Result
= (DWORD_PTR
)co_IntDestroyCaret(PsGetCurrentThread()->Tcb
.Win32Thread
);
80 case NOPARAM_ROUTINE_INIT_MESSAGE_PUMP
:
81 Result
= (DWORD_PTR
)IntInitMessagePumpHook();
84 case NOPARAM_ROUTINE_UNINIT_MESSAGE_PUMP
:
85 Result
= (DWORD_PTR
)IntUninitMessagePumpHook();
88 case NOPARAM_ROUTINE_MSQCLEARWAKEMASK
:
89 RETURN( (DWORD_PTR
)IntMsqClearWakeMask());
91 case NOPARAM_ROUTINE_GETMSESSAGEPOS
:
93 PTHREADINFO pti
= PsGetCurrentThreadWin32Thread();
94 RETURN( (DWORD_PTR
)MAKELONG(pti
->ptLast
.x
, pti
->ptLast
.y
));
97 case NOPARAM_ROUTINE_RELEASECAPTURE
:
98 RETURN( (DWORD_PTR
)IntReleaseCapture());
100 case NOPARAM_ROUTINE_LOADUSERAPIHOOK
:
101 RETURN(UserLoadApiHook());
103 case NOPARAM_ROUTINE_ZAPACTIVEANDFOUS
:
105 PTHREADINFO pti
= PsGetCurrentThreadWin32Thread();
106 TRACE("Zapping the Active and Focus window out of the Queue!\n");
107 pti
->MessageQueue
->spwndFocus
= NULL
;
108 pti
->MessageQueue
->spwndActive
= NULL
;
112 /* this is a ReactOS only case and is needed for gui-on-demand */
113 case NOPARAM_ROUTINE_ISCONSOLEMODE
:
114 RETURN( ScreenDeviceContext
== NULL
);
117 ERR("Calling invalid routine number 0x%x in NtUserCallNoParam\n", Routine
);
118 EngSetLastError(ERROR_INVALID_PARAMETER
);
124 TRACE("Leave NtUserCallNoParam, ret=%p\n",(PVOID
)_ret_
);
139 DECLARE_RETURN(DWORD_PTR
);
141 TRACE("Enter NtUserCallOneParam\n");
143 UserEnterExclusive();
147 case ONEPARAM_ROUTINE_POSTQUITMESSAGE
:
150 pti
= PsGetCurrentThreadWin32Thread();
151 MsqPostQuitMessage(pti
, Param
);
155 case ONEPARAM_ROUTINE_BEGINDEFERWNDPOS
:
159 INT count
= (INT
)Param
;
163 EngSetLastError(ERROR_INVALID_PARAMETER
);
166 /* Windows allows zero count, in which case it allocates context for 8 moves */
167 if (count
== 0) count
= 8;
169 psmwp
= (PSMWP
) UserCreateObject( gHandleTable
,
175 if (!psmwp
) RETURN(0);
176 psmwp
->acvr
= ExAllocatePoolWithTag(PagedPool
, count
* sizeof(CVR
), USERTAG_SWP
);
179 UserDeleteObject(hDwp
, TYPE_SETWINDOWPOS
);
182 RtlZeroMemory(psmwp
->acvr
, count
* sizeof(CVR
));
183 psmwp
->bHandle
= TRUE
;
184 psmwp
->ccvr
= 0; // actualCount
185 psmwp
->ccvrAlloc
= count
; // suggestedCount
186 RETURN((DWORD_PTR
)hDwp
);
189 case ONEPARAM_ROUTINE_SHOWCURSOR
:
190 RETURN( (DWORD_PTR
)UserShowCursor((BOOL
)Param
) );
192 case ONEPARAM_ROUTINE_GETDESKTOPMAPPING
:
195 ti
= GetW32ThreadInfo();
198 /* Try convert the pointer to a user mode pointer if the desktop is
199 mapped into the process */
200 RETURN((DWORD_PTR
)DesktopHeapAddressToUser((PVOID
)Param
));
208 case ONEPARAM_ROUTINE_WINDOWFROMDC
:
209 RETURN( (DWORD_PTR
)IntWindowFromDC((HDC
)Param
));
211 case ONEPARAM_ROUTINE_SWAPMOUSEBUTTON
:
215 Result
= gspv
.bMouseBtnSwap
;
216 gspv
.bMouseBtnSwap
= Param
? TRUE
: FALSE
;
217 gpsi
->aiSysMet
[SM_SWAPBUTTON
] = gspv
.bMouseBtnSwap
;
221 case ONEPARAM_ROUTINE_SETCARETBLINKTIME
:
222 RETURN( (DWORD_PTR
)IntSetCaretBlinkTime((UINT
)Param
));
224 case ONEPARAM_ROUTINE_SETMESSAGEEXTRAINFO
:
225 RETURN( (DWORD_PTR
)MsqSetMessageExtraInfo((LPARAM
)Param
));
227 case ONEPARAM_ROUTINE_CREATEEMPTYCUROBJECT
:
231 if (!(Result
= (DWORD_PTR
)IntCreateCurIconHandle((DWORD
)Param
)))
233 EngSetLastError(ERROR_NOT_ENOUGH_MEMORY
);
239 case ONEPARAM_ROUTINE_ENABLEPROCWNDGHSTING
:
242 PPROCESSINFO Process
= PsGetCurrentProcessWin32Process();
246 Enable
= (BOOL
)(Param
!= 0);
250 Process
->W32PF_flags
&= ~W32PF_NOWINDOWGHOSTING
;
254 Process
->W32PF_flags
|= W32PF_NOWINDOWGHOSTING
;
263 case ONEPARAM_ROUTINE_GETINPUTEVENT
:
264 RETURN( (DWORD_PTR
)IntMsqSetWakeMask(Param
));
266 case ONEPARAM_ROUTINE_GETKEYBOARDTYPE
:
267 RETURN( UserGetKeyboardType(Param
));
269 case ONEPARAM_ROUTINE_GETKEYBOARDLAYOUT
:
270 RETURN( (DWORD_PTR
)UserGetKeyboardLayout(Param
));
272 case ONEPARAM_ROUTINE_RELEASEDC
:
273 RETURN (UserReleaseDC(NULL
, (HDC
) Param
, FALSE
));
275 case ONEPARAM_ROUTINE_REALIZEPALETTE
:
276 RETURN (UserRealizePalette((HDC
) Param
));
278 case ONEPARAM_ROUTINE_GETQUEUESTATUS
:
280 RETURN (IntGetQueueStatus((DWORD
)Param
));
282 case ONEPARAM_ROUTINE_ENUMCLIPBOARDFORMATS
:
283 /* FIXME: Should use UserEnterShared */
284 RETURN(UserEnumClipboardFormats(Param
));
286 case ONEPARAM_ROUTINE_GETCURSORPOS
:
290 PTHREADINFO pti
= PsGetCurrentThreadWin32Thread();
291 if (pti
->rpdesk
!= IntGetActiveDesktop()) RETURN(FALSE
);
294 ProbeForWrite((POINT
*)Param
,sizeof(POINT
),1);
295 pptl
= (PPOINTL
)Param
;
296 *pptl
= gpsi
->ptCursor
;
298 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
305 case ONEPARAM_ROUTINE_SETPROCDEFLAYOUT
:
308 if (Param
& LAYOUT_ORIENTATIONMASK
)
310 ppi
= PsGetCurrentProcessWin32Process();
311 ppi
->dwLayout
= Param
;
314 EngSetLastError(ERROR_INVALID_PARAMETER
);
317 case ONEPARAM_ROUTINE_GETPROCDEFLAYOUT
:
322 if ( PsGetCurrentProcess() == gpepCSRSS
)
324 EngSetLastError(ERROR_INVALID_ACCESS
);
327 ppi
= PsGetCurrentProcessWin32Process();
330 pdwLayout
= (PDWORD
)Param
;
331 *pdwLayout
= ppi
->dwLayout
;
333 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
335 SetLastNtError(_SEH2_GetExceptionCode());
341 case ONEPARAM_ROUTINE_REPLYMESSAGE
:
342 RETURN (co_MsqReplyMessage((LRESULT
) Param
));
343 case ONEPARAM_ROUTINE_MESSAGEBEEP
:
344 /* TODO: Implement sound sentry */
345 RETURN ( UserPostMessage(hwndSAS
, WM_LOGONNOTIFY
, LN_MESSAGE_BEEP
, Param
) );
346 case ONEPARAM_ROUTINE_CREATESYSTEMTHREADS
:
347 RETURN(CreateSystemThreads(Param
));
348 case ONEPARAM_ROUTINE_LOCKFOREGNDWINDOW
:
349 RETURN( (DWORD_PTR
)IntLockSetForegroundWindow(Param
));
350 case ONEPARAM_ROUTINE_ALLOWSETFOREGND
:
351 RETURN( (DWORD_PTR
)IntAllowSetForegroundWindow(Param
));
353 ERR("Calling invalid routine number 0x%x in NtUserCallOneParam(), Param=0x%x\n",
355 EngSetLastError(ERROR_INVALID_PARAMETER
);
359 TRACE("Leave NtUserCallOneParam, ret=%p\n", (PVOID
)_ret_
);
376 DECLARE_RETURN(DWORD_PTR
);
378 TRACE("Enter NtUserCallTwoParam\n");
379 UserEnterExclusive();
383 case TWOPARAM_ROUTINE_REDRAWTITLE
:
386 Window
= UserGetWindowObject((HWND
)Param1
);
387 Ret
= (DWORD_PTR
)UserPaintCaption(Window
, (INT
)Param2
);
390 case TWOPARAM_ROUTINE_SETMENUBARHEIGHT
:
393 PMENU MenuObject
= IntGetMenuObject((HMENU
)Param1
);
399 Ret
= (MenuObject
->cyMenu
== (int)Param2
);
400 MenuObject
->cyMenu
= (int)Param2
;
403 Ret
= (DWORD_PTR
)MenuObject
->cyMenu
;
404 IntReleaseMenuObject(MenuObject
);
408 case TWOPARAM_ROUTINE_SETGUITHRDHANDLE
:
410 PTHREADINFO pti
= (PTHREADINFO
)PsGetCurrentThreadWin32Thread();
411 ASSERT(pti
->MessageQueue
);
412 RETURN( (DWORD_PTR
)MsqSetStateWindow(pti
, (ULONG
)Param1
, (HWND
)Param2
));
415 case TWOPARAM_ROUTINE_ENABLEWINDOW
:
416 RETURN( IntEnableWindow((HWND
)Param1
, (BOOL
)Param2
));
418 case TWOPARAM_ROUTINE_SHOWOWNEDPOPUPS
:
420 Window
= UserGetWindowObject((HWND
)Param1
);
421 if (!Window
) RETURN(0);
423 RETURN( (DWORD_PTR
)IntShowOwnedPopups(Window
, (BOOL
) Param2
));
426 case TWOPARAM_ROUTINE_ROS_UPDATEUISTATE
:
429 Window
= UserGetWindowObject((HWND
)Param1
);
430 if (!Window
) RETURN(0);
433 wParam
= MAKEWPARAM((Param2
>> 3) & 0x3,
434 Param2
& (UISF_HIDEFOCUS
| UISF_HIDEACCEL
| UISF_ACTIVE
));
436 RETURN( UserUpdateUiState(Window
, wParam
) );
439 case TWOPARAM_ROUTINE_SWITCHTOTHISWINDOW
:
443 case TWOPARAM_ROUTINE_SETCARETPOS
:
444 RETURN( (DWORD_PTR
)co_IntSetCaretPos((int)Param1
, (int)Param2
));
446 case TWOPARAM_ROUTINE_REGISTERLOGONPROCESS
:
447 RETURN( (DWORD_PTR
)co_IntRegisterLogonProcess((HANDLE
)Param1
, (BOOL
)Param2
));
449 case TWOPARAM_ROUTINE_SETCURSORPOS
:
450 RETURN( (DWORD_PTR
)UserSetCursorPos((int)Param1
, (int)Param2
, 0, 0, FALSE
));
452 case TWOPARAM_ROUTINE_UNHOOKWINDOWSHOOK
:
453 RETURN( IntUnhookWindowsHook((int)Param1
, (HOOKPROC
)Param2
));
455 ERR("Calling invalid routine number 0x%x in NtUserCallTwoParam(), Param1=0x%x Parm2=0x%x\n",
456 Routine
, Param1
, Param2
);
457 EngSetLastError(ERROR_INVALID_PARAMETER
);
461 TRACE("Leave NtUserCallTwoParam, ret=%p\n", (PVOID
)_ret_
);
478 USER_REFERENCE_ENTRY Ref
;
479 DECLARE_RETURN(BOOLEAN
);
481 TRACE("Enter NtUserCallHwndLock\n");
482 UserEnterExclusive();
484 if (!(Window
= UserGetWindowObject(hWnd
)))
488 UserRefObjectCo(Window
, &Ref
);
490 /* FIXME: Routine can be 0x53 - 0x5E */
493 case HWNDLOCK_ROUTINE_ARRANGEICONICWINDOWS
:
494 co_WinPosArrangeIconicWindows(Window
);
497 case HWNDLOCK_ROUTINE_DRAWMENUBAR
:
499 TRACE("HWNDLOCK_ROUTINE_DRAWMENUBAR\n");
501 if ((Window
->style
& (WS_CHILD
| WS_POPUP
)) != WS_CHILD
)
502 co_WinPosSetWindowPos( Window
,
513 case HWNDLOCK_ROUTINE_REDRAWFRAME
:
514 co_WinPosSetWindowPos( Window
,
525 case HWNDLOCK_ROUTINE_REDRAWFRAMEANDHOOK
:
526 co_WinPosSetWindowPos( Window
,
534 if (!Window
->spwndOwner
&& !IntGetParent(Window
))
536 co_IntShellHookNotify(HSHELL_REDRAW
, (WPARAM
) hWnd
, FALSE
); // FIXME Flashing?
541 case HWNDLOCK_ROUTINE_SETFOREGROUNDWINDOW
:
542 TRACE("co_IntSetForegroundWindow 1 0x%p\n",hWnd
);
543 Ret
= co_IntSetForegroundWindow(Window
);
544 TRACE("co_IntSetForegroundWindow 2 0x%p\n",hWnd
);
547 case HWNDLOCK_ROUTINE_SETFOREGROUNDWINDOWMOUSE
:
548 TRACE("co_IntSetForegroundWindow M 1 0x%p\n",hWnd
);
549 Ret
= co_IntSetForegroundWindowMouse(Window
);
550 TRACE("co_IntSetForegroundWindow M 2 0x%p\n",hWnd
);
553 case HWNDLOCK_ROUTINE_UPDATEWINDOW
:
554 co_IntUpdateWindows(Window
, RDW_ALLCHILDREN
, FALSE
);
559 UserDerefObjectCo(Window
);
564 TRACE("Leave NtUserCallHwndLock, ret=%u\n",_ret_
);
580 case HWNDOPT_ROUTINE_SETPROGMANWINDOW
:
581 GetW32ThreadInfo()->pDeskInfo
->hProgmanWindow
= hWnd
;
584 case HWNDOPT_ROUTINE_SETTASKMANWINDOW
:
585 GetW32ThreadInfo()->pDeskInfo
->hTaskManWindow
= hWnd
;
600 case HWND_ROUTINE_GETWNDCONTEXTHLPID
:
604 USER_REFERENCE_ENTRY Ref
;
606 UserEnterExclusive();
608 if (!(Window
= UserGetWindowObject(hWnd
)))
613 UserRefObjectCo(Window
, &Ref
);
615 HelpId
= IntGetProp(Window
, gpsi
->atomContextHelpIdProp
);
617 UserDerefObjectCo(Window
);
619 return (DWORD
)HelpId
->Data
;
621 case HWND_ROUTINE_REGISTERSHELLHOOKWINDOW
:
622 if (IntIsWindow(hWnd
))
623 return IntRegisterShellHookWindow(hWnd
);
626 case HWND_ROUTINE_DEREGISTERSHELLHOOKWINDOW
:
627 if (IntIsWindow(hWnd
))
628 return IntDeRegisterShellHookWindow(hWnd
);
630 case HWND_ROUTINE_SETMSGBOX
:
633 UserEnterExclusive();
634 if ((Window
= UserGetWindowObject(hWnd
)))
636 Window
->state
|= WNDS_MSGBOX
;
657 case HWNDPARAM_ROUTINE_KILLSYSTEMTIMER
:
658 return IntKillTimer(UserGetWindowObject(hWnd
), (UINT_PTR
)Param
, TRUE
);
660 case HWNDPARAM_ROUTINE_SETWNDCONTEXTHLPID
:
664 UserEnterExclusive();
665 if(!(Window
= UserGetWindowObject(hWnd
)))
672 IntSetProp(Window
, gpsi
->atomContextHelpIdProp
, (HANDLE
)Param
);
674 IntRemoveProp(Window
, gpsi
->atomContextHelpIdProp
);
680 case HWNDPARAM_ROUTINE_SETDIALOGPOINTER
:
683 USER_REFERENCE_ENTRY Ref
;
685 UserEnterExclusive();
687 if (!(pWnd
= UserGetWindowObject(hWnd
)))
692 UserRefObjectCo(pWnd
, &Ref
);
694 if (pWnd
->head
.pti
->ppi
== PsGetCurrentProcessWin32Process() &&
695 pWnd
->cbwndExtra
== DLGWINDOWEXTRA
&&
696 !(pWnd
->state
& WNDS_SERVERSIDEWINDOWPROC
))
700 if (!pWnd
->fnid
) pWnd
->fnid
= FNID_DIALOG
;
701 pWnd
->state
|= WNDS_DIALOGWINDOW
;
705 pWnd
->fnid
|= FNID_DESTROY
;
706 pWnd
->state
&= ~WNDS_DIALOGWINDOW
;
710 UserDerefObjectCo(pWnd
);
715 case HWNDPARAM_ROUTINE_ROS_NOTIFYWINEVENT
:
719 UserEnterExclusive();
720 pne
= (PNOTIFYEVENT
)Param
;
722 pWnd
= UserGetWindowObject(hWnd
);
725 IntNotifyWinEvent(pne
->event
, pWnd
, pne
->idObject
, pne
->idChild
, pne
->flags
);
729 case HWNDPARAM_ROUTINE_CLEARWINDOWSTATE
:
732 UserEnterExclusive();
733 pWnd
= UserGetWindowObject(hWnd
);
734 if (pWnd
) IntClearWindowState(pWnd
, (UINT
)Param
);
738 case HWNDPARAM_ROUTINE_SETWINDOWSTATE
:
741 UserEnterExclusive();
742 pWnd
= UserGetWindowObject(hWnd
);
743 if (pWnd
) IntSetWindowState(pWnd
, (UINT
)Param
);
756 NtUserCallHwndParamLock(
763 USER_REFERENCE_ENTRY Ref
;
764 DECLARE_RETURN(DWORD
);
766 TRACE("Enter NtUserCallHwndParamLock\n");
767 UserEnterExclusive();
769 if (!(Window
= UserGetWindowObject(hWnd
)))
773 UserRefObjectCo(Window
, &Ref
);
777 case TWOPARAM_ROUTINE_VALIDATERGN
:
779 PREGION Rgn
= REGION_LockRgn((HRGN
)Param
);
782 Ret
= (DWORD
)co_UserRedrawWindow( Window
, NULL
, Rgn
, RDW_VALIDATE
);
783 REGION_UnlockRgn(Rgn
);
789 UserDerefObjectCo(Window
);
794 TRACE("Leave NtUserCallHwndParamLock, ret=%lu\n",_ret_
);