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)
13 DBG_DEFAULT_CHANNEL(UserMisc
);
15 /* registered Logon process */
16 PPROCESSINFO LogonProcess
= NULL
;
19 co_IntRegisterLogonProcess(HANDLE ProcessId
, BOOL Register
)
24 Status
= PsLookupProcessByProcessId(ProcessId
,
26 if (!NT_SUCCESS(Status
))
28 EngSetLastError(RtlNtStatusToDosError(Status
));
34 /* Register the logon process */
35 if (LogonProcess
!= NULL
)
37 ObDereferenceObject(Process
);
41 LogonProcess
= (PPROCESSINFO
)Process
->Win32Process
;
45 /* Deregister the logon process */
46 if (LogonProcess
!= (PPROCESSINFO
)Process
->Win32Process
)
48 ObDereferenceObject(Process
);
55 ObDereferenceObject(Process
);
65 NtUserCallNoParam(DWORD Routine
)
68 DECLARE_RETURN(DWORD_PTR
);
70 TRACE("Enter NtUserCallNoParam\n");
75 case NOPARAM_ROUTINE_CREATEMENU
:
76 Result
= (DWORD_PTR
)UserCreateMenu(GetW32ThreadInfo()->rpdesk
, FALSE
);
79 case NOPARAM_ROUTINE_CREATEMENUPOPUP
:
80 Result
= (DWORD_PTR
)UserCreateMenu(GetW32ThreadInfo()->rpdesk
, TRUE
);
83 case NOPARAM_ROUTINE_DESTROY_CARET
:
84 Result
= (DWORD_PTR
)co_IntDestroyCaret(PsGetCurrentThread()->Tcb
.Win32Thread
);
87 case NOPARAM_ROUTINE_INIT_MESSAGE_PUMP
:
88 Result
= (DWORD_PTR
)IntInitMessagePumpHook();
91 case NOPARAM_ROUTINE_UNINIT_MESSAGE_PUMP
:
92 Result
= (DWORD_PTR
)IntUninitMessagePumpHook();
95 case NOPARAM_ROUTINE_GETMESSAGEEXTRAINFO
:
96 Result
= (DWORD_PTR
)MsqGetMessageExtraInfo();
99 case NOPARAM_ROUTINE_MSQCLEARWAKEMASK
:
100 RETURN( (DWORD_PTR
)IntMsqClearWakeMask());
102 case NOPARAM_ROUTINE_GETMSESSAGEPOS
:
104 PTHREADINFO pti
= PsGetCurrentThreadWin32Thread();
105 RETURN( (DWORD_PTR
)MAKELONG(pti
->ptLast
.x
, pti
->ptLast
.y
));
108 case NOPARAM_ROUTINE_RELEASECAPTURE
:
109 RETURN( (DWORD_PTR
)IntReleaseCapture());
111 case NOPARAM_ROUTINE_LOADUSERAPIHOOK
:
112 RETURN(UserLoadApiHook());
114 case NOPARAM_ROUTINE_ZAPACTIVEANDFOUS
:
116 PTHREADINFO pti
= PsGetCurrentThreadWin32Thread();
117 TRACE("Zapping the Active and Focus window out of the Queue!\n");
118 pti
->MessageQueue
->spwndFocus
= NULL
;
119 pti
->MessageQueue
->spwndActive
= NULL
;
123 /* this is a Reactos only case and is needed for gui-on-demand */
124 case NOPARAM_ROUTINE_ISCONSOLEMODE
:
125 RETURN( ScreenDeviceContext
== NULL
);
128 ERR("Calling invalid routine number 0x%x in NtUserCallNoParam\n", Routine
);
129 EngSetLastError(ERROR_INVALID_PARAMETER
);
135 TRACE("Leave NtUserCallNoParam, ret=%p\n",(PVOID
)_ret_
);
150 DECLARE_RETURN(DWORD_PTR
);
152 TRACE("Enter NtUserCallOneParam\n");
154 UserEnterExclusive();
158 case ONEPARAM_ROUTINE_POSTQUITMESSAGE
:
161 pti
= PsGetCurrentThreadWin32Thread();
162 MsqPostQuitMessage(pti
, Param
);
166 case ONEPARAM_ROUTINE_BEGINDEFERWNDPOS
:
170 INT count
= (INT
)Param
;
174 EngSetLastError(ERROR_INVALID_PARAMETER
);
177 /* Windows allows zero count, in which case it allocates context for 8 moves */
178 if (count
== 0) count
= 8;
180 psmwp
= (PSMWP
) UserCreateObject( gHandleTable
,
186 if (!psmwp
) RETURN(0);
187 psmwp
->acvr
= ExAllocatePoolWithTag(PagedPool
, count
* sizeof(CVR
), USERTAG_SWP
);
190 UserDeleteObject(hDwp
, TYPE_SETWINDOWPOS
);
193 RtlZeroMemory(psmwp
->acvr
, count
* sizeof(CVR
));
194 psmwp
->bHandle
= TRUE
;
195 psmwp
->ccvr
= 0; // actualCount
196 psmwp
->ccvrAlloc
= count
; // suggestedCount
197 RETURN((DWORD_PTR
)hDwp
);
200 case ONEPARAM_ROUTINE_SHOWCURSOR
:
201 RETURN( (DWORD_PTR
)UserShowCursor((BOOL
)Param
) );
203 case ONEPARAM_ROUTINE_GETDESKTOPMAPPING
:
206 ti
= GetW32ThreadInfo();
209 /* Try convert the pointer to a user mode pointer if the desktop is
210 mapped into the process */
211 RETURN((DWORD_PTR
)DesktopHeapAddressToUser((PVOID
)Param
));
219 case ONEPARAM_ROUTINE_WINDOWFROMDC
:
220 RETURN( (DWORD_PTR
)IntWindowFromDC((HDC
)Param
));
222 case ONEPARAM_ROUTINE_SWAPMOUSEBUTTON
:
226 Result
= gspv
.bMouseBtnSwap
;
227 gspv
.bMouseBtnSwap
= Param
? TRUE
: FALSE
;
228 gpsi
->aiSysMet
[SM_SWAPBUTTON
] = gspv
.bMouseBtnSwap
;
232 case ONEPARAM_ROUTINE_SWITCHCARETSHOWING
:
233 RETURN( (DWORD_PTR
)IntSwitchCaretShowing((PVOID
)Param
));
235 case ONEPARAM_ROUTINE_SETCARETBLINKTIME
:
236 RETURN( (DWORD_PTR
)IntSetCaretBlinkTime((UINT
)Param
));
238 case ONEPARAM_ROUTINE_SETMESSAGEEXTRAINFO
:
239 RETURN( (DWORD_PTR
)MsqSetMessageExtraInfo((LPARAM
)Param
));
241 case ONEPARAM_ROUTINE_CREATEEMPTYCUROBJECT
:
245 if (!(Result
= (DWORD_PTR
)IntCreateCurIconHandle((DWORD
)Param
)))
247 EngSetLastError(ERROR_NOT_ENOUGH_MEMORY
);
253 case ONEPARAM_ROUTINE_ENABLEPROCWNDGHSTING
:
256 PPROCESSINFO Process
= PsGetCurrentProcessWin32Process();
260 Enable
= (BOOL
)(Param
!= 0);
264 Process
->W32PF_flags
&= ~W32PF_NOWINDOWGHOSTING
;
268 Process
->W32PF_flags
|= W32PF_NOWINDOWGHOSTING
;
277 case ONEPARAM_ROUTINE_GETINPUTEVENT
:
278 RETURN( (DWORD_PTR
)IntMsqSetWakeMask(Param
));
280 case ONEPARAM_ROUTINE_GETKEYBOARDTYPE
:
281 RETURN( UserGetKeyboardType(Param
));
283 case ONEPARAM_ROUTINE_GETKEYBOARDLAYOUT
:
284 RETURN( (DWORD_PTR
)UserGetKeyboardLayout(Param
));
286 case ONEPARAM_ROUTINE_RELEASEDC
:
287 RETURN (UserReleaseDC(NULL
, (HDC
) Param
, FALSE
));
289 case ONEPARAM_ROUTINE_REALIZEPALETTE
:
290 RETURN (UserRealizePalette((HDC
) Param
));
292 case ONEPARAM_ROUTINE_GETQUEUESTATUS
:
294 RETURN (IntGetQueueStatus((DWORD
)Param
));
296 case ONEPARAM_ROUTINE_ENUMCLIPBOARDFORMATS
:
297 /* FIXME: Should use UserEnterShared */
298 RETURN(UserEnumClipboardFormats(Param
));
300 case ONEPARAM_ROUTINE_CSRSS_GUICHECK
:
301 IntUserManualGuiCheck(Param
);
304 case ONEPARAM_ROUTINE_GETCURSORPOS
:
308 PTHREADINFO pti
= PsGetCurrentThreadWin32Thread();
309 if (pti
->rpdesk
!= IntGetActiveDesktop()) RETURN(FALSE
);
312 ProbeForWrite((POINT
*)Param
,sizeof(POINT
),1);
313 pptl
= (PPOINTL
)Param
;
314 *pptl
= gpsi
->ptCursor
;
316 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
323 case ONEPARAM_ROUTINE_SETPROCDEFLAYOUT
:
326 if (Param
& LAYOUT_ORIENTATIONMASK
)
328 ppi
= PsGetCurrentProcessWin32Process();
329 ppi
->dwLayout
= Param
;
332 EngSetLastError(ERROR_INVALID_PARAMETER
);
335 case ONEPARAM_ROUTINE_GETPROCDEFLAYOUT
:
340 if ( PsGetCurrentProcess() == gpepCSRSS
)
342 EngSetLastError(ERROR_INVALID_ACCESS
);
345 ppi
= PsGetCurrentProcessWin32Process();
348 pdwLayout
= (PDWORD
)Param
;
349 *pdwLayout
= ppi
->dwLayout
;
351 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
353 SetLastNtError(_SEH2_GetExceptionCode());
359 case ONEPARAM_ROUTINE_REPLYMESSAGE
:
360 RETURN (co_MsqReplyMessage((LRESULT
) Param
));
361 case ONEPARAM_ROUTINE_MESSAGEBEEP
:
362 RETURN ( UserPostMessage(hwndSAS
, WM_LOGONNOTIFY
, LN_MESSAGE_BEEP
, Param
) );
363 /* TODO: Implement sound sentry */
364 case ONEPARAM_ROUTINE_CREATESYSTEMTHREADS
:
365 RETURN(CreateSystemThreads(Param
));
366 case ONEPARAM_ROUTINE_LOCKFOREGNDWINDOW
:
367 RETURN( (DWORD_PTR
)IntLockSetForegroundWindow(Param
));
368 case ONEPARAM_ROUTINE_ALLOWSETFOREGND
:
369 RETURN( (DWORD_PTR
)IntAllowSetForegroundWindow(Param
));
371 ERR("Calling invalid routine number 0x%x in NtUserCallOneParam(), Param=0x%x\n",
373 EngSetLastError(ERROR_INVALID_PARAMETER
);
377 TRACE("Leave NtUserCallOneParam, ret=%p\n", (PVOID
)_ret_
);
394 DECLARE_RETURN(DWORD_PTR
);
396 TRACE("Enter NtUserCallTwoParam\n");
397 UserEnterExclusive();
401 case TWOPARAM_ROUTINE_SETMENUBARHEIGHT
:
404 PMENU MenuObject
= IntGetMenuObject((HMENU
)Param1
);
410 Ret
= (MenuObject
->cyMenu
== (int)Param2
);
411 MenuObject
->cyMenu
= (int)Param2
;
414 Ret
= (DWORD_PTR
)MenuObject
->cyMenu
;
415 IntReleaseMenuObject(MenuObject
);
419 case TWOPARAM_ROUTINE_SETGUITHRDHANDLE
:
421 PTHREADINFO pti
= (PTHREADINFO
)PsGetCurrentThreadWin32Thread();
422 ASSERT(pti
->MessageQueue
);
423 RETURN( (DWORD_PTR
)MsqSetStateWindow(pti
, (ULONG
)Param1
, (HWND
)Param2
));
426 case TWOPARAM_ROUTINE_ENABLEWINDOW
:
427 RETURN( IntEnableWindow((HWND
)Param1
, (BOOL
)Param2
));
429 case TWOPARAM_ROUTINE_SHOWOWNEDPOPUPS
:
431 Window
= UserGetWindowObject((HWND
)Param1
);
432 if (!Window
) RETURN(0);
434 RETURN( (DWORD_PTR
)IntShowOwnedPopups(Window
, (BOOL
) Param2
));
437 case TWOPARAM_ROUTINE_ROS_UPDATEUISTATE
:
440 Window
= UserGetWindowObject((HWND
)Param1
);
441 if (!Window
) RETURN(0);
444 wParam
= MAKEWPARAM((Param2
>> 3) & 0x3,
445 Param2
& (UISF_HIDEFOCUS
| UISF_HIDEACCEL
| UISF_ACTIVE
));
447 RETURN( UserUpdateUiState(Window
, wParam
) );
450 case TWOPARAM_ROUTINE_SWITCHTOTHISWINDOW
:
455 case TWOPARAM_ROUTINE_SETCARETPOS
:
456 RETURN( (DWORD_PTR
)co_IntSetCaretPos((int)Param1
, (int)Param2
));
458 case TWOPARAM_ROUTINE_REGISTERLOGONPROCESS
:
459 RETURN( (DWORD_PTR
)co_IntRegisterLogonProcess((HANDLE
)Param1
, (BOOL
)Param2
));
461 case TWOPARAM_ROUTINE_SETCURSORPOS
:
462 RETURN( (DWORD_PTR
)UserSetCursorPos((int)Param1
, (int)Param2
, 0, 0, FALSE
));
464 case TWOPARAM_ROUTINE_UNHOOKWINDOWSHOOK
:
465 RETURN( IntUnhookWindowsHook((int)Param1
, (HOOKPROC
)Param2
));
466 case TWOPARAM_ROUTINE_EXITREACTOS
:
470 RETURN(STATUS_NOT_FOUND
);
472 RETURN( co_IntSendMessage (hwndSAS
, PM_WINLOGON_EXITWINDOWS
, (WPARAM
) Param1
, (LPARAM
)Param2
));
474 ERR("Calling invalid routine number 0x%x in NtUserCallTwoParam(), Param1=0x%x Parm2=0x%x\n",
475 Routine
, Param1
, Param2
);
476 EngSetLastError(ERROR_INVALID_PARAMETER
);
480 TRACE("Leave NtUserCallTwoParam, ret=%p\n", (PVOID
)_ret_
);
497 USER_REFERENCE_ENTRY Ref
;
498 DECLARE_RETURN(BOOLEAN
);
500 TRACE("Enter NtUserCallHwndLock\n");
501 UserEnterExclusive();
503 if (!(Window
= UserGetWindowObject(hWnd
)))
507 UserRefObjectCo(Window
, &Ref
);
509 /* FIXME: Routine can be 0x53 - 0x5E */
512 case HWNDLOCK_ROUTINE_ARRANGEICONICWINDOWS
:
513 co_WinPosArrangeIconicWindows(Window
);
516 case HWNDLOCK_ROUTINE_DRAWMENUBAR
:
518 TRACE("HWNDLOCK_ROUTINE_DRAWMENUBAR\n");
520 if ((Window
->style
& (WS_CHILD
| WS_POPUP
)) != WS_CHILD
)
521 co_WinPosSetWindowPos( Window
,
532 case HWNDLOCK_ROUTINE_REDRAWFRAME
:
533 co_WinPosSetWindowPos( Window
,
544 case HWNDLOCK_ROUTINE_REDRAWFRAMEANDHOOK
:
545 co_WinPosSetWindowPos( Window
,
553 if (!Window
->spwndOwner
&& !IntGetParent(Window
))
555 co_IntShellHookNotify(HSHELL_REDRAW
, (WPARAM
) hWnd
, FALSE
); // FIXME Flashing?
560 case HWNDLOCK_ROUTINE_SETFOREGROUNDWINDOW
:
561 TRACE("co_IntSetForegroundWindow 1 0x%p\n",hWnd
);
562 Ret
= co_IntSetForegroundWindow(Window
);
563 TRACE("co_IntSetForegroundWindow 2 0x%p\n",hWnd
);
566 case HWNDLOCK_ROUTINE_SETFOREGROUNDWINDOWMOUSE
:
567 TRACE("co_IntSetForegroundWindow M 1 0x%p\n",hWnd
);
568 Ret
= co_IntSetForegroundWindowMouse(Window
);
569 TRACE("co_IntSetForegroundWindow M 2 0x%p\n",hWnd
);
572 case HWNDLOCK_ROUTINE_UPDATEWINDOW
:
573 Ret
= co_UserRedrawWindow( Window
, NULL
, 0, RDW_UPDATENOW
| RDW_ALLCHILDREN
);
577 UserDerefObjectCo(Window
);
582 TRACE("Leave NtUserCallHwndLock, ret=%u\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
->Data
;
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
);
648 case HWND_ROUTINE_SETMSGBOX
:
651 UserEnterExclusive();
652 if ((Window
= UserGetWindowObject(hWnd
)))
654 Window
->state
|= WNDS_MSGBOX
;
675 case HWNDPARAM_ROUTINE_KILLSYSTEMTIMER
:
676 return IntKillTimer(UserGetWindowObject(hWnd
), (UINT_PTR
)Param
, TRUE
);
678 case HWNDPARAM_ROUTINE_SETWNDCONTEXTHLPID
:
682 UserEnterExclusive();
683 if(!(Window
= UserGetWindowObject(hWnd
)))
690 IntSetProp(Window
, gpsi
->atomContextHelpIdProp
, (HANDLE
)Param
);
692 IntRemoveProp(Window
, gpsi
->atomContextHelpIdProp
);
698 case HWNDPARAM_ROUTINE_SETDIALOGPOINTER
:
701 USER_REFERENCE_ENTRY Ref
;
703 UserEnterExclusive();
705 if (!(pWnd
= UserGetWindowObject(hWnd
)))
710 UserRefObjectCo(pWnd
, &Ref
);
712 if (pWnd
->head
.pti
->ppi
== PsGetCurrentProcessWin32Process() &&
713 pWnd
->cbwndExtra
== DLGWINDOWEXTRA
&&
714 !(pWnd
->state
& WNDS_SERVERSIDEWINDOWPROC
))
718 if (!pWnd
->fnid
) pWnd
->fnid
= FNID_DIALOG
;
719 pWnd
->state
|= WNDS_DIALOGWINDOW
;
723 pWnd
->fnid
|= FNID_DESTROY
;
724 pWnd
->state
&= ~WNDS_DIALOGWINDOW
;
728 UserDerefObjectCo(pWnd
);
733 case HWNDPARAM_ROUTINE_ROS_NOTIFYWINEVENT
:
737 UserEnterExclusive();
738 pne
= (PNOTIFYEVENT
)Param
;
740 pWnd
= UserGetWindowObject(hWnd
);
743 IntNotifyWinEvent(pne
->event
, pWnd
, pne
->idObject
, pne
->idChild
, pne
->flags
);
747 case HWNDPARAM_ROUTINE_CLEARWINDOWSTATE
:
750 UserEnterExclusive();
751 pWnd
= UserGetWindowObject(hWnd
);
752 if (pWnd
) IntClearWindowState(pWnd
, (UINT
)Param
);
756 case HWNDPARAM_ROUTINE_SETWINDOWSTATE
:
759 UserEnterExclusive();
760 pWnd
= UserGetWindowObject(hWnd
);
761 if (pWnd
) IntSetWindowState(pWnd
, (UINT
)Param
);
774 NtUserCallHwndParamLock(
781 USER_REFERENCE_ENTRY Ref
;
782 DECLARE_RETURN(DWORD
);
784 TRACE("Enter NtUserCallHwndParamLock\n");
785 UserEnterExclusive();
787 if (!(Window
= UserGetWindowObject(hWnd
)))
791 UserRefObjectCo(Window
, &Ref
);
795 case TWOPARAM_ROUTINE_VALIDATERGN
:
797 PREGION Rgn
= RGNOBJAPI_Lock((HRGN
)Param
, NULL
);
800 Ret
= (DWORD
)co_UserRedrawWindow( Window
, NULL
, Rgn
, RDW_VALIDATE
);
801 RGNOBJAPI_Unlock(Rgn
);
807 UserDerefObjectCo(Window
);
812 TRACE("Leave NtUserCallHwndParamLock, ret=%lu\n",_ret_
);