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 PW32PROCESS 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
= (PW32PROCESS
)Process
->Win32Process
;
48 /* Deregister the logon process */
49 if (LogonProcess
!= (PW32PROCESS
)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_ANYPOPUP
:
114 Result
= (DWORD_PTR
)IntAnyPopup();
117 case NOPARAM_ROUTINE_CSRSS_INITIALIZED
:
118 Result
= (DWORD_PTR
)CsrInit();
121 case NOPARAM_ROUTINE_MSQCLEARWAKEMASK
:
122 RETURN( (DWORD_PTR
)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_PTR
);
149 DPRINT("Enter NtUserCallOneParam\n");
151 UserEnterExclusive();
155 case ONEPARAM_ROUTINE_SHOWCURSOR
:
156 RETURN( (DWORD_PTR
)UserShowCursor((BOOL
)Param
) );
158 case ONEPARAM_ROUTINE_GETDESKTOPMAPPING
:
161 ti
= GetW32ThreadInfo();
164 /* Try convert the pointer to a user mode pointer if the desktop is
165 mapped into the process */
166 RETURN((DWORD_PTR
)DesktopHeapAddressToUser((PVOID
)Param
));
174 case ONEPARAM_ROUTINE_GETMENU
:
176 PWINDOW_OBJECT Window
;
179 if(!(Window
= UserGetWindowObject((HWND
)Param
)))
184 Result
= Window
->Wnd
->IDMenu
;
189 case ONEPARAM_ROUTINE_ISWINDOWUNICODE
:
191 PWINDOW_OBJECT Window
;
194 Window
= UserGetWindowObject((HWND
)Param
);
199 Result
= Window
->Wnd
->Unicode
;
203 case ONEPARAM_ROUTINE_WINDOWFROMDC
:
204 RETURN( (DWORD_PTR
)IntWindowFromDC((HDC
)Param
));
206 case ONEPARAM_ROUTINE_GETWNDCONTEXTHLPID
:
208 PWINDOW_OBJECT Window
;
211 Window
= UserGetWindowObject((HWND
)Param
);
217 Result
= Window
->Wnd
->ContextHelpId
;
222 case ONEPARAM_ROUTINE_SWAPMOUSEBUTTON
:
224 PWINSTATION_OBJECT WinSta
;
228 Status
= IntValidateWindowStationHandle(PsGetCurrentProcess()->Win32WindowStation
,
232 if (!NT_SUCCESS(Status
))
233 RETURN( (DWORD_PTR
)FALSE
);
236 Result = (DWORD_PTR)IntSwapMouseButton(WinStaObject, (BOOL)Param); */
239 ObDereferenceObject(WinSta
);
243 case ONEPARAM_ROUTINE_SWITCHCARETSHOWING
:
244 RETURN( (DWORD_PTR
)IntSwitchCaretShowing((PVOID
)Param
));
246 case ONEPARAM_ROUTINE_SETCARETBLINKTIME
:
247 RETURN( (DWORD_PTR
)IntSetCaretBlinkTime((UINT
)Param
));
249 case ONEPARAM_ROUTINE_GETWINDOWINSTANCE
:
251 PWINDOW_OBJECT Window
;
254 if(!(Window
= UserGetWindowObject((HWND
)Param
)))
259 Result
= (DWORD_PTR
)Window
->Wnd
->Instance
;
263 case ONEPARAM_ROUTINE_SETMESSAGEEXTRAINFO
:
264 RETURN( (DWORD_PTR
)MsqSetMessageExtraInfo((LPARAM
)Param
));
266 case ONEPARAM_ROUTINE_CREATECURICONHANDLE
:
268 PCURICON_OBJECT CurIcon
;
269 PWINSTATION_OBJECT WinSta
;
271 WinSta
= IntGetWinStaObj();
277 if (!(CurIcon
= IntCreateCurIconHandle(WinSta
)))
279 SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY
);
280 ObDereferenceObject(WinSta
);
284 ObDereferenceObject(WinSta
);
285 RETURN((DWORD_PTR
)CurIcon
->Self
);
288 case ONEPARAM_ROUTINE_GETCURSORPOSITION
:
290 PWINSTATION_OBJECT WinSta
;
295 RETURN( (DWORD_PTR
)FALSE
);
296 Status
= IntValidateWindowStationHandle(PsGetCurrentProcess()->Win32WindowStation
,
300 if (!NT_SUCCESS(Status
))
301 RETURN( (DWORD_PTR
)FALSE
);
303 /* FIXME - check if process has WINSTA_READATTRIBUTES */
304 IntGetCursorLocation(WinSta
, &Pos
);
306 Status
= MmCopyToCaller((PPOINT
)Param
, &Pos
, sizeof(POINT
));
307 if(!NT_SUCCESS(Status
))
309 ObDereferenceObject(WinSta
);
310 SetLastNtError(Status
);
314 ObDereferenceObject(WinSta
);
316 RETURN( (DWORD_PTR
)TRUE
);
319 case ONEPARAM_ROUTINE_ISWINDOWINDESTROY
:
321 PWINDOW_OBJECT Window
;
324 if(!(Window
= UserGetWindowObject((HWND
)Param
)))
329 Result
= (DWORD_PTR
)IntIsWindowInDestroy(Window
);
334 case ONEPARAM_ROUTINE_ENABLEPROCWNDGHSTING
:
337 PW32PROCESS Process
= PsGetCurrentProcessWin32Process();
341 Enable
= (BOOL
)(Param
!= 0);
345 Process
->W32PF_flags
&= ~W32PF_NOWINDOWGHOSTING
;
349 Process
->W32PF_flags
|= W32PF_NOWINDOWGHOSTING
;
358 case ONEPARAM_ROUTINE_MSQSETWAKEMASK
:
359 RETURN( (DWORD_PTR
)IntMsqSetWakeMask(Param
));
361 case ONEPARAM_ROUTINE_GETKEYBOARDTYPE
:
362 RETURN( UserGetKeyboardType(Param
));
364 case ONEPARAM_ROUTINE_GETKEYBOARDLAYOUT
:
365 RETURN( (DWORD_PTR
)UserGetKeyboardLayout(Param
));
367 case ONEPARAM_ROUTINE_REGISTERUSERMODULE
:
371 ti
= GetW32ThreadInfo();
374 DPRINT1("Cannot register user32 module instance!\n");
375 SetLastWin32Error(ERROR_INVALID_PARAMETER
);
379 if (InterlockedCompareExchangePointer(&ti
->ppi
->hModUser
,
386 case ONEPARAM_ROUTINE_RELEASEDC
:
387 RETURN (UserReleaseDC(NULL
, (HDC
) Param
, FALSE
));
389 case ONEPARAM_ROUTINE_REALIZEPALETTE
:
390 RETURN (UserRealizePalette((HDC
) Param
));
392 case ONEPARAM_ROUTINE_GETQUEUESTATUS
:
393 RETURN (IntGetQueueStatus((BOOL
) Param
));
395 case ONEPARAM_ROUTINE_ENUMCLIPBOARDFORMATS
:
396 /* FIXME: Should use UserEnterShared */
397 RETURN(IntEnumClipboardFormats(Param
));
399 case ONEPARAM_ROUTINE_CSRSS_GUICHECK
:
400 IntUserManualGuiCheck(Param
);
403 case ONEPARAM_ROUTINE_GETCURSORPOS
:
407 PTHREADINFO pti
= PsGetCurrentThreadWin32Thread();
408 if (pti
->hDesktop
!= InputDesktopHandle
) RETURN(FALSE
);
411 pptl
= (PPOINTL
)Param
;
412 *pptl
= gpsi
->ptCursor
;
414 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
422 DPRINT1("Calling invalid routine number 0x%x in NtUserCallOneParam(), Param=0x%x\n",
424 SetLastWin32Error(ERROR_INVALID_PARAMETER
);
428 DPRINT("Leave NtUserCallOneParam, ret=%i\n",_ret_
);
445 PWINDOW_OBJECT Window
;
446 DECLARE_RETURN(DWORD_PTR
);
448 DPRINT("Enter NtUserCallTwoParam\n");
449 UserEnterExclusive();
453 case TWOPARAM_ROUTINE_GETWINDOWRGNBOX
:
457 Window
= UserGetWindowObject((HWND
)Param1
);
458 if (!Window
) RETURN(ERROR
);
460 Ret
= (DWORD_PTR
)IntGetWindowRgnBox(Window
, &rcRect
);
461 Status
= MmCopyToCaller((PVOID
)Param2
, &rcRect
, sizeof(RECT
));
462 if(!NT_SUCCESS(Status
))
464 SetLastNtError(Status
);
469 case TWOPARAM_ROUTINE_GETWINDOWRGN
:
471 Window
= UserGetWindowObject((HWND
)Param1
);
472 if (!Window
) RETURN(ERROR
);
474 RETURN( (DWORD_PTR
)IntGetWindowRgn(Window
, (HRGN
)Param2
));
476 case TWOPARAM_ROUTINE_SETMENUBARHEIGHT
:
479 PMENU_OBJECT MenuObject
= IntGetMenuObject((HMENU
)Param1
);
485 Ret
= (MenuObject
->MenuInfo
.Height
== (int)Param2
);
486 MenuObject
->MenuInfo
.Height
= (int)Param2
;
489 Ret
= (DWORD_PTR
)MenuObject
->MenuInfo
.Height
;
490 IntReleaseMenuObject(MenuObject
);
493 case TWOPARAM_ROUTINE_SETMENUITEMRECT
:
496 SETMENUITEMRECT smir
;
497 PMENU_OBJECT MenuObject
= IntGetMenuObject((HMENU
)Param1
);
501 if(!NT_SUCCESS(MmCopyFromCaller(&smir
, (PVOID
)Param2
, sizeof(SETMENUITEMRECT
))))
503 IntReleaseMenuObject(MenuObject
);
507 Ret
= IntSetMenuItemRect(MenuObject
, smir
.uItem
, smir
.fByPosition
, &smir
.rcRect
);
509 IntReleaseMenuObject(MenuObject
);
510 RETURN( (DWORD_PTR
)Ret
);
513 case TWOPARAM_ROUTINE_SETGUITHRDHANDLE
:
515 PUSER_MESSAGE_QUEUE MsgQueue
= ((PTHREADINFO
)PsGetCurrentThread()->Tcb
.Win32Thread
)->MessageQueue
;
518 RETURN( (DWORD_PTR
)MsqSetStateWindow(MsgQueue
, (ULONG
)Param1
, (HWND
)Param2
));
521 case TWOPARAM_ROUTINE_ENABLEWINDOW
:
525 case TWOPARAM_ROUTINE_SHOWOWNEDPOPUPS
:
527 Window
= UserGetWindowObject((HWND
)Param1
);
528 if (!Window
) RETURN(0);
530 RETURN( (DWORD_PTR
)IntShowOwnedPopups(Window
, (BOOL
) Param2
));
533 case TWOPARAM_ROUTINE_ROS_UPDATEUISTATE
:
536 Window
= UserGetWindowObject((HWND
)Param1
);
537 if (!Window
) RETURN(0);
540 wParam
= MAKEWPARAM((Param2
>> 3) & 0x3,
541 Param2
& (UISF_HIDEFOCUS
| UISF_HIDEACCEL
| UISF_ACTIVE
));
543 RETURN( UserUpdateUiState(Window
->Wnd
, wParam
) );
546 case TWOPARAM_ROUTINE_SWITCHTOTHISWINDOW
:
550 case TWOPARAM_ROUTINE_SETWNDCONTEXTHLPID
:
552 if(!(Window
= UserGetWindowObject((HWND
)Param1
)))
554 RETURN( (DWORD_PTR
)FALSE
);
557 Window
->Wnd
->ContextHelpId
= Param2
;
559 RETURN( (DWORD_PTR
)TRUE
);
561 case TWOPARAM_ROUTINE_SETCARETPOS
:
562 RETURN( (DWORD_PTR
)co_IntSetCaretPos((int)Param1
, (int)Param2
));
564 case TWOPARAM_ROUTINE_GETWINDOWINFO
:
569 if(!(Window
= UserGetWindowObject((HWND
)Param1
)))
576 * According to WINE, Windows' doesn't check the cbSize field
579 Status
= MmCopyFromCaller(&wi
.cbSize
, (PVOID
)Param2
, sizeof(wi
.cbSize
));
580 if(!NT_SUCCESS(Status
))
582 SetLastNtError(Status
);
586 if(wi
.cbSize
!= sizeof(WINDOWINFO
))
588 SetLastWin32Error(ERROR_INVALID_PARAMETER
);
593 if((Ret
= (DWORD_PTR
)IntGetWindowInfo(Window
, &wi
)))
595 Status
= MmCopyToCaller((PVOID
)Param2
, &wi
, sizeof(WINDOWINFO
));
596 if(!NT_SUCCESS(Status
))
598 SetLastNtError(Status
);
606 case TWOPARAM_ROUTINE_REGISTERLOGONPROC
:
607 RETURN( (DWORD_PTR
)co_IntRegisterLogonProcess((HANDLE
)Param1
, (BOOL
)Param2
));
609 case TWOPARAM_ROUTINE_GETSYSCOLORBRUSHES
:
610 case TWOPARAM_ROUTINE_GETSYSCOLORPENS
:
611 case TWOPARAM_ROUTINE_GETSYSCOLORS
:
622 /* FIXME - we should make use of SEH here... */
624 Buffer
.Pointer
= ExAllocatePool(PagedPool
, Param2
* sizeof(HANDLE
));
625 if(Buffer
.Pointer
!= NULL
)
629 case TWOPARAM_ROUTINE_GETSYSCOLORBRUSHES
:
630 Ret
= (DWORD_PTR
)IntGetSysColorBrushes(Buffer
.Brushes
, (UINT
)Param2
);
632 case TWOPARAM_ROUTINE_GETSYSCOLORPENS
:
633 Ret
= (DWORD_PTR
)IntGetSysColorPens(Buffer
.Pens
, (UINT
)Param2
);
635 case TWOPARAM_ROUTINE_GETSYSCOLORS
:
636 Ret
= (DWORD_PTR
)IntGetSysColors(Buffer
.Colors
, (UINT
)Param2
);
645 Status
= MmCopyToCaller((PVOID
)Param1
, Buffer
.Pointer
, Param2
* sizeof(HANDLE
));
646 if(!NT_SUCCESS(Status
))
648 SetLastNtError(Status
);
653 ExFreePool(Buffer
.Pointer
);
658 case TWOPARAM_ROUTINE_ROS_REGSYSCLASSES
:
661 DWORD Count
= Param1
;
662 PREGISTER_SYSCLASS RegSysClassArray
= (PREGISTER_SYSCLASS
)Param2
;
664 if (Count
!= 0 && RegSysClassArray
!= NULL
)
668 ProbeArrayForRead(RegSysClassArray
,
669 sizeof(RegSysClassArray
[0]),
673 Ret
= (DWORD_PTR
)UserRegisterSystemClasses(Count
,
676 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
678 SetLastNtError(_SEH2_GetExceptionCode());
686 DPRINT1("Calling invalid routine number 0x%x in NtUserCallTwoParam(), Param1=0x%x Parm2=0x%x\n",
687 Routine
, Param1
, Param2
);
688 SetLastWin32Error(ERROR_INVALID_PARAMETER
);
692 DPRINT("Leave NtUserCallTwoParam, ret=%i\n",_ret_
);
708 PWINDOW_OBJECT Window
;
710 USER_REFERENCE_ENTRY Ref
;
711 DECLARE_RETURN(BOOLEAN
);
713 DPRINT("Enter NtUserCallHwndLock\n");
714 UserEnterExclusive();
716 if (!(Window
= UserGetWindowObject(hWnd
)) || !Window
->Wnd
)
720 UserRefObjectCo(Window
, &Ref
);
724 /* FIXME: Routine can be 0x53 - 0x5E */
727 case HWNDLOCK_ROUTINE_ARRANGEICONICWINDOWS
:
728 co_WinPosArrangeIconicWindows(Window
);
731 case HWNDLOCK_ROUTINE_DRAWMENUBAR
:
734 DPRINT("HWNDLOCK_ROUTINE_DRAWMENUBAR\n");
736 if (!((Wnd
->Style
& (WS_CHILD
| WS_POPUP
)) != WS_CHILD
))
739 if(!(Menu
= UserGetMenuObject((HMENU
) Wnd
->IDMenu
)))
742 Menu
->MenuInfo
.WndOwner
= hWnd
;
743 Menu
->MenuInfo
.Height
= 0;
745 co_WinPosSetWindowPos( Window
,
758 case HWNDLOCK_ROUTINE_REDRAWFRAME
:
759 co_WinPosSetWindowPos( Window
,
770 case HWNDLOCK_ROUTINE_REDRAWFRAMEANDHOOK
:
771 co_WinPosSetWindowPos( Window
,
779 if (!IntGetOwner(Window
) && !IntGetParent(Window
))
781 co_IntShellHookNotify(HSHELL_REDRAW
, (LPARAM
) hWnd
);
786 case HWNDLOCK_ROUTINE_SETFOREGROUNDWINDOW
:
787 Ret
= co_IntSetForegroundWindow(Window
);
790 case HWNDLOCK_ROUTINE_UPDATEWINDOW
:
791 Ret
= co_UserRedrawWindow( Window
, NULL
, 0, RDW_UPDATENOW
| RDW_ALLCHILDREN
);
795 UserDerefObjectCo(Window
);
800 DPRINT("Leave NtUserCallHwndLock, ret=%i\n",_ret_
);
816 case HWNDOPT_ROUTINE_SETPROGMANWINDOW
:
817 GetW32ThreadInfo()->pDeskInfo
->hProgmanWindow
= hWnd
;
820 case HWNDOPT_ROUTINE_SETTASKMANWINDOW
:
821 GetW32ThreadInfo()->pDeskInfo
->hTaskManWindow
= hWnd
;
836 case HWND_ROUTINE_REGISTERSHELLHOOKWINDOW
:
837 if (IntIsWindow(hWnd
))
838 return IntRegisterShellHookWindow(hWnd
);
841 case HWND_ROUTINE_DEREGISTERSHELLHOOKWINDOW
:
842 if (IntIsWindow(hWnd
))
843 return IntDeRegisterShellHookWindow(hWnd
);
861 case HWNDPARAM_ROUTINE_KILLSYSTEMTIMER
:
862 return IntKillTimer(hWnd
, (UINT_PTR
)Param
, TRUE
);
872 NtUserCallHwndParamLock(