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
)
21 Status
= PsLookupProcessByProcessId(ProcessId
,
23 if (!NT_SUCCESS(Status
))
25 EngSetLastError(RtlNtStatusToDosError(Status
));
31 /* Register the logon process */
32 if (LogonProcess
!= NULL
)
34 ObDereferenceObject(Process
);
38 LogonProcess
= (PPROCESSINFO
)Process
->Win32Process
;
42 /* Deregister the logon process */
43 if (LogonProcess
!= (PPROCESSINFO
)Process
->Win32Process
)
45 ObDereferenceObject(Process
);
52 ObDereferenceObject(Process
);
62 NtUserCallNoParam(DWORD Routine
)
65 DECLARE_RETURN(DWORD_PTR
);
67 TRACE("Enter NtUserCallNoParam\n");
72 case NOPARAM_ROUTINE_CREATEMENU
:
73 Result
= (DWORD_PTR
)UserCreateMenu(FALSE
);
76 case NOPARAM_ROUTINE_CREATEMENUPOPUP
:
77 Result
= (DWORD_PTR
)UserCreateMenu(TRUE
);
80 case NOPARAM_ROUTINE_DESTROY_CARET
:
81 Result
= (DWORD_PTR
)co_IntDestroyCaret(PsGetCurrentThread()->Tcb
.Win32Thread
);
84 case NOPARAM_ROUTINE_INIT_MESSAGE_PUMP
:
85 Result
= (DWORD_PTR
)IntInitMessagePumpHook();
88 case NOPARAM_ROUTINE_UNINIT_MESSAGE_PUMP
:
89 Result
= (DWORD_PTR
)IntUninitMessagePumpHook();
92 case NOPARAM_ROUTINE_GETMESSAGEEXTRAINFO
:
93 Result
= (DWORD_PTR
)MsqGetMessageExtraInfo();
96 case NOPARAM_ROUTINE_MSQCLEARWAKEMASK
:
97 RETURN( (DWORD_PTR
)IntMsqClearWakeMask());
99 case NOPARAM_ROUTINE_GETMSESSAGEPOS
:
101 PTHREADINFO pti
= PsGetCurrentThreadWin32Thread();
102 RETURN( (DWORD_PTR
)MAKELONG(pti
->ptLast
.x
, pti
->ptLast
.y
));
105 case NOPARAM_ROUTINE_RELEASECAPTURE
:
106 RETURN( (DWORD_PTR
)IntReleaseCapture());
108 case NOPARAM_ROUTINE_LOADUSERAPIHOOK
:
109 RETURN(UserLoadApiHook());
111 case NOPARAM_ROUTINE_ZAPACTIVEANDFOUS
:
113 PTHREADINFO pti
= PsGetCurrentThreadWin32Thread();
114 TRACE("Zapping the Active and Focus window out of the Queue!\n");
115 pti
->MessageQueue
->spwndFocus
= NULL
;
116 pti
->MessageQueue
->spwndActive
= NULL
;
120 /* this is a Reactos only case and is needed for gui-on-demand */
121 case NOPARAM_ROUTINE_ISCONSOLEMODE
:
122 RETURN( ScreenDeviceContext
== NULL
);
125 ERR("Calling invalid routine number 0x%x in NtUserCallNoParam\n", Routine
);
126 EngSetLastError(ERROR_INVALID_PARAMETER
);
132 TRACE("Leave NtUserCallNoParam, ret=%p\n",(PVOID
)_ret_
);
147 DECLARE_RETURN(DWORD_PTR
);
149 TRACE("Enter NtUserCallOneParam\n");
151 UserEnterExclusive();
155 case ONEPARAM_ROUTINE_POSTQUITMESSAGE
:
158 pti
= PsGetCurrentThreadWin32Thread();
159 MsqPostQuitMessage(pti
->MessageQueue
, Param
);
163 case ONEPARAM_ROUTINE_BEGINDEFERWNDPOS
:
167 INT count
= (INT
)Param
;
171 EngSetLastError(ERROR_INVALID_PARAMETER
);
174 /* Windows allows zero count, in which case it allocates context for 8 moves */
175 if (count
== 0) count
= 8;
177 psmwp
= (PSMWP
) UserCreateObject( gHandleTable
,
183 if (!psmwp
) RETURN(0);
184 psmwp
->acvr
= ExAllocatePoolWithTag(PagedPool
, count
* sizeof(CVR
), USERTAG_SWP
);
187 UserDeleteObject(hDwp
, TYPE_SETWINDOWPOS
);
190 RtlZeroMemory(psmwp
->acvr
, count
* sizeof(CVR
));
191 psmwp
->bHandle
= TRUE
;
192 psmwp
->ccvr
= 0; // actualCount
193 psmwp
->ccvrAlloc
= count
; // suggestedCount
194 RETURN((DWORD_PTR
)hDwp
);
197 case ONEPARAM_ROUTINE_SHOWCURSOR
:
198 RETURN( (DWORD_PTR
)UserShowCursor((BOOL
)Param
) );
200 case ONEPARAM_ROUTINE_GETDESKTOPMAPPING
:
203 ti
= GetW32ThreadInfo();
206 /* Try convert the pointer to a user mode pointer if the desktop is
207 mapped into the process */
208 RETURN((DWORD_PTR
)DesktopHeapAddressToUser((PVOID
)Param
));
216 case ONEPARAM_ROUTINE_WINDOWFROMDC
:
217 RETURN( (DWORD_PTR
)IntWindowFromDC((HDC
)Param
));
219 case ONEPARAM_ROUTINE_SWAPMOUSEBUTTON
:
223 Result
= gspv
.bMouseBtnSwap
;
224 gspv
.bMouseBtnSwap
= Param
? TRUE
: FALSE
;
225 gpsi
->aiSysMet
[SM_SWAPBUTTON
] = gspv
.bMouseBtnSwap
;
229 case ONEPARAM_ROUTINE_SWITCHCARETSHOWING
:
230 RETURN( (DWORD_PTR
)IntSwitchCaretShowing((PVOID
)Param
));
232 case ONEPARAM_ROUTINE_SETCARETBLINKTIME
:
233 RETURN( (DWORD_PTR
)IntSetCaretBlinkTime((UINT
)Param
));
235 case ONEPARAM_ROUTINE_SETMESSAGEEXTRAINFO
:
236 RETURN( (DWORD_PTR
)MsqSetMessageExtraInfo((LPARAM
)Param
));
238 case ONEPARAM_ROUTINE_CREATEEMPTYCUROBJECT
:
240 PCURICON_OBJECT CurIcon
;
243 if (!(CurIcon
= IntCreateCurIconHandle((DWORD
)Param
)))
245 EngSetLastError(ERROR_NOT_ENOUGH_MEMORY
);
249 Result
= (DWORD_PTR
)CurIcon
->Self
;
250 UserDereferenceObject(CurIcon
);
254 case ONEPARAM_ROUTINE_ENABLEPROCWNDGHSTING
:
257 PPROCESSINFO Process
= PsGetCurrentProcessWin32Process();
261 Enable
= (BOOL
)(Param
!= 0);
265 Process
->W32PF_flags
&= ~W32PF_NOWINDOWGHOSTING
;
269 Process
->W32PF_flags
|= W32PF_NOWINDOWGHOSTING
;
278 case ONEPARAM_ROUTINE_GETINPUTEVENT
:
279 RETURN( (DWORD_PTR
)IntMsqSetWakeMask(Param
));
281 case ONEPARAM_ROUTINE_GETKEYBOARDTYPE
:
282 RETURN( UserGetKeyboardType(Param
));
284 case ONEPARAM_ROUTINE_GETKEYBOARDLAYOUT
:
285 RETURN( (DWORD_PTR
)UserGetKeyboardLayout(Param
));
287 case ONEPARAM_ROUTINE_RELEASEDC
:
288 RETURN (UserReleaseDC(NULL
, (HDC
) Param
, FALSE
));
290 case ONEPARAM_ROUTINE_REALIZEPALETTE
:
291 RETURN (UserRealizePalette((HDC
) Param
));
293 case ONEPARAM_ROUTINE_GETQUEUESTATUS
:
295 RETURN (IntGetQueueStatus((DWORD
)Param
));
297 case ONEPARAM_ROUTINE_ENUMCLIPBOARDFORMATS
:
298 /* FIXME: Should use UserEnterShared */
299 RETURN(UserEnumClipboardFormats(Param
));
301 case ONEPARAM_ROUTINE_CSRSS_GUICHECK
:
302 IntUserManualGuiCheck(Param
);
305 case ONEPARAM_ROUTINE_GETCURSORPOS
:
309 PTHREADINFO pti
= PsGetCurrentThreadWin32Thread();
310 if (pti
->rpdesk
!= IntGetActiveDesktop()) RETURN(FALSE
);
313 ProbeForWrite((POINT
*)Param
,sizeof(POINT
),1);
314 pptl
= (PPOINTL
)Param
;
315 *pptl
= gpsi
->ptCursor
;
317 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
324 case ONEPARAM_ROUTINE_SETPROCDEFLAYOUT
:
327 if (Param
& LAYOUT_ORIENTATIONMASK
)
329 ppi
= PsGetCurrentProcessWin32Process();
330 ppi
->dwLayout
= Param
;
333 EngSetLastError(ERROR_INVALID_PARAMETER
);
336 case ONEPARAM_ROUTINE_GETPROCDEFLAYOUT
:
341 if ( PsGetCurrentProcess() == gpepCSRSS
)
343 EngSetLastError(ERROR_INVALID_ACCESS
);
346 ppi
= PsGetCurrentProcessWin32Process();
349 pdwLayout
= (PDWORD
)Param
;
350 *pdwLayout
= ppi
->dwLayout
;
352 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
354 SetLastNtError(_SEH2_GetExceptionCode());
360 case ONEPARAM_ROUTINE_REPLYMESSAGE
:
361 RETURN (co_MsqReplyMessage((LRESULT
) Param
));
362 case ONEPARAM_ROUTINE_MESSAGEBEEP
:
363 RETURN ( UserPostMessage(hwndSAS
, WM_LOGONNOTIFY
, LN_MESSAGE_BEEP
, Param
) );
364 /* TODO: Implement sound sentry */
365 case ONEPARAM_ROUTINE_CREATESYSTEMTHREADS
:
366 RETURN(CreateSystemThreads(Param
));
367 case ONEPARAM_ROUTINE_LOCKFOREGNDWINDOW
:
368 RETURN( (DWORD_PTR
)IntLockSetForegroundWindow(Param
));
369 case ONEPARAM_ROUTINE_ALLOWSETFOREGND
:
370 RETURN( (DWORD_PTR
)IntAllowSetForegroundWindow(Param
));
372 ERR("Calling invalid routine number 0x%x in NtUserCallOneParam(), Param=0x%x\n",
374 EngSetLastError(ERROR_INVALID_PARAMETER
);
378 TRACE("Leave NtUserCallOneParam, ret=%p\n", (PVOID
)_ret_
);
395 DECLARE_RETURN(DWORD_PTR
);
397 TRACE("Enter NtUserCallTwoParam\n");
398 UserEnterExclusive();
402 case TWOPARAM_ROUTINE_SETMENUBARHEIGHT
:
405 PMENU_OBJECT MenuObject
= IntGetMenuObject((HMENU
)Param1
);
411 Ret
= (MenuObject
->MenuInfo
.Height
== (int)Param2
);
412 MenuObject
->MenuInfo
.Height
= (int)Param2
;
415 Ret
= (DWORD_PTR
)MenuObject
->MenuInfo
.Height
;
416 IntReleaseMenuObject(MenuObject
);
420 case TWOPARAM_ROUTINE_SETGUITHRDHANDLE
:
422 PUSER_MESSAGE_QUEUE MsgQueue
= ((PTHREADINFO
)PsGetCurrentThread()->Tcb
.Win32Thread
)->MessageQueue
;
425 RETURN( (DWORD_PTR
)MsqSetStateWindow(MsgQueue
, (ULONG
)Param1
, (HWND
)Param2
));
428 case TWOPARAM_ROUTINE_ENABLEWINDOW
:
429 RETURN( IntEnableWindow((HWND
)Param1
, (BOOL
)Param2
));
431 case TWOPARAM_ROUTINE_SHOWOWNEDPOPUPS
:
433 Window
= UserGetWindowObject((HWND
)Param1
);
434 if (!Window
) RETURN(0);
436 RETURN( (DWORD_PTR
)IntShowOwnedPopups(Window
, (BOOL
) Param2
));
439 case TWOPARAM_ROUTINE_ROS_UPDATEUISTATE
:
442 Window
= UserGetWindowObject((HWND
)Param1
);
443 if (!Window
) RETURN(0);
446 wParam
= MAKEWPARAM((Param2
>> 3) & 0x3,
447 Param2
& (UISF_HIDEFOCUS
| UISF_HIDEACCEL
| UISF_ACTIVE
));
449 RETURN( UserUpdateUiState(Window
, wParam
) );
452 case TWOPARAM_ROUTINE_SWITCHTOTHISWINDOW
:
457 case TWOPARAM_ROUTINE_SETCARETPOS
:
458 RETURN( (DWORD_PTR
)co_IntSetCaretPos((int)Param1
, (int)Param2
));
460 case TWOPARAM_ROUTINE_REGISTERLOGONPROCESS
:
461 RETURN( (DWORD_PTR
)co_IntRegisterLogonProcess((HANDLE
)Param1
, (BOOL
)Param2
));
463 case TWOPARAM_ROUTINE_SETCURSORPOS
:
464 RETURN( (DWORD_PTR
)UserSetCursorPos((int)Param1
, (int)Param2
, 0, 0, FALSE
));
466 case TWOPARAM_ROUTINE_UNHOOKWINDOWSHOOK
:
467 RETURN( IntUnhookWindowsHook((int)Param1
, (HOOKPROC
)Param2
));
468 case TWOPARAM_ROUTINE_EXITREACTOS
:
472 RETURN(STATUS_NOT_FOUND
);
474 RETURN( co_IntSendMessage (hwndSAS
, PM_WINLOGON_EXITWINDOWS
, (WPARAM
) Param1
, (LPARAM
)Param2
));
476 ERR("Calling invalid routine number 0x%x in NtUserCallTwoParam(), Param1=0x%x Parm2=0x%x\n",
477 Routine
, Param1
, Param2
);
478 EngSetLastError(ERROR_INVALID_PARAMETER
);
482 TRACE("Leave NtUserCallTwoParam, ret=%p\n", (PVOID
)_ret_
);
499 USER_REFERENCE_ENTRY Ref
;
500 DECLARE_RETURN(BOOLEAN
);
502 TRACE("Enter NtUserCallHwndLock\n");
503 UserEnterExclusive();
505 if (!(Window
= UserGetWindowObject(hWnd
)))
509 UserRefObjectCo(Window
, &Ref
);
511 /* FIXME: Routine can be 0x53 - 0x5E */
514 case HWNDLOCK_ROUTINE_ARRANGEICONICWINDOWS
:
515 co_WinPosArrangeIconicWindows(Window
);
518 case HWNDLOCK_ROUTINE_DRAWMENUBAR
:
520 TRACE("HWNDLOCK_ROUTINE_DRAWMENUBAR\n");
522 if ((Window
->style
& (WS_CHILD
| WS_POPUP
)) != WS_CHILD
)
523 co_WinPosSetWindowPos( Window
,
534 case HWNDLOCK_ROUTINE_REDRAWFRAME
:
535 co_WinPosSetWindowPos( Window
,
546 case HWNDLOCK_ROUTINE_REDRAWFRAMEANDHOOK
:
547 co_WinPosSetWindowPos( Window
,
555 if (!Window
->spwndOwner
&& !IntGetParent(Window
))
557 co_IntShellHookNotify(HSHELL_REDRAW
, (WPARAM
) hWnd
, FALSE
); // FIXME Flashing?
562 case HWNDLOCK_ROUTINE_SETFOREGROUNDWINDOW
:
563 TRACE("co_IntSetForegroundWindow 1 %p\n",hWnd
);
564 Ret
= co_IntSetForegroundWindow(Window
);
565 TRACE("co_IntSetForegroundWindow 2 \n");
568 case HWNDLOCK_ROUTINE_SETFOREGROUNDWINDOWMOUSE
:
569 TRACE("co_IntSetForegroundWindow 1 0x%p\n",hWnd
);
570 Ret
= co_IntSetForegroundWindowMouse(Window
);
571 TRACE("co_IntSetForegroundWindow 2 0x%p\n",hWnd
);
574 case HWNDLOCK_ROUTINE_UPDATEWINDOW
:
575 Ret
= co_UserRedrawWindow( Window
, NULL
, 0, RDW_UPDATENOW
| RDW_ALLCHILDREN
);
579 UserDerefObjectCo(Window
);
584 TRACE("Leave NtUserCallHwndLock, ret=%u\n",_ret_
);
600 case HWNDOPT_ROUTINE_SETPROGMANWINDOW
:
601 GetW32ThreadInfo()->pDeskInfo
->hProgmanWindow
= hWnd
;
604 case HWNDOPT_ROUTINE_SETTASKMANWINDOW
:
605 GetW32ThreadInfo()->pDeskInfo
->hTaskManWindow
= hWnd
;
620 case HWND_ROUTINE_GETWNDCONTEXTHLPID
:
624 USER_REFERENCE_ENTRY Ref
;
626 UserEnterExclusive();
628 if (!(Window
= UserGetWindowObject(hWnd
)))
633 UserRefObjectCo(Window
, &Ref
);
635 HelpId
= IntGetProp(Window
, gpsi
->atomContextHelpIdProp
);
637 UserDerefObjectCo(Window
);
639 return (DWORD
)HelpId
->Data
;
641 case HWND_ROUTINE_REGISTERSHELLHOOKWINDOW
:
642 if (IntIsWindow(hWnd
))
643 return IntRegisterShellHookWindow(hWnd
);
646 case HWND_ROUTINE_DEREGISTERSHELLHOOKWINDOW
:
647 if (IntIsWindow(hWnd
))
648 return IntDeRegisterShellHookWindow(hWnd
);
650 case HWND_ROUTINE_SETMSGBOX
:
653 UserEnterExclusive();
654 if ((Window
= UserGetWindowObject(hWnd
)))
656 Window
->state
|= WNDS_MSGBOX
;
677 case HWNDPARAM_ROUTINE_KILLSYSTEMTIMER
:
678 return IntKillTimer(UserGetWindowObject(hWnd
), (UINT_PTR
)Param
, TRUE
);
680 case HWNDPARAM_ROUTINE_SETWNDCONTEXTHLPID
:
684 UserEnterExclusive();
685 if(!(Window
= UserGetWindowObject(hWnd
)))
692 IntSetProp(Window
, gpsi
->atomContextHelpIdProp
, (HANDLE
)Param
);
694 IntRemoveProp(Window
, gpsi
->atomContextHelpIdProp
);
700 case HWNDPARAM_ROUTINE_SETDIALOGPOINTER
:
703 USER_REFERENCE_ENTRY Ref
;
705 UserEnterExclusive();
707 if (!(pWnd
= UserGetWindowObject(hWnd
)))
712 UserRefObjectCo(pWnd
, &Ref
);
714 if (pWnd
->head
.pti
->ppi
== PsGetCurrentProcessWin32Process() &&
715 pWnd
->cbwndExtra
== DLGWINDOWEXTRA
&&
716 !(pWnd
->state
& WNDS_SERVERSIDEWINDOWPROC
))
720 if (!pWnd
->fnid
) pWnd
->fnid
= FNID_DIALOG
;
721 pWnd
->state
|= WNDS_DIALOGWINDOW
;
725 pWnd
->fnid
|= FNID_DESTROY
;
726 pWnd
->state
&= ~WNDS_DIALOGWINDOW
;
730 UserDerefObjectCo(pWnd
);
735 case HWNDPARAM_ROUTINE_ROS_NOTIFYWINEVENT
:
739 UserEnterExclusive();
740 pne
= (PNOTIFYEVENT
)Param
;
742 pWnd
= UserGetWindowObject(hWnd
);
745 IntNotifyWinEvent(pne
->event
, pWnd
, pne
->idObject
, pne
->idChild
, pne
->flags
);
749 case HWNDPARAM_ROUTINE_CLEARWINDOWSTATE
:
752 UserEnterExclusive();
753 pWnd
= UserGetWindowObject(hWnd
);
754 if (pWnd
) IntClearWindowState(pWnd
, (UINT
)Param
);
758 case HWNDPARAM_ROUTINE_SETWINDOWSTATE
:
761 UserEnterExclusive();
762 pWnd
= UserGetWindowObject(hWnd
);
763 if (pWnd
) IntSetWindowState(pWnd
, (UINT
)Param
);
776 NtUserCallHwndParamLock(
783 USER_REFERENCE_ENTRY Ref
;
784 DECLARE_RETURN(DWORD
);
786 TRACE("Enter NtUserCallHwndParamLock\n");
787 UserEnterExclusive();
789 if (!(Window
= UserGetWindowObject(hWnd
)))
793 UserRefObjectCo(Window
, &Ref
);
797 case TWOPARAM_ROUTINE_VALIDATERGN
:
798 Ret
= (DWORD
)co_UserRedrawWindow( Window
, NULL
, (HRGN
)Param
, RDW_VALIDATE
);
802 UserDerefObjectCo(Window
);
807 TRACE("Leave NtUserCallHwndParamLock, ret=%lu\n",_ret_
);