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 SetLastWin32Error(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());
117 DPRINT1("Calling invalid routine number 0x%x in NtUserCallNoParam\n", Routine
);
118 SetLastWin32Error(ERROR_INVALID_PARAMETER
);
124 DPRINT("Leave NtUserCallNoParam, ret=%i\n",_ret_
);
139 DECLARE_RETURN(DWORD_PTR
);
141 DPRINT("Enter NtUserCallOneParam\n");
143 UserEnterExclusive();
147 case ONEPARAM_ROUTINE_POSTQUITMESSAGE
:
150 pti
= PsGetCurrentThreadWin32Thread();
151 MsqPostQuitMessage(pti
->MessageQueue
, Param
);
154 case ONEPARAM_ROUTINE_SHOWCURSOR
:
155 RETURN( (DWORD_PTR
)UserShowCursor((BOOL
)Param
) );
157 case ONEPARAM_ROUTINE_GETDESKTOPMAPPING
:
160 ti
= GetW32ThreadInfo();
163 /* Try convert the pointer to a user mode pointer if the desktop is
164 mapped into the process */
165 RETURN((DWORD_PTR
)DesktopHeapAddressToUser((PVOID
)Param
));
173 case ONEPARAM_ROUTINE_WINDOWFROMDC
:
174 RETURN( (DWORD_PTR
)IntWindowFromDC((HDC
)Param
));
176 case ONEPARAM_ROUTINE_SWAPMOUSEBUTTON
:
180 Result
= gspv
.bMouseBtnSwap
;
181 gspv
.bMouseBtnSwap
= Param
? TRUE
: FALSE
;
182 gpsi
->aiSysMet
[SM_SWAPBUTTON
] = gspv
.bMouseBtnSwap
;
186 case ONEPARAM_ROUTINE_SWITCHCARETSHOWING
:
187 RETURN( (DWORD_PTR
)IntSwitchCaretShowing((PVOID
)Param
));
189 case ONEPARAM_ROUTINE_SETCARETBLINKTIME
:
190 RETURN( (DWORD_PTR
)IntSetCaretBlinkTime((UINT
)Param
));
192 case ONEPARAM_ROUTINE_SETMESSAGEEXTRAINFO
:
193 RETURN( (DWORD_PTR
)MsqSetMessageExtraInfo((LPARAM
)Param
));
195 case ONEPARAM_ROUTINE_CREATECURICONHANDLE
:
197 PCURICON_OBJECT CurIcon
;
200 if (!(CurIcon
= IntCreateCurIconHandle()))
202 SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY
);
206 Result
= (DWORD_PTR
)CurIcon
->Self
;
207 UserDereferenceObject(CurIcon
);
211 case ONEPARAM_ROUTINE_GETCURSORPOSITION
:
218 ProbeForWrite((POINT
*)Param
,sizeof(POINT
),1);
219 RtlCopyMemory((POINT
*)Param
,&gpsi
->ptCursor
,sizeof(POINT
));
221 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
223 SetLastNtError(_SEH2_GetExceptionCode());
231 case ONEPARAM_ROUTINE_ISWINDOWINDESTROY
:
233 PWINDOW_OBJECT Window
;
236 if(!(Window
= UserGetWindowObject((HWND
)Param
)))
241 Result
= (DWORD_PTR
)IntIsWindowInDestroy(Window
);
246 case ONEPARAM_ROUTINE_ENABLEPROCWNDGHSTING
:
249 PPROCESSINFO Process
= PsGetCurrentProcessWin32Process();
253 Enable
= (BOOL
)(Param
!= 0);
257 Process
->W32PF_flags
&= ~W32PF_NOWINDOWGHOSTING
;
261 Process
->W32PF_flags
|= W32PF_NOWINDOWGHOSTING
;
270 case ONEPARAM_ROUTINE_MSQSETWAKEMASK
:
271 RETURN( (DWORD_PTR
)IntMsqSetWakeMask(Param
));
273 case ONEPARAM_ROUTINE_GETKEYBOARDTYPE
:
274 RETURN( UserGetKeyboardType(Param
));
276 case ONEPARAM_ROUTINE_GETKEYBOARDLAYOUT
:
277 RETURN( (DWORD_PTR
)UserGetKeyboardLayout(Param
));
279 case ONEPARAM_ROUTINE_RELEASEDC
:
280 RETURN (UserReleaseDC(NULL
, (HDC
) Param
, FALSE
));
282 case ONEPARAM_ROUTINE_REALIZEPALETTE
:
283 RETURN (UserRealizePalette((HDC
) Param
));
285 case ONEPARAM_ROUTINE_GETQUEUESTATUS
:
288 WORD changed_bits
, wake_bits
;
289 Ret
= IntGetQueueStatus(FALSE
);
290 changed_bits
= LOWORD(Ret
);
291 wake_bits
= HIWORD(Ret
);
292 RETURN( MAKELONG(changed_bits
& Param
, wake_bits
& Param
));
294 case ONEPARAM_ROUTINE_ENUMCLIPBOARDFORMATS
:
295 /* FIXME: Should use UserEnterShared */
296 RETURN(IntEnumClipboardFormats(Param
));
298 case ONEPARAM_ROUTINE_CSRSS_GUICHECK
:
299 IntUserManualGuiCheck(Param
);
302 case ONEPARAM_ROUTINE_GETCURSORPOS
:
306 PTHREADINFO pti
= PsGetCurrentThreadWin32Thread();
307 if (pti
->hdesk
!= InputDesktopHandle
) RETURN(FALSE
);
310 pptl
= (PPOINTL
)Param
;
311 *pptl
= gpsi
->ptCursor
;
313 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
321 DPRINT1("Calling invalid routine number 0x%x in NtUserCallOneParam(), Param=0x%x\n",
323 SetLastWin32Error(ERROR_INVALID_PARAMETER
);
327 DPRINT("Leave NtUserCallOneParam, ret=%i\n",_ret_
);
344 PWINDOW_OBJECT Window
;
345 DECLARE_RETURN(DWORD_PTR
);
347 DPRINT("Enter NtUserCallTwoParam\n");
348 UserEnterExclusive();
352 case TWOPARAM_ROUTINE_GETWINDOWRGNBOX
:
356 Window
= UserGetWindowObject((HWND
)Param1
);
357 if (!Window
) RETURN(ERROR
);
359 Ret
= (DWORD_PTR
)IntGetWindowRgnBox(Window
, &rcRect
);
360 Status
= MmCopyToCaller((PVOID
)Param2
, &rcRect
, sizeof(RECT
));
361 if(!NT_SUCCESS(Status
))
363 SetLastNtError(Status
);
368 case TWOPARAM_ROUTINE_GETWINDOWRGN
:
370 Window
= UserGetWindowObject((HWND
)Param1
);
371 if (!Window
) RETURN(ERROR
);
373 RETURN( (DWORD_PTR
)IntGetWindowRgn(Window
, (HRGN
)Param2
));
375 case TWOPARAM_ROUTINE_SETMENUBARHEIGHT
:
378 PMENU_OBJECT MenuObject
= IntGetMenuObject((HMENU
)Param1
);
384 Ret
= (MenuObject
->MenuInfo
.Height
== (int)Param2
);
385 MenuObject
->MenuInfo
.Height
= (int)Param2
;
388 Ret
= (DWORD_PTR
)MenuObject
->MenuInfo
.Height
;
389 IntReleaseMenuObject(MenuObject
);
393 case TWOPARAM_ROUTINE_SETGUITHRDHANDLE
:
395 PUSER_MESSAGE_QUEUE MsgQueue
= ((PTHREADINFO
)PsGetCurrentThread()->Tcb
.Win32Thread
)->MessageQueue
;
398 RETURN( (DWORD_PTR
)MsqSetStateWindow(MsgQueue
, (ULONG
)Param1
, (HWND
)Param2
));
401 case TWOPARAM_ROUTINE_ENABLEWINDOW
:
405 case TWOPARAM_ROUTINE_SHOWOWNEDPOPUPS
:
407 Window
= UserGetWindowObject((HWND
)Param1
);
408 if (!Window
) RETURN(0);
410 RETURN( (DWORD_PTR
)IntShowOwnedPopups(Window
, (BOOL
) Param2
));
413 case TWOPARAM_ROUTINE_ROS_UPDATEUISTATE
:
416 Window
= UserGetWindowObject((HWND
)Param1
);
417 if (!Window
) RETURN(0);
420 wParam
= MAKEWPARAM((Param2
>> 3) & 0x3,
421 Param2
& (UISF_HIDEFOCUS
| UISF_HIDEACCEL
| UISF_ACTIVE
));
423 RETURN( UserUpdateUiState(Window
->Wnd
, wParam
) );
426 case TWOPARAM_ROUTINE_SWITCHTOTHISWINDOW
:
431 case TWOPARAM_ROUTINE_SETCARETPOS
:
432 RETURN( (DWORD_PTR
)co_IntSetCaretPos((int)Param1
, (int)Param2
));
434 case TWOPARAM_ROUTINE_REGISTERLOGONPROC
:
435 RETURN( (DWORD_PTR
)co_IntRegisterLogonProcess((HANDLE
)Param1
, (BOOL
)Param2
));
437 case TWOPARAM_ROUTINE_SETCURSORPOS
:
438 RETURN( (DWORD_PTR
)UserSetCursorPos((int)Param1
, (int)Param2
, FALSE
));
441 DPRINT1("Calling invalid routine number 0x%x in NtUserCallTwoParam(), Param1=0x%x Parm2=0x%x\n",
442 Routine
, Param1
, Param2
);
443 SetLastWin32Error(ERROR_INVALID_PARAMETER
);
447 DPRINT("Leave NtUserCallTwoParam, ret=%i\n",_ret_
);
463 PWINDOW_OBJECT Window
;
465 USER_REFERENCE_ENTRY Ref
;
466 DECLARE_RETURN(BOOLEAN
);
468 DPRINT("Enter NtUserCallHwndLock\n");
469 UserEnterExclusive();
471 if (!(Window
= UserGetWindowObject(hWnd
)) || !Window
->Wnd
)
475 UserRefObjectCo(Window
, &Ref
);
479 /* FIXME: Routine can be 0x53 - 0x5E */
482 case HWNDLOCK_ROUTINE_ARRANGEICONICWINDOWS
:
483 co_WinPosArrangeIconicWindows(Window
);
486 case HWNDLOCK_ROUTINE_DRAWMENUBAR
:
488 DPRINT("HWNDLOCK_ROUTINE_DRAWMENUBAR\n");
490 if ((Wnd
->style
& (WS_CHILD
| WS_POPUP
)) != WS_CHILD
)
491 co_WinPosSetWindowPos( Window
,
502 case HWNDLOCK_ROUTINE_REDRAWFRAME
:
503 co_WinPosSetWindowPos( Window
,
514 case HWNDLOCK_ROUTINE_REDRAWFRAMEANDHOOK
:
515 co_WinPosSetWindowPos( Window
,
523 if (!Window
->spwndOwner
&& !IntGetParent(Window
))
525 co_IntShellHookNotify(HSHELL_REDRAW
, (LPARAM
) hWnd
);
530 case HWNDLOCK_ROUTINE_SETFOREGROUNDWINDOW
:
531 Ret
= co_IntSetForegroundWindow(Window
);
534 case HWNDLOCK_ROUTINE_UPDATEWINDOW
:
535 Ret
= co_UserRedrawWindow( Window
, NULL
, 0, RDW_UPDATENOW
| RDW_ALLCHILDREN
);
539 UserDerefObjectCo(Window
);
544 DPRINT("Leave NtUserCallHwndLock, ret=%i\n",_ret_
);
560 case HWNDOPT_ROUTINE_SETPROGMANWINDOW
:
561 GetW32ThreadInfo()->pDeskInfo
->hProgmanWindow
= hWnd
;
564 case HWNDOPT_ROUTINE_SETTASKMANWINDOW
:
565 GetW32ThreadInfo()->pDeskInfo
->hTaskManWindow
= hWnd
;
580 case HWND_ROUTINE_GETWNDCONTEXTHLPID
:
582 PWINDOW_OBJECT Window
;
584 USER_REFERENCE_ENTRY Ref
;
586 UserEnterExclusive();
588 if (!(Window
= UserGetWindowObject(hWnd
)) || !Window
->Wnd
)
593 UserRefObjectCo(Window
, &Ref
);
595 HelpId
= IntGetProp(Window
, gpsi
->atomContextHelpIdProp
);
597 UserDerefObjectCo(Window
);
599 return (DWORD
)HelpId
;
601 case HWND_ROUTINE_REGISTERSHELLHOOKWINDOW
:
602 if (IntIsWindow(hWnd
))
603 return IntRegisterShellHookWindow(hWnd
);
606 case HWND_ROUTINE_DEREGISTERSHELLHOOKWINDOW
:
607 if (IntIsWindow(hWnd
))
608 return IntDeRegisterShellHookWindow(hWnd
);
626 case HWNDPARAM_ROUTINE_KILLSYSTEMTIMER
:
627 return IntKillTimer(hWnd
, (UINT_PTR
)Param
, TRUE
);
629 case HWNDPARAM_ROUTINE_SETWNDCONTEXTHLPID
:
631 PWINDOW_OBJECT Window
;
633 UserEnterExclusive();
634 if(!(Window
= UserGetWindowObject(hWnd
)))
641 IntSetProp(Window
, gpsi
->atomContextHelpIdProp
, (HANDLE
)Param
);
643 IntRemoveProp(Window
, gpsi
->atomContextHelpIdProp
);
649 case HWNDPARAM_ROUTINE_SETDIALOGPOINTER
:
651 PWINDOW_OBJECT Window
;
653 USER_REFERENCE_ENTRY Ref
;
655 UserEnterExclusive();
657 if (!(Window
= UserGetWindowObject(hWnd
)) || !Window
->Wnd
)
662 UserRefObjectCo(Window
, &Ref
);
665 if (pWnd
->head
.pti
->ppi
== PsGetCurrentProcessWin32Process() &&
666 pWnd
->cbwndExtra
== DLGWINDOWEXTRA
&&
667 !(pWnd
->state
& WNDS_SERVERSIDEWINDOWPROC
))
671 if (!pWnd
->fnid
) pWnd
->fnid
= FNID_DIALOG
;
672 pWnd
->state
|= WNDS_DIALOGWINDOW
;
676 pWnd
->fnid
|= FNID_DESTROY
;
677 pWnd
->state
&= ~WNDS_DIALOGWINDOW
;
681 UserDerefObjectCo(Window
);
694 NtUserCallHwndParamLock(
700 PWINDOW_OBJECT Window
;
702 USER_REFERENCE_ENTRY Ref
;
703 DECLARE_RETURN(DWORD
);
705 DPRINT1("Enter NtUserCallHwndParamLock\n");
706 UserEnterExclusive();
708 if (!(Window
= UserGetWindowObject(hWnd
)) || !Window
->Wnd
)
712 UserRefObjectCo(Window
, &Ref
);
718 case TWOPARAM_ROUTINE_VALIDATERGN
:
719 Ret
= (DWORD
)co_UserRedrawWindow( Window
, NULL
, (HRGN
)Param
, RDW_VALIDATE
);
723 UserDerefObjectCo(Window
);
728 DPRINT1("Leave NtUserCallHwndParamLock, ret=%i\n",_ret_
);