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
17 /* registered Logon process */
18 PPROCESSINFO LogonProcess
= NULL
;
21 co_IntRegisterLogonProcess(HANDLE ProcessId
, BOOL Register
)
25 CSR_API_MESSAGE Request
;
27 Status
= PsLookupProcessByProcessId(ProcessId
,
29 if (!NT_SUCCESS(Status
))
31 EngSetLastError(RtlNtStatusToDosError(Status
));
37 /* Register the logon process */
38 if (LogonProcess
!= NULL
)
40 ObDereferenceObject(Process
);
44 LogonProcess
= (PPROCESSINFO
)Process
->Win32Process
;
48 /* Deregister the logon process */
49 if (LogonProcess
!= (PPROCESSINFO
)Process
->Win32Process
)
51 ObDereferenceObject(Process
);
58 ObDereferenceObject(Process
);
60 Request
.Type
= MAKE_CSR_API(REGISTER_LOGON_PROCESS
, CSR_GUI
);
61 Request
.Data
.RegisterLogonProcessRequest
.ProcessId
= ProcessId
;
62 Request
.Data
.RegisterLogonProcessRequest
.Register
= Register
;
64 Status
= co_CsrNotify(&Request
);
65 if (! NT_SUCCESS(Status
))
67 DPRINT1("Failed to register logon process with CSRSS\n");
79 NtUserCallNoParam(DWORD Routine
)
82 DECLARE_RETURN(DWORD_PTR
);
84 DPRINT("Enter NtUserCallNoParam\n");
89 case NOPARAM_ROUTINE_CREATEMENU
:
90 Result
= (DWORD_PTR
)UserCreateMenu(FALSE
);
93 case NOPARAM_ROUTINE_CREATEMENUPOPUP
:
94 Result
= (DWORD_PTR
)UserCreateMenu(TRUE
);
97 case NOPARAM_ROUTINE_DESTROY_CARET
:
98 Result
= (DWORD_PTR
)co_IntDestroyCaret(PsGetCurrentThread()->Tcb
.Win32Thread
);
101 case NOPARAM_ROUTINE_INIT_MESSAGE_PUMP
:
102 Result
= (DWORD_PTR
)IntInitMessagePumpHook();
105 case NOPARAM_ROUTINE_UNINIT_MESSAGE_PUMP
:
106 Result
= (DWORD_PTR
)IntUninitMessagePumpHook();
109 case NOPARAM_ROUTINE_GETMESSAGEEXTRAINFO
:
110 Result
= (DWORD_PTR
)MsqGetMessageExtraInfo();
113 case NOPARAM_ROUTINE_MSQCLEARWAKEMASK
:
114 RETURN( (DWORD_PTR
)IntMsqClearWakeMask());
116 case NOPARAM_ROUTINE_GETMSESSAGEPOS
:
118 PTHREADINFO pti
= PsGetCurrentThreadWin32Thread();
119 RETURN( (DWORD_PTR
)MAKELONG(pti
->ptLast
.x
, pti
->ptLast
.y
));
123 DPRINT1("Calling invalid routine number 0x%x in NtUserCallNoParam\n", Routine
);
124 EngSetLastError(ERROR_INVALID_PARAMETER
);
130 DPRINT("Leave NtUserCallNoParam, ret=%i\n",_ret_
);
145 DECLARE_RETURN(DWORD_PTR
);
147 DPRINT("Enter NtUserCallOneParam\n");
149 UserEnterExclusive();
153 case ONEPARAM_ROUTINE_POSTQUITMESSAGE
:
156 pti
= PsGetCurrentThreadWin32Thread();
157 MsqPostQuitMessage(pti
->MessageQueue
, Param
);
161 case ONEPARAM_ROUTINE_BEGINDEFERWNDPOS
:
167 EngSetLastError(ERROR_INVALID_PARAMETER
);
170 /* Windows allows zero count, in which case it allocates context for 8 moves */
171 if (Param
== 0) Param
= 8;
173 psmwp
= (PSMWP
) UserCreateObject( gHandleTable
,
178 if (!psmwp
) RETURN(0);
179 psmwp
->acvr
= ExAllocatePoolWithTag(PagedPool
, Param
* sizeof(CVR
), USERTAG_SWP
);
182 UserDeleteObject(hDwp
, otSMWP
);
185 RtlZeroMemory(psmwp
->acvr
, Param
* sizeof(CVR
));
186 psmwp
->bHandle
= TRUE
;
187 psmwp
->ccvr
= 0; // actualCount
188 psmwp
->ccvrAlloc
= Param
; // suggestedCount
189 RETURN((DWORD_PTR
)hDwp
);
192 case ONEPARAM_ROUTINE_SHOWCURSOR
:
193 RETURN( (DWORD_PTR
)UserShowCursor((BOOL
)Param
) );
195 case ONEPARAM_ROUTINE_GETDESKTOPMAPPING
:
198 ti
= GetW32ThreadInfo();
201 /* Try convert the pointer to a user mode pointer if the desktop is
202 mapped into the process */
203 RETURN((DWORD_PTR
)DesktopHeapAddressToUser((PVOID
)Param
));
211 case ONEPARAM_ROUTINE_WINDOWFROMDC
:
212 RETURN( (DWORD_PTR
)IntWindowFromDC((HDC
)Param
));
214 case ONEPARAM_ROUTINE_SWAPMOUSEBUTTON
:
218 Result
= gspv
.bMouseBtnSwap
;
219 gspv
.bMouseBtnSwap
= Param
? TRUE
: FALSE
;
220 gpsi
->aiSysMet
[SM_SWAPBUTTON
] = gspv
.bMouseBtnSwap
;
224 case ONEPARAM_ROUTINE_SWITCHCARETSHOWING
:
225 RETURN( (DWORD_PTR
)IntSwitchCaretShowing((PVOID
)Param
));
227 case ONEPARAM_ROUTINE_SETCARETBLINKTIME
:
228 RETURN( (DWORD_PTR
)IntSetCaretBlinkTime((UINT
)Param
));
230 case ONEPARAM_ROUTINE_SETMESSAGEEXTRAINFO
:
231 RETURN( (DWORD_PTR
)MsqSetMessageExtraInfo((LPARAM
)Param
));
233 case ONEPARAM_ROUTINE_CREATEEMPTYCUROBJECT
:
235 PCURICON_OBJECT CurIcon
;
238 if (!(CurIcon
= IntCreateCurIconHandle()))
240 EngSetLastError(ERROR_NOT_ENOUGH_MEMORY
);
244 Result
= (DWORD_PTR
)CurIcon
->Self
;
245 UserDereferenceObject(CurIcon
);
249 case ONEPARAM_ROUTINE_GETCURSORPOSITION
:
256 ProbeForWrite((POINT
*)Param
,sizeof(POINT
),1);
257 RtlCopyMemory((POINT
*)Param
,&gpsi
->ptCursor
,sizeof(POINT
));
259 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
261 SetLastNtError(_SEH2_GetExceptionCode());
269 case ONEPARAM_ROUTINE_ENABLEPROCWNDGHSTING
:
272 PPROCESSINFO Process
= PsGetCurrentProcessWin32Process();
276 Enable
= (BOOL
)(Param
!= 0);
280 Process
->W32PF_flags
&= ~W32PF_NOWINDOWGHOSTING
;
284 Process
->W32PF_flags
|= W32PF_NOWINDOWGHOSTING
;
293 case ONEPARAM_ROUTINE_GETINPUTEVENT
:
294 RETURN( (DWORD_PTR
)IntMsqSetWakeMask(Param
));
296 case ONEPARAM_ROUTINE_GETKEYBOARDTYPE
:
297 RETURN( UserGetKeyboardType(Param
));
299 case ONEPARAM_ROUTINE_GETKEYBOARDLAYOUT
:
300 RETURN( (DWORD_PTR
)UserGetKeyboardLayout(Param
));
302 case ONEPARAM_ROUTINE_RELEASEDC
:
303 RETURN (UserReleaseDC(NULL
, (HDC
) Param
, FALSE
));
305 case ONEPARAM_ROUTINE_REALIZEPALETTE
:
306 RETURN (UserRealizePalette((HDC
) Param
));
308 case ONEPARAM_ROUTINE_GETQUEUESTATUS
:
310 RETURN (IntGetQueueStatus((DWORD
)Param
));
312 case ONEPARAM_ROUTINE_ENUMCLIPBOARDFORMATS
:
313 /* FIXME: Should use UserEnterShared */
314 RETURN(IntEnumClipboardFormats(Param
));
316 case ONEPARAM_ROUTINE_CSRSS_GUICHECK
:
317 IntUserManualGuiCheck(Param
);
320 case ONEPARAM_ROUTINE_GETCURSORPOS
:
324 PTHREADINFO pti
= PsGetCurrentThreadWin32Thread();
325 if (pti
->hdesk
!= InputDesktopHandle
) RETURN(FALSE
);
328 pptl
= (PPOINTL
)Param
;
329 *pptl
= gpsi
->ptCursor
;
331 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
338 case ONEPARAM_ROUTINE_SETPROCDEFLAYOUT
:
341 if (Param
& LAYOUT_ORIENTATIONMASK
)
343 ppi
= PsGetCurrentProcessWin32Process();
344 ppi
->dwLayout
= Param
;
347 EngSetLastError(ERROR_INVALID_PARAMETER
);
350 case ONEPARAM_ROUTINE_GETPROCDEFLAYOUT
:
355 if ( PsGetCurrentProcess() == CsrProcess
)
357 EngSetLastError(ERROR_INVALID_ACCESS
);
360 ppi
= PsGetCurrentProcessWin32Process();
363 pdwLayout
= (PDWORD
)Param
;
364 *pdwLayout
= ppi
->dwLayout
;
366 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
368 SetLastNtError(_SEH2_GetExceptionCode());
374 case ONEPARAM_ROUTINE_REPLYMESSAGE
:
375 RETURN (co_MsqReplyMessage((LRESULT
) Param
));
376 case ONEPARAM_ROUTINE_MESSAGEBEEP
:
377 RETURN ( UserPostMessage(hwndSAS
, WM_LOGONNOTIFY
, LN_MESSAGE_BEEP
, Param
) );
378 /* TODO: Implement sound sentry */
380 DPRINT1("Calling invalid routine number 0x%x in NtUserCallOneParam(), Param=0x%x\n",
382 EngSetLastError(ERROR_INVALID_PARAMETER
);
386 DPRINT("Leave NtUserCallOneParam, ret=%i\n",_ret_
);
403 DECLARE_RETURN(DWORD_PTR
);
405 DPRINT("Enter NtUserCallTwoParam\n");
406 UserEnterExclusive();
410 case TWOPARAM_ROUTINE_SETMENUBARHEIGHT
:
413 PMENU_OBJECT MenuObject
= IntGetMenuObject((HMENU
)Param1
);
419 Ret
= (MenuObject
->MenuInfo
.Height
== (int)Param2
);
420 MenuObject
->MenuInfo
.Height
= (int)Param2
;
423 Ret
= (DWORD_PTR
)MenuObject
->MenuInfo
.Height
;
424 IntReleaseMenuObject(MenuObject
);
428 case TWOPARAM_ROUTINE_SETGUITHRDHANDLE
:
430 PUSER_MESSAGE_QUEUE MsgQueue
= ((PTHREADINFO
)PsGetCurrentThread()->Tcb
.Win32Thread
)->MessageQueue
;
433 RETURN( (DWORD_PTR
)MsqSetStateWindow(MsgQueue
, (ULONG
)Param1
, (HWND
)Param2
));
436 case TWOPARAM_ROUTINE_ENABLEWINDOW
:
440 case TWOPARAM_ROUTINE_SHOWOWNEDPOPUPS
:
442 Window
= UserGetWindowObject((HWND
)Param1
);
443 if (!Window
) RETURN(0);
445 RETURN( (DWORD_PTR
)IntShowOwnedPopups(Window
, (BOOL
) Param2
));
448 case TWOPARAM_ROUTINE_ROS_UPDATEUISTATE
:
451 Window
= UserGetWindowObject((HWND
)Param1
);
452 if (!Window
) RETURN(0);
455 wParam
= MAKEWPARAM((Param2
>> 3) & 0x3,
456 Param2
& (UISF_HIDEFOCUS
| UISF_HIDEACCEL
| UISF_ACTIVE
));
458 RETURN( UserUpdateUiState(Window
, wParam
) );
461 case TWOPARAM_ROUTINE_SWITCHTOTHISWINDOW
:
466 case TWOPARAM_ROUTINE_SETCARETPOS
:
467 RETURN( (DWORD_PTR
)co_IntSetCaretPos((int)Param1
, (int)Param2
));
469 case TWOPARAM_ROUTINE_REGISTERLOGONPROC
:
470 RETURN( (DWORD_PTR
)co_IntRegisterLogonProcess((HANDLE
)Param1
, (BOOL
)Param2
));
472 case TWOPARAM_ROUTINE_SETCURSORPOS
:
473 RETURN( (DWORD_PTR
)UserSetCursorPos((int)Param1
, (int)Param2
, FALSE
));
475 case TWOPARAM_ROUTINE_UNHOOKWINDOWSHOOK
:
476 RETURN( IntUnhookWindowsHook((int)Param1
, (HOOKPROC
)Param2
));
478 DPRINT1("Calling invalid routine number 0x%x in NtUserCallTwoParam(), Param1=0x%x Parm2=0x%x\n",
479 Routine
, Param1
, Param2
);
480 EngSetLastError(ERROR_INVALID_PARAMETER
);
484 DPRINT("Leave NtUserCallTwoParam, ret=%i\n",_ret_
);
501 USER_REFERENCE_ENTRY Ref
;
502 DECLARE_RETURN(BOOLEAN
);
504 DPRINT("Enter NtUserCallHwndLock\n");
505 UserEnterExclusive();
507 if (!(Window
= UserGetWindowObject(hWnd
)))
511 UserRefObjectCo(Window
, &Ref
);
513 /* FIXME: Routine can be 0x53 - 0x5E */
516 case HWNDLOCK_ROUTINE_ARRANGEICONICWINDOWS
:
517 co_WinPosArrangeIconicWindows(Window
);
520 case HWNDLOCK_ROUTINE_DRAWMENUBAR
:
522 DPRINT("HWNDLOCK_ROUTINE_DRAWMENUBAR\n");
524 if ((Window
->style
& (WS_CHILD
| WS_POPUP
)) != WS_CHILD
)
525 co_WinPosSetWindowPos( Window
,
536 case HWNDLOCK_ROUTINE_REDRAWFRAME
:
537 co_WinPosSetWindowPos( Window
,
548 case HWNDLOCK_ROUTINE_REDRAWFRAMEANDHOOK
:
549 co_WinPosSetWindowPos( Window
,
557 if (!Window
->spwndOwner
&& !IntGetParent(Window
))
559 co_IntShellHookNotify(HSHELL_REDRAW
, (LPARAM
) hWnd
);
564 case HWNDLOCK_ROUTINE_SETFOREGROUNDWINDOW
:
565 Ret
= co_IntSetForegroundWindow(Window
);
568 case HWNDLOCK_ROUTINE_UPDATEWINDOW
:
569 Ret
= co_UserRedrawWindow( Window
, NULL
, 0, RDW_UPDATENOW
| RDW_ALLCHILDREN
);
573 UserDerefObjectCo(Window
);
578 DPRINT("Leave NtUserCallHwndLock, ret=%i\n",_ret_
);
594 case HWNDOPT_ROUTINE_SETPROGMANWINDOW
:
595 GetW32ThreadInfo()->pDeskInfo
->hProgmanWindow
= hWnd
;
598 case HWNDOPT_ROUTINE_SETTASKMANWINDOW
:
599 GetW32ThreadInfo()->pDeskInfo
->hTaskManWindow
= hWnd
;
614 case HWND_ROUTINE_GETWNDCONTEXTHLPID
:
618 USER_REFERENCE_ENTRY Ref
;
620 UserEnterExclusive();
622 if (!(Window
= UserGetWindowObject(hWnd
)))
627 UserRefObjectCo(Window
, &Ref
);
629 HelpId
= IntGetProp(Window
, gpsi
->atomContextHelpIdProp
);
631 UserDerefObjectCo(Window
);
633 return (DWORD
)HelpId
;
635 case HWND_ROUTINE_REGISTERSHELLHOOKWINDOW
:
636 if (IntIsWindow(hWnd
))
637 return IntRegisterShellHookWindow(hWnd
);
640 case HWND_ROUTINE_DEREGISTERSHELLHOOKWINDOW
:
641 if (IntIsWindow(hWnd
))
642 return IntDeRegisterShellHookWindow(hWnd
);
660 case HWNDPARAM_ROUTINE_KILLSYSTEMTIMER
:
661 return IntKillTimer(hWnd
, (UINT_PTR
)Param
, TRUE
);
663 case HWNDPARAM_ROUTINE_SETWNDCONTEXTHLPID
:
667 UserEnterExclusive();
668 if(!(Window
= UserGetWindowObject(hWnd
)))
675 IntSetProp(Window
, gpsi
->atomContextHelpIdProp
, (HANDLE
)Param
);
677 IntRemoveProp(Window
, gpsi
->atomContextHelpIdProp
);
683 case HWNDPARAM_ROUTINE_SETDIALOGPOINTER
:
686 USER_REFERENCE_ENTRY Ref
;
688 UserEnterExclusive();
690 if (!(pWnd
= UserGetWindowObject(hWnd
)))
695 UserRefObjectCo(pWnd
, &Ref
);
697 if (pWnd
->head
.pti
->ppi
== PsGetCurrentProcessWin32Process() &&
698 pWnd
->cbwndExtra
== DLGWINDOWEXTRA
&&
699 !(pWnd
->state
& WNDS_SERVERSIDEWINDOWPROC
))
703 if (!pWnd
->fnid
) pWnd
->fnid
= FNID_DIALOG
;
704 pWnd
->state
|= WNDS_DIALOGWINDOW
;
708 pWnd
->fnid
|= FNID_DESTROY
;
709 pWnd
->state
&= ~WNDS_DIALOGWINDOW
;
713 UserDerefObjectCo(pWnd
);
718 case HWNDPARAM_ROUTINE_ROS_NOTIFYWINEVENT
:
722 UserEnterExclusive();
723 pne
= (PNOTIFYEVENT
)Param
;
725 pWnd
= UserGetWindowObject(hWnd
);
728 IntNotifyWinEvent(pne
->event
, pWnd
, pne
->idObject
, pne
->idChild
, pne
->flags
);
741 NtUserCallHwndParamLock(
748 USER_REFERENCE_ENTRY Ref
;
749 DECLARE_RETURN(DWORD
);
751 DPRINT("Enter NtUserCallHwndParamLock\n");
752 UserEnterExclusive();
754 if (!(Window
= UserGetWindowObject(hWnd
)))
758 UserRefObjectCo(Window
, &Ref
);
762 case TWOPARAM_ROUTINE_VALIDATERGN
:
763 Ret
= (DWORD
)co_UserRedrawWindow( Window
, NULL
, (HRGN
)Param
, RDW_VALIDATE
);
767 UserDerefObjectCo(Window
);
772 DPRINT("Leave NtUserCallHwndParamLock, ret=%i\n",_ret_
);