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
);
84 DPRINT("Enter NtUserCallNoParam\n");
89 case NOPARAM_ROUTINE_CREATEMENU
:
90 Result
= (DWORD
)UserCreateMenu(FALSE
);
93 case NOPARAM_ROUTINE_CREATEMENUPOPUP
:
94 Result
= (DWORD
)UserCreateMenu(TRUE
);
97 case NOPARAM_ROUTINE_DESTROY_CARET
:
98 Result
= (DWORD
)co_IntDestroyCaret(PsGetCurrentThread()->Tcb
.Win32Thread
);
101 case NOPARAM_ROUTINE_INIT_MESSAGE_PUMP
:
102 Result
= (DWORD
)IntInitMessagePumpHook();
105 case NOPARAM_ROUTINE_UNINIT_MESSAGE_PUMP
:
106 Result
= (DWORD
)IntUninitMessagePumpHook();
109 case NOPARAM_ROUTINE_GETMESSAGEEXTRAINFO
:
110 Result
= (DWORD
)MsqGetMessageExtraInfo();
113 case NOPARAM_ROUTINE_ANYPOPUP
:
114 Result
= (DWORD
)IntAnyPopup();
117 case NOPARAM_ROUTINE_CSRSS_INITIALIZED
:
118 Result
= (DWORD
)CsrInit();
121 case NOPARAM_ROUTINE_MSQCLEARWAKEMASK
:
122 RETURN( (DWORD
)IntMsqClearWakeMask());
125 DPRINT1("Calling invalid routine number 0x%x in NtUserCallNoParam\n", Routine
);
126 SetLastWin32Error(ERROR_INVALID_PARAMETER
);
132 DPRINT("Leave NtUserCallNoParam, ret=%i\n",_ret_
);
147 DECLARE_RETURN(DWORD
);
149 DPRINT("Enter NtUserCallOneParam\n");
151 UserEnterExclusive();
155 case ONEPARAM_ROUTINE_POSTQUITMESSAGE
:
158 pti
= PsGetCurrentThreadWin32Thread();
159 MsqPostQuitMessage(pti
->MessageQueue
, Param
);
162 case ONEPARAM_ROUTINE_SHOWCURSOR
:
163 RETURN( (DWORD
)UserShowCursor((BOOL
)Param
) );
165 case ONEPARAM_ROUTINE_GETDESKTOPMAPPING
:
168 ti
= GetW32ThreadInfo();
171 /* Try convert the pointer to a user mode pointer if the desktop is
172 mapped into the process */
173 RETURN((DWORD
)DesktopHeapAddressToUser((PVOID
)Param
));
181 case ONEPARAM_ROUTINE_GETMENU
:
183 PWINDOW_OBJECT Window
;
186 if(!(Window
= UserGetWindowObject((HWND
)Param
)))
191 Result
= (DWORD
)Window
->Wnd
->IDMenu
;
196 case ONEPARAM_ROUTINE_ISWINDOWUNICODE
:
198 PWINDOW_OBJECT Window
;
201 Window
= UserGetWindowObject((HWND
)Param
);
206 Result
= Window
->Wnd
->Unicode
;
210 case ONEPARAM_ROUTINE_WINDOWFROMDC
:
211 RETURN( (DWORD
)IntWindowFromDC((HDC
)Param
));
213 case ONEPARAM_ROUTINE_SWAPMOUSEBUTTON
:
217 Result
= gspv
.bMouseBtnSwap
;
218 gspv
.bMouseBtnSwap
= Param
? TRUE
: FALSE
;
219 gpsi
->aiSysMet
[SM_SWAPBUTTON
] = gspv
.bMouseBtnSwap
;
223 case ONEPARAM_ROUTINE_SWITCHCARETSHOWING
:
224 RETURN( (DWORD
)IntSwitchCaretShowing((PVOID
)Param
));
226 case ONEPARAM_ROUTINE_SETCARETBLINKTIME
:
227 RETURN( (DWORD
)IntSetCaretBlinkTime((UINT
)Param
));
229 case ONEPARAM_ROUTINE_GETWINDOWINSTANCE
:
231 PWINDOW_OBJECT Window
;
234 if(!(Window
= UserGetWindowObject((HWND
)Param
)))
239 Result
= (DWORD
)Window
->Wnd
->hModule
;
243 case ONEPARAM_ROUTINE_SETMESSAGEEXTRAINFO
:
244 RETURN( (DWORD
)MsqSetMessageExtraInfo((LPARAM
)Param
));
246 case ONEPARAM_ROUTINE_CREATECURICONHANDLE
:
248 PCURICON_OBJECT CurIcon
;
249 PWINSTATION_OBJECT WinSta
;
251 WinSta
= IntGetWinStaObj();
257 if (!(CurIcon
= IntCreateCurIconHandle(WinSta
)))
259 SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY
);
260 ObDereferenceObject(WinSta
);
264 ObDereferenceObject(WinSta
);
265 RETURN((DWORD
)CurIcon
->Self
);
268 case ONEPARAM_ROUTINE_GETCURSORPOSITION
:
270 PWINSTATION_OBJECT WinSta
;
275 RETURN( (DWORD
)FALSE
);
276 Status
= IntValidateWindowStationHandle(PsGetCurrentProcess()->Win32WindowStation
,
280 if (!NT_SUCCESS(Status
))
281 RETURN( (DWORD
)FALSE
);
283 /* FIXME - check if process has WINSTA_READATTRIBUTES */
284 IntGetCursorLocation(WinSta
, &Pos
);
286 Status
= MmCopyToCaller((PPOINT
)Param
, &Pos
, sizeof(POINT
));
287 if(!NT_SUCCESS(Status
))
289 ObDereferenceObject(WinSta
);
290 SetLastNtError(Status
);
294 ObDereferenceObject(WinSta
);
296 RETURN( (DWORD
)TRUE
);
299 case ONEPARAM_ROUTINE_ISWINDOWINDESTROY
:
301 PWINDOW_OBJECT Window
;
304 if(!(Window
= UserGetWindowObject((HWND
)Param
)))
309 Result
= (DWORD
)IntIsWindowInDestroy(Window
);
314 case ONEPARAM_ROUTINE_ENABLEPROCWNDGHSTING
:
317 PPROCESSINFO Process
= PsGetCurrentProcessWin32Process();
321 Enable
= (BOOL
)(Param
!= 0);
325 Process
->W32PF_flags
&= ~W32PF_NOWINDOWGHOSTING
;
329 Process
->W32PF_flags
|= W32PF_NOWINDOWGHOSTING
;
338 case ONEPARAM_ROUTINE_MSQSETWAKEMASK
:
339 RETURN( (DWORD
)IntMsqSetWakeMask(Param
));
341 case ONEPARAM_ROUTINE_GETKEYBOARDTYPE
:
342 RETURN( UserGetKeyboardType(Param
));
344 case ONEPARAM_ROUTINE_GETKEYBOARDLAYOUT
:
345 RETURN( (DWORD
)UserGetKeyboardLayout(Param
));
347 case ONEPARAM_ROUTINE_RELEASEDC
:
348 RETURN (UserReleaseDC(NULL
, (HDC
) Param
, FALSE
));
350 case ONEPARAM_ROUTINE_REALIZEPALETTE
:
351 RETURN (UserRealizePalette((HDC
) Param
));
353 case ONEPARAM_ROUTINE_GETQUEUESTATUS
:
356 WORD changed_bits
, wake_bits
;
357 Ret
= IntGetQueueStatus(FALSE
);
358 changed_bits
= LOWORD(Ret
);
359 wake_bits
= HIWORD(Ret
);
360 RETURN( MAKELONG(changed_bits
& Param
, wake_bits
& Param
));
362 case ONEPARAM_ROUTINE_ENUMCLIPBOARDFORMATS
:
363 /* FIXME: Should use UserEnterShared */
364 RETURN(IntEnumClipboardFormats(Param
));
366 case ONEPARAM_ROUTINE_CSRSS_GUICHECK
:
367 IntUserManualGuiCheck(Param
);
370 case ONEPARAM_ROUTINE_GETCURSORPOS
:
374 PTHREADINFO pti
= PsGetCurrentThreadWin32Thread();
375 if (pti
->hDesktop
!= InputDesktopHandle
) RETURN(FALSE
);
378 pptl
= (PPOINTL
)Param
;
379 *pptl
= gpsi
->ptCursor
;
381 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
389 DPRINT1("Calling invalid routine number 0x%x in NtUserCallOneParam(), Param=0x%x\n",
391 SetLastWin32Error(ERROR_INVALID_PARAMETER
);
395 DPRINT("Leave NtUserCallOneParam, ret=%i\n",_ret_
);
412 PWINDOW_OBJECT Window
;
413 DECLARE_RETURN(DWORD
);
415 DPRINT("Enter NtUserCallTwoParam\n");
416 UserEnterExclusive();
420 case TWOPARAM_ROUTINE_GETWINDOWRGNBOX
:
424 Window
= UserGetWindowObject((HWND
)Param1
);
425 if (!Window
) RETURN(ERROR
);
427 Ret
= (DWORD
)IntGetWindowRgnBox(Window
, &rcRect
);
428 Status
= MmCopyToCaller((PVOID
)Param2
, &rcRect
, sizeof(RECT
));
429 if(!NT_SUCCESS(Status
))
431 SetLastNtError(Status
);
436 case TWOPARAM_ROUTINE_GETWINDOWRGN
:
438 Window
= UserGetWindowObject((HWND
)Param1
);
439 if (!Window
) RETURN(ERROR
);
441 RETURN( (DWORD
)IntGetWindowRgn(Window
, (HRGN
)Param2
));
443 case TWOPARAM_ROUTINE_SETMENUBARHEIGHT
:
446 PMENU_OBJECT MenuObject
= IntGetMenuObject((HMENU
)Param1
);
452 Ret
= (MenuObject
->MenuInfo
.Height
== (int)Param2
);
453 MenuObject
->MenuInfo
.Height
= (int)Param2
;
456 Ret
= (DWORD
)MenuObject
->MenuInfo
.Height
;
457 IntReleaseMenuObject(MenuObject
);
460 case TWOPARAM_ROUTINE_SETMENUITEMRECT
:
463 SETMENUITEMRECT smir
;
464 PMENU_OBJECT MenuObject
= IntGetMenuObject((HMENU
)Param1
);
468 if(!NT_SUCCESS(MmCopyFromCaller(&smir
, (PVOID
)Param2
, sizeof(SETMENUITEMRECT
))))
470 IntReleaseMenuObject(MenuObject
);
474 Ret
= IntSetMenuItemRect(MenuObject
, smir
.uItem
, smir
.fByPosition
, &smir
.rcRect
);
476 IntReleaseMenuObject(MenuObject
);
480 case TWOPARAM_ROUTINE_SETGUITHRDHANDLE
:
482 PUSER_MESSAGE_QUEUE MsgQueue
= ((PTHREADINFO
)PsGetCurrentThread()->Tcb
.Win32Thread
)->MessageQueue
;
485 RETURN( (DWORD
)MsqSetStateWindow(MsgQueue
, (ULONG
)Param1
, (HWND
)Param2
));
488 case TWOPARAM_ROUTINE_ENABLEWINDOW
:
492 case TWOPARAM_ROUTINE_SHOWOWNEDPOPUPS
:
494 Window
= UserGetWindowObject((HWND
)Param1
);
495 if (!Window
) RETURN(0);
497 RETURN( (DWORD
)IntShowOwnedPopups(Window
, (BOOL
) Param2
));
500 case TWOPARAM_ROUTINE_ROS_UPDATEUISTATE
:
503 Window
= UserGetWindowObject((HWND
)Param1
);
504 if (!Window
) RETURN(0);
507 wParam
= MAKEWPARAM((Param2
>> 3) & 0x3,
508 Param2
& (UISF_HIDEFOCUS
| UISF_HIDEACCEL
| UISF_ACTIVE
));
510 RETURN( UserUpdateUiState(Window
->Wnd
, wParam
) );
513 case TWOPARAM_ROUTINE_SWITCHTOTHISWINDOW
:
518 case TWOPARAM_ROUTINE_SETCARETPOS
:
519 RETURN( (DWORD
)co_IntSetCaretPos((int)Param1
, (int)Param2
));
521 case TWOPARAM_ROUTINE_REGISTERLOGONPROC
:
522 RETURN( (DWORD
)co_IntRegisterLogonProcess((HANDLE
)Param1
, (BOOL
)Param2
));
524 case TWOPARAM_ROUTINE_ROS_REGSYSCLASSES
:
527 DWORD Count
= Param1
;
528 PREGISTER_SYSCLASS RegSysClassArray
= (PREGISTER_SYSCLASS
)Param2
;
530 if (Count
!= 0 && RegSysClassArray
!= NULL
)
534 ProbeArrayForRead(RegSysClassArray
,
535 sizeof(RegSysClassArray
[0]),
539 Ret
= (DWORD
)UserRegisterSystemClasses(Count
,
542 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
544 SetLastNtError(_SEH2_GetExceptionCode());
552 DPRINT1("Calling invalid routine number 0x%x in NtUserCallTwoParam(), Param1=0x%x Parm2=0x%x\n",
553 Routine
, Param1
, Param2
);
554 SetLastWin32Error(ERROR_INVALID_PARAMETER
);
558 DPRINT("Leave NtUserCallTwoParam, ret=%i\n",_ret_
);
574 PWINDOW_OBJECT Window
;
576 USER_REFERENCE_ENTRY Ref
;
577 DECLARE_RETURN(BOOLEAN
);
579 DPRINT("Enter NtUserCallHwndLock\n");
580 UserEnterExclusive();
582 if (!(Window
= UserGetWindowObject(hWnd
)) || !Window
->Wnd
)
586 UserRefObjectCo(Window
, &Ref
);
590 /* FIXME: Routine can be 0x53 - 0x5E */
593 case HWNDLOCK_ROUTINE_ARRANGEICONICWINDOWS
:
594 co_WinPosArrangeIconicWindows(Window
);
597 case HWNDLOCK_ROUTINE_DRAWMENUBAR
:
600 DPRINT("HWNDLOCK_ROUTINE_DRAWMENUBAR\n");
602 if (!((Wnd
->style
& (WS_CHILD
| WS_POPUP
)) != WS_CHILD
))
605 if(!(Menu
= UserGetMenuObject((HMENU
) Wnd
->IDMenu
)))
608 Menu
->MenuInfo
.WndOwner
= hWnd
;
609 Menu
->MenuInfo
.Height
= 0;
611 co_WinPosSetWindowPos( Window
,
624 case HWNDLOCK_ROUTINE_REDRAWFRAME
:
625 co_WinPosSetWindowPos( Window
,
636 case HWNDLOCK_ROUTINE_REDRAWFRAMEANDHOOK
:
637 co_WinPosSetWindowPos( Window
,
645 if (!IntGetOwner(Window
) && !IntGetParent(Window
))
647 co_IntShellHookNotify(HSHELL_REDRAW
, (LPARAM
) hWnd
);
652 case HWNDLOCK_ROUTINE_SETFOREGROUNDWINDOW
:
653 Ret
= co_IntSetForegroundWindow(Window
);
656 case HWNDLOCK_ROUTINE_UPDATEWINDOW
:
657 Ret
= co_UserRedrawWindow( Window
, NULL
, 0, RDW_UPDATENOW
| RDW_ALLCHILDREN
);
661 UserDerefObjectCo(Window
);
666 DPRINT("Leave NtUserCallHwndLock, ret=%i\n",_ret_
);
682 case HWNDOPT_ROUTINE_SETPROGMANWINDOW
:
683 GetW32ThreadInfo()->pDeskInfo
->hProgmanWindow
= hWnd
;
686 case HWNDOPT_ROUTINE_SETTASKMANWINDOW
:
687 GetW32ThreadInfo()->pDeskInfo
->hTaskManWindow
= hWnd
;
702 case HWND_ROUTINE_GETWNDCONTEXTHLPID
:
704 PWINDOW_OBJECT Window
;
706 USER_REFERENCE_ENTRY Ref
;
708 UserEnterExclusive();
710 if (!(Window
= UserGetWindowObject(hWnd
)) || !Window
->Wnd
)
715 UserRefObjectCo(Window
, &Ref
);
717 HelpId
= IntGetProp(Window
, gpsi
->atomContextHelpIdProp
);
719 UserDerefObjectCo(Window
);
721 return (DWORD
)HelpId
;
723 case HWND_ROUTINE_REGISTERSHELLHOOKWINDOW
:
724 if (IntIsWindow(hWnd
))
725 return IntRegisterShellHookWindow(hWnd
);
728 case HWND_ROUTINE_DEREGISTERSHELLHOOKWINDOW
:
729 if (IntIsWindow(hWnd
))
730 return IntDeRegisterShellHookWindow(hWnd
);
748 case HWNDPARAM_ROUTINE_KILLSYSTEMTIMER
:
749 return IntKillTimer(hWnd
, (UINT_PTR
)Param
, TRUE
);
751 case HWNDPARAM_ROUTINE_SETWNDCONTEXTHLPID
:
753 PWINDOW_OBJECT Window
;
755 UserEnterExclusive();
756 if(!(Window
= UserGetWindowObject(hWnd
)))
763 IntSetProp(Window
, gpsi
->atomContextHelpIdProp
, (HANDLE
)Param
);
765 IntRemoveProp(Window
, gpsi
->atomContextHelpIdProp
);
771 case HWNDPARAM_ROUTINE_SETDIALOGPOINTER
:
773 PWINDOW_OBJECT Window
;
775 USER_REFERENCE_ENTRY Ref
;
777 UserEnterExclusive();
779 if (!(Window
= UserGetWindowObject(hWnd
)) || !Window
->Wnd
)
784 UserRefObjectCo(Window
, &Ref
);
787 if (pWnd
->head
.pti
->ppi
== PsGetCurrentProcessWin32Process() &&
788 pWnd
->cbwndExtra
== DLGWINDOWEXTRA
&&
789 !(pWnd
->state
& WNDS_SERVERSIDEWINDOWPROC
))
793 if (!pWnd
->fnid
) pWnd
->fnid
= FNID_DIALOG
;
794 pWnd
->state
|= WNDS_DIALOGWINDOW
;
798 pWnd
->fnid
|= FNID_DESTROY
;
799 pWnd
->state
&= ~WNDS_DIALOGWINDOW
;
803 UserDerefObjectCo(Window
);
816 NtUserCallHwndParamLock(