2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS kernel
4 * PURPOSE: NtUserCallXxx call stubs
5 * FILE: win32ss/user/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
)
62 TRACE("Enter NtUserCallNoParam\n");
67 case NOPARAM_ROUTINE_CREATEMENU
:
68 Result
= (DWORD_PTR
)UserCreateMenu(GetW32ThreadInfo()->rpdesk
, FALSE
);
71 case NOPARAM_ROUTINE_CREATEMENUPOPUP
:
72 Result
= (DWORD_PTR
)UserCreateMenu(GetW32ThreadInfo()->rpdesk
, TRUE
);
75 case NOPARAM_ROUTINE_DESTROY_CARET
:
76 Result
= (DWORD_PTR
)co_IntDestroyCaret(PsGetCurrentThread()->Tcb
.Win32Thread
);
79 case NOPARAM_ROUTINE_INIT_MESSAGE_PUMP
:
80 Result
= (DWORD_PTR
)IntInitMessagePumpHook();
83 case NOPARAM_ROUTINE_UNINIT_MESSAGE_PUMP
:
84 Result
= (DWORD_PTR
)IntUninitMessagePumpHook();
87 case NOPARAM_ROUTINE_MSQCLEARWAKEMASK
:
88 Result
= (DWORD_PTR
)IntMsqClearWakeMask();
91 case NOPARAM_ROUTINE_GETMSESSAGEPOS
:
93 PTHREADINFO pti
= PsGetCurrentThreadWin32Thread();
94 Result
= (DWORD_PTR
)MAKELONG(pti
->ptLast
.x
, pti
->ptLast
.y
);
98 case NOPARAM_ROUTINE_RELEASECAPTURE
:
99 Result
= (DWORD_PTR
)IntReleaseCapture();
102 case NOPARAM_ROUTINE_LOADUSERAPIHOOK
:
103 Result
= UserLoadApiHook();
106 case NOPARAM_ROUTINE_ZAPACTIVEANDFOUS
:
108 PTHREADINFO pti
= PsGetCurrentThreadWin32Thread();
109 TRACE("Zapping the Active and Focus window out of the Queue!\n");
110 pti
->MessageQueue
->spwndFocus
= NULL
;
111 pti
->MessageQueue
->spwndActive
= NULL
;
116 /* this is a ReactOS only case and is needed for gui-on-demand */
117 case NOPARAM_ROUTINE_ISCONSOLEMODE
:
118 Result
= (ScreenDeviceContext
== NULL
);
121 case NOPARAM_ROUTINE_UPDATEPERUSERIMMENABLING
:
122 gpsi
->dwSRVIFlags
|= SRVINFO_IMM32
; // Always set.
123 Result
= TRUE
; // Always return TRUE.
127 ERR("Calling invalid routine number 0x%x in NtUserCallNoParam\n", Routine
);
128 EngSetLastError(ERROR_INVALID_PARAMETER
);
132 TRACE("Leave NtUserCallNoParam, ret=%p\n",(PVOID
)Result
);
150 TRACE("Enter NtUserCallOneParam\n");
152 UserEnterExclusive();
156 case ONEPARAM_ROUTINE_POSTQUITMESSAGE
:
159 pti
= PsGetCurrentThreadWin32Thread();
160 MsqPostQuitMessage(pti
, Param
);
165 case ONEPARAM_ROUTINE_BEGINDEFERWNDPOS
:
169 INT count
= (INT
)Param
;
173 EngSetLastError(ERROR_INVALID_PARAMETER
);
178 /* Windows allows zero count, in which case it allocates context for 8 moves */
179 if (count
== 0) count
= 8;
181 psmwp
= (PSMWP
)UserCreateObject(gHandleTable
,
193 psmwp
->acvr
= ExAllocatePoolWithTag(PagedPool
, count
* sizeof(CVR
), USERTAG_SWP
);
196 UserDeleteObject(hDwp
, TYPE_SETWINDOWPOS
);
201 RtlZeroMemory(psmwp
->acvr
, count
* sizeof(CVR
));
202 psmwp
->bHandle
= TRUE
;
203 psmwp
->ccvr
= 0; // actualCount
204 psmwp
->ccvrAlloc
= count
; // suggestedCount
205 Result
= (DWORD_PTR
)hDwp
;
209 case ONEPARAM_ROUTINE_SHOWCURSOR
:
210 Result
= (DWORD_PTR
)UserShowCursor((BOOL
)Param
);
213 case ONEPARAM_ROUTINE_GETDESKTOPMAPPING
:
216 ti
= GetW32ThreadInfo();
219 /* Try convert the pointer to a user mode pointer if the desktop is
220 mapped into the process */
221 Result
= (DWORD_PTR
)DesktopHeapAddressToUser((PVOID
)Param
);
230 case ONEPARAM_ROUTINE_WINDOWFROMDC
:
231 Result
= (DWORD_PTR
)IntWindowFromDC((HDC
)Param
);
234 case ONEPARAM_ROUTINE_SWAPMOUSEBUTTON
:
236 Result
= gspv
.bMouseBtnSwap
;
237 gspv
.bMouseBtnSwap
= Param
? TRUE
: FALSE
;
238 gpsi
->aiSysMet
[SM_SWAPBUTTON
] = gspv
.bMouseBtnSwap
;
242 case ONEPARAM_ROUTINE_SETCARETBLINKTIME
:
243 Result
= (DWORD_PTR
)IntSetCaretBlinkTime((UINT
)Param
);
246 case ONEPARAM_ROUTINE_SETMESSAGEEXTRAINFO
:
247 Result
= (DWORD_PTR
)MsqSetMessageExtraInfo((LPARAM
)Param
);
250 case ONEPARAM_ROUTINE_CREATEEMPTYCUROBJECT
:
252 if (!(Result
= (DWORD_PTR
)IntCreateCurIconHandle((DWORD
)Param
)))
254 EngSetLastError(ERROR_NOT_ENOUGH_MEMORY
);
260 case ONEPARAM_ROUTINE_ENABLEPROCWNDGHSTING
:
263 PPROCESSINFO Process
= PsGetCurrentProcessWin32Process();
267 Enable
= (BOOL
)(Param
!= 0);
271 Process
->W32PF_flags
&= ~W32PF_NOWINDOWGHOSTING
;
275 Process
->W32PF_flags
|= W32PF_NOWINDOWGHOSTING
;
286 case ONEPARAM_ROUTINE_GETINPUTEVENT
:
287 Result
= (DWORD_PTR
)IntMsqSetWakeMask(Param
);
290 case ONEPARAM_ROUTINE_GETKEYBOARDTYPE
:
291 Result
= UserGetKeyboardType(Param
);
294 case ONEPARAM_ROUTINE_GETKEYBOARDLAYOUT
:
295 Result
= (DWORD_PTR
)UserGetKeyboardLayout(Param
);
298 case ONEPARAM_ROUTINE_RELEASEDC
:
299 Result
= UserReleaseDC(NULL
, (HDC
) Param
, FALSE
);
302 case ONEPARAM_ROUTINE_REALIZEPALETTE
:
303 Result
= UserRealizePalette((HDC
) Param
);
306 case ONEPARAM_ROUTINE_GETQUEUESTATUS
:
308 Result
= IntGetQueueStatus((DWORD
)Param
);
312 case ONEPARAM_ROUTINE_ENUMCLIPBOARDFORMATS
:
313 /* FIXME: Should use UserEnterShared */
314 Result
= UserEnumClipboardFormats(Param
);
317 case ONEPARAM_ROUTINE_GETCURSORPOS
:
320 PTHREADINFO pti
= PsGetCurrentThreadWin32Thread();
322 if (pti
->rpdesk
!= IntGetActiveDesktop())
329 ProbeForWrite((POINT
*)Param
,sizeof(POINT
),1);
330 pptl
= (PPOINTL
)Param
;
331 *pptl
= gpsi
->ptCursor
;
333 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
341 case ONEPARAM_ROUTINE_SETPROCDEFLAYOUT
:
344 if (Param
& LAYOUT_ORIENTATIONMASK
)
346 ppi
= PsGetCurrentProcessWin32Process();
347 ppi
->dwLayout
= Param
;
351 EngSetLastError(ERROR_INVALID_PARAMETER
);
356 case ONEPARAM_ROUTINE_GETPROCDEFLAYOUT
:
362 if (PsGetCurrentProcess() == gpepCSRSS
)
364 EngSetLastError(ERROR_INVALID_ACCESS
);
369 ppi
= PsGetCurrentProcessWin32Process();
372 pdwLayout
= (PDWORD
)Param
;
373 *pdwLayout
= ppi
->dwLayout
;
375 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
377 SetLastNtError(_SEH2_GetExceptionCode());
384 case ONEPARAM_ROUTINE_REPLYMESSAGE
:
385 Result
= co_MsqReplyMessage((LRESULT
)Param
);
388 case ONEPARAM_ROUTINE_MESSAGEBEEP
:
389 /* TODO: Implement sound sentry */
390 Result
= UserPostMessage(hwndSAS
, WM_LOGONNOTIFY
, LN_MESSAGE_BEEP
, Param
);
393 case ONEPARAM_ROUTINE_CREATESYSTEMTHREADS
:
394 Result
= CreateSystemThreads(Param
);
397 case ONEPARAM_ROUTINE_LOCKFOREGNDWINDOW
:
398 Result
= (DWORD_PTR
)IntLockSetForegroundWindow(Param
);
401 case ONEPARAM_ROUTINE_ALLOWSETFOREGND
:
402 Result
= (DWORD_PTR
)IntAllowSetForegroundWindow(Param
);
406 ERR("Calling invalid routine number 0x%x in NtUserCallOneParam(), Param=0x%x\n",
408 EngSetLastError(ERROR_INVALID_PARAMETER
);
413 TRACE("Leave NtUserCallOneParam, ret=%p\n", (PVOID
)Result
);
432 TRACE("Enter NtUserCallTwoParam\n");
433 UserEnterExclusive();
437 case TWOPARAM_ROUTINE_REDRAWTITLE
:
439 Window
= UserGetWindowObject((HWND
)Param1
);
440 Ret
= (DWORD_PTR
)UserPaintCaption(Window
, (INT
)Param2
);
444 case TWOPARAM_ROUTINE_SETMENUBARHEIGHT
:
446 PMENU MenuObject
= IntGetMenuObject((HMENU
)Param1
);
455 Ret
= (MenuObject
->cyMenu
== (int)Param2
);
456 MenuObject
->cyMenu
= (int)Param2
;
459 Ret
= (DWORD_PTR
)MenuObject
->cyMenu
;
460 IntReleaseMenuObject(MenuObject
);
464 case TWOPARAM_ROUTINE_SETGUITHRDHANDLE
:
466 PTHREADINFO pti
= (PTHREADINFO
)PsGetCurrentThreadWin32Thread();
467 ASSERT(pti
->MessageQueue
);
468 Ret
= (DWORD_PTR
)MsqSetStateWindow(pti
, (ULONG
)Param1
, (HWND
)Param2
);
472 case TWOPARAM_ROUTINE_ENABLEWINDOW
:
473 Ret
= IntEnableWindow((HWND
)Param1
, (BOOL
)Param2
);
476 case TWOPARAM_ROUTINE_SHOWOWNEDPOPUPS
:
478 Window
= UserGetWindowObject((HWND
)Param1
);
485 Ret
= (DWORD_PTR
)IntShowOwnedPopups(Window
, (BOOL
)Param2
);
489 case TWOPARAM_ROUTINE_ROS_UPDATEUISTATE
:
492 Window
= UserGetWindowObject((HWND
)Param1
);
500 wParam
= MAKEWPARAM((Param2
>> 3) & 0x3,
501 Param2
& (UISF_HIDEFOCUS
| UISF_HIDEACCEL
| UISF_ACTIVE
));
503 Ret
= UserUpdateUiState(Window
, wParam
);
507 case TWOPARAM_ROUTINE_SWITCHTOTHISWINDOW
:
512 case TWOPARAM_ROUTINE_SETCARETPOS
:
513 Ret
= (DWORD_PTR
)co_IntSetCaretPos((int)Param1
, (int)Param2
);
516 case TWOPARAM_ROUTINE_REGISTERLOGONPROCESS
:
517 Ret
= (DWORD_PTR
)co_IntRegisterLogonProcess((HANDLE
)Param1
, (BOOL
)Param2
);
520 case TWOPARAM_ROUTINE_SETCURSORPOS
:
521 Ret
= (DWORD_PTR
)UserSetCursorPos((int)Param1
, (int)Param2
, 0, 0, FALSE
);
524 case TWOPARAM_ROUTINE_UNHOOKWINDOWSHOOK
:
525 Ret
= IntUnhookWindowsHook((int)Param1
, (HOOKPROC
)Param2
);
529 ERR("Calling invalid routine number 0x%x in NtUserCallTwoParam(), Param1=0x%x Parm2=0x%x\n",
530 Routine
, Param1
, Param2
);
531 EngSetLastError(ERROR_INVALID_PARAMETER
);
536 TRACE("Leave NtUserCallTwoParam, ret=%p\n", (PVOID
)Ret
);
554 USER_REFERENCE_ENTRY Ref
;
556 TRACE("Enter NtUserCallHwndLock\n");
557 UserEnterExclusive();
559 if (!(Window
= UserGetWindowObject(hWnd
)))
565 UserRefObjectCo(Window
, &Ref
);
567 /* FIXME: Routine can be 0x53 - 0x5E */
570 case HWNDLOCK_ROUTINE_ARRANGEICONICWINDOWS
:
571 co_WinPosArrangeIconicWindows(Window
);
574 case HWNDLOCK_ROUTINE_DRAWMENUBAR
:
576 TRACE("HWNDLOCK_ROUTINE_DRAWMENUBAR\n");
578 if ((Window
->style
& (WS_CHILD
| WS_POPUP
)) != WS_CHILD
)
579 co_WinPosSetWindowPos(Window
,
590 case HWNDLOCK_ROUTINE_REDRAWFRAME
:
591 co_WinPosSetWindowPos(Window
,
602 case HWNDLOCK_ROUTINE_REDRAWFRAMEANDHOOK
:
603 co_WinPosSetWindowPos(Window
,
611 if (!Window
->spwndOwner
&& !IntGetParent(Window
))
613 co_IntShellHookNotify(HSHELL_REDRAW
, (WPARAM
)hWnd
, FALSE
); // FIXME Flashing?
618 case HWNDLOCK_ROUTINE_SETFOREGROUNDWINDOW
:
619 TRACE("co_IntSetForegroundWindow 1 0x%p\n", hWnd
);
620 Ret
= co_IntSetForegroundWindow(Window
);
621 TRACE("co_IntSetForegroundWindow 2 0x%p\n", hWnd
);
624 case HWNDLOCK_ROUTINE_SETFOREGROUNDWINDOWMOUSE
:
625 TRACE("co_IntSetForegroundWindow M 1 0x%p\n", hWnd
);
626 Ret
= co_IntSetForegroundWindowMouse(Window
);
627 TRACE("co_IntSetForegroundWindow M 2 0x%p\n", hWnd
);
630 case HWNDLOCK_ROUTINE_UPDATEWINDOW
:
631 co_IntUpdateWindows(Window
, RDW_ALLCHILDREN
, FALSE
);
636 UserDerefObjectCo(Window
);
639 TRACE("Leave NtUserCallHwndLock, ret=%u\n", Ret
);
656 case HWNDOPT_ROUTINE_SETPROGMANWINDOW
:
657 GetW32ThreadInfo()->pDeskInfo
->hProgmanWindow
= hWnd
;
660 case HWNDOPT_ROUTINE_SETTASKMANWINDOW
:
661 GetW32ThreadInfo()->pDeskInfo
->hTaskManWindow
= hWnd
;
676 case HWND_ROUTINE_GETWNDCONTEXTHLPID
:
683 if (!(Window
= UserGetWindowObject(hWnd
)))
689 HelpId
= (DWORD
)(DWORD_PTR
)UserGetProp(Window
, gpsi
->atomContextHelpIdProp
, TRUE
);
695 case HWND_ROUTINE_REGISTERSHELLHOOKWINDOW
:
696 if (IntIsWindow(hWnd
))
697 return IntRegisterShellHookWindow(hWnd
);
701 case HWND_ROUTINE_DEREGISTERSHELLHOOKWINDOW
:
702 if (IntIsWindow(hWnd
))
703 return IntDeRegisterShellHookWindow(hWnd
);
706 case HWND_ROUTINE_SETMSGBOX
:
709 UserEnterExclusive();
710 if ((Window
= UserGetWindowObject(hWnd
)))
712 Window
->state
|= WNDS_MSGBOX
;
734 case HWNDPARAM_ROUTINE_KILLSYSTEMTIMER
:
735 return IntKillTimer(UserGetWindowObject(hWnd
), (UINT_PTR
)Param
, TRUE
);
737 case HWNDPARAM_ROUTINE_SETWNDCONTEXTHLPID
:
741 UserEnterExclusive();
742 if (!(Window
= UserGetWindowObject(hWnd
)))
749 UserSetProp(Window
, gpsi
->atomContextHelpIdProp
, (HANDLE
)Param
, TRUE
);
751 UserRemoveProp(Window
, gpsi
->atomContextHelpIdProp
, TRUE
);
757 case HWNDPARAM_ROUTINE_SETDIALOGPOINTER
:
760 USER_REFERENCE_ENTRY Ref
;
762 UserEnterExclusive();
764 if (!(pWnd
= UserGetWindowObject(hWnd
)))
769 UserRefObjectCo(pWnd
, &Ref
);
771 if (pWnd
->head
.pti
->ppi
== PsGetCurrentProcessWin32Process() &&
772 pWnd
->cbwndExtra
== DLGWINDOWEXTRA
&&
773 !(pWnd
->state
& WNDS_SERVERSIDEWINDOWPROC
))
777 if (!pWnd
->fnid
) pWnd
->fnid
= FNID_DIALOG
;
778 pWnd
->state
|= WNDS_DIALOGWINDOW
;
782 pWnd
->fnid
|= FNID_DESTROY
;
783 pWnd
->state
&= ~WNDS_DIALOGWINDOW
;
787 UserDerefObjectCo(pWnd
);
792 case HWNDPARAM_ROUTINE_ROS_NOTIFYWINEVENT
:
796 UserEnterExclusive();
797 pne
= (PNOTIFYEVENT
)Param
;
799 pWnd
= UserGetWindowObject(hWnd
);
802 IntNotifyWinEvent(pne
->event
, pWnd
, pne
->idObject
, pne
->idChild
, pne
->flags
);
807 case HWNDPARAM_ROUTINE_CLEARWINDOWSTATE
:
810 UserEnterExclusive();
811 pWnd
= UserGetWindowObject(hWnd
);
812 if (pWnd
) IntClearWindowState(pWnd
, (UINT
)Param
);
817 case HWNDPARAM_ROUTINE_SETWINDOWSTATE
:
820 UserEnterExclusive();
821 pWnd
= UserGetWindowObject(hWnd
);
822 if (pWnd
) IntSetWindowState(pWnd
, (UINT
)Param
);
835 NtUserCallHwndParamLock(
842 USER_REFERENCE_ENTRY Ref
;
844 TRACE("Enter NtUserCallHwndParamLock\n");
845 UserEnterExclusive();
847 if (!(Window
= UserGetWindowObject(hWnd
)))
853 UserRefObjectCo(Window
, &Ref
);
857 case TWOPARAM_ROUTINE_VALIDATERGN
:
859 PREGION Rgn
= REGION_LockRgn((HRGN
)Param
);
860 Ret
= (DWORD
)co_UserRedrawWindow(Window
, NULL
, Rgn
, RDW_VALIDATE
);
861 if (Rgn
) REGION_UnlockRgn(Rgn
);
866 UserDerefObjectCo(Window
);
870 TRACE("Leave NtUserCallHwndParamLock, ret=%lu\n", Ret
);